世界を動かす技術を、日本語で。

RustによるパラメトリックCAD

概要

vcad は、Rustで記述できるパラメトリックCADライブラリ プリミティブ、ブーリアン演算、トランスフォーム を組み合わせて部品設計 型安全性とバージョン管理 による再現性と修正性の向上 マルチマテリアル・エクスポート やAIエージェントとの連携も想定 GUIのクリック作業から脱却し、 コードで設計 する新しいワークフロー

vcad: Rustで書くパラメトリックCAD

  • 毎回同じ作業 を繰り返すGUI CADツールからの脱却
  • Rust で部品形状を記述し、 型安全性・バージョン管理 ・パラメトリック設計を実現
  • 数値を一つ変えるだけ で全体を再生成できる設計フロー

基本の使い方

  • プリミティブ形状 (cube, cylinderなど)を生成
  • ブーリアン演算 (+は和集合、-は差集合、&は積集合)で形状を合成
  • 例: プレートに中心穴とボルトパターンを開ける
    • let plate = centered_cube("plate", 120.0, 80.0, 5.0);
    • let bore = centered_cylinder("bore", 15.0, 10.0, 64);
    • let bolts = bolt_pattern(6, 50.0, 4.5, 10.0, 32);
    • let part = plate - bore - bolts;
    • part.write_stl("plate.stl").unwrap();

APIの特徴

  • APIは意図的に小規模 :プリミティブ、ブーリアン、トランスフォーム、パターンのみ
  • 組み合わせにより複雑な部品も記述可能
    • L字ブラケット
    • フランジ付きハブ
    • 放射状ベンチレーションパターン

パラメトリック設計

  • 全ての部品がパラメトリック
  • ボルト数や半径、厚みなど 数値一つで全体が変化
  • 手作業のやり直し不要、再コンパイルのみ

マルチマテリアル・エクスポート

  • STL出力 だけでなく、 glTFシーン もエクスポート可能

  • TOMLでマテリアル定義 し、PBRマテリアルを設定

    • Materials::parseで色や金属度、粗さを設定
    • Scene::addで複数部品を統合
    • export_scene_glbでGLBファイル出力
  • CSGだけでマスコットキャラも作成可能

    • 8種のマテリアル、17部品、1つのGLBファイル

Rust採用の理由

  • manifoldエンジン によるウォータタイトメッシュ生成保証

  • C++コアのラッパー としてRustバインディングを利用

  • ゼロコスト抽象化、ガーベジコレクション無し、型安全性

  • cargo test/cargo clippy による自動テスト・静的解析

  • 型による誤用防止 (半径と直径の取り違え等)

  • CADファイルもコードで管理

    • コードならテスト・レビュー・差分・CIが可能
    • STLファイルは単なるバイト列

AIエージェント対応

  • AIコーディングエージェント による自動設計・エクスポートを想定

  • READMEに全API表、レシピ集、Blender MCP連携 解説あり

  • エージェントが生成・エクスポート・Blenderインポート・レンダリングまで自動化可能

  • Claude による自動レンダリング事例

  • フィードバックループ

    • 部品を記述 → コード生成 → メッシュ出力 → プレビュー → 反復設計
    • 全てターミナル上で完結

vcadを試すには

  • cargo add vcad で導入
  • ドキュメント: docs.rs/vcad
  • ソース: github.com/ecto/vcad
  • サイト: vcad.io
  • MITライセンス、バージョン0.1
  • 今後の予定:フィレット、面取り、ねじ、Web GUIなど
  • コアは既に堅牢 :プリミティブ・ブーリアン・トランスフォーム・エクスポート
  • クリック作業から脱却し、コードで設計 する新時代のCAD体験

Hackerたちの意見

既に2020年から静かに開発が進んでいるRustでのCADプロジェクト、Fornjotがあることに注意してね: https://www.fornjot.app/

あと、Truckもね https://github.com/ricosjp/truck

FornjotもTruckも、一般的な使用にはまだ準備が整ってないよ、BREP CADカーネルとしてはね。

これ、すごくFidget(https://github.com/mkeeter/fidget)やlibfive(https://github.com/libfive/libfive)に似てるね!マット・キータの素晴らしい作品だよ!

これには出会ったことがなかった、ありがとう!

数年前にKeeterのAntimonyで遊ぶのがめっちゃ楽しかったけど、残念ながらほとんど放置されちゃったね。libfiveが次世代らしいけど、まだ試してないんだ。比較するとどうなのか知ってる?

最初の段落はかなり示唆に富んでるね。著者は市場にあるプロレベルのパラメトリックCADプログラムを理解してないみたい。>「ロボットのために物理的なパーツをデザインし続けてる。モーターマウント、センサーブラケット、ホイールハブ。毎回、ワークフローは同じ:GUI CADプログラムを開いて、1時間くらいクリックして、STLをエクスポートして、ボルトパターンが2mmずれてることに気づいて、また繰り返す。これ、意味がないよね。ボルトパターンが2mmずれてるって気づいたら、その寸法を編集してCADプログラムに再計算させればいいだけ。もう1時間もクリックする必要なんてないんだ。これが、Blenderでモデリングするのとは違う、制約ベースのパラメトリックモデリングの魅力だよ。著者のプログラムは、Publisherの代わりにvimを書くようなもので、全く別の問題を解決してる。しかも、このコードをモデルとして扱うパラダイムはすでに存在する:OpenSCAD」

その通り、全然勉強不足だよ!プルリクエスト大歓迎! :)

批判する前にちょっと読んでみて:>「私が気にしていることの一つは、ほとんどのCADツールが気にしていないこと:vcadはAIコーディングエージェントが使うために設計されている。」

制約ベースのパラメトリックモデリングの魅力って、Blenderでのモデリングとは全然違うよね。私も同じこと考えてた。これって、3DモデリングをCADに近づけるAPIみたいだけど、CADが制約やパラメトリゼーション、もっと色々なことを含んでるってことに気づいてない感じ。

OpenSCADが好きなら、https://modelrift.com をチェックしてみて。これはOpenSCADのブラウザベースのIDEで、LLMを使って.scadを生成し、3Dモデルビューアで即座に.stlの3Dモデル結果を表示してくれるよ。AIモデルはまだOpenSCADには向いてないから、modelriftの便利な機能は「スクリーンショットを使った」反復作業で、人間が視覚的な問題を注釈してAIアシスタントに戻して修正させることができるんだ。すべてホットキーショートカットを使ってね。

これのいいところは、プログラム的なCADができることで、ユーザーの入力に基づいて.stlファイルをダウンロードできるウェブアプリケーションとかが作れることだね。週末にちょっと遊ぶ時間ができるといいな。ちなみに、Microcad(https://microcad.xyz/)で数回週末を過ごしたんだけど、すごく面白かったし、Rustっぽい感じがあったよ。ただ、どうしても3Dエリプスの作り方が分からなかったんだよね。

ここにbuild123dでの楕円体の例があるよ。球の幾何変換を使ってる: from build123d import * mat = Matrix([[2,0,0,0],[0,1.5,0,0],[0,0,0.5,0]]) ellipsoid = Sphere(100).transform_geometry(mat) ちなみに、build123dはOCP.wasmのおかげでブラウザでも動くようになったよ。サンプルプレイグラウンドはこちら https://jojain.github.io/build123d-sandbox/

興味がある人は、EngineeringSketchPad(https://acdl.mit.edu/ESP/)を試してみて。これ、すごく似てるけど、もっと成熟してるよ。シンプルな幾何学的プリミティブやブーリアン演算もスクリプト言語でサポートしてるし、一般的な有理曲線やサーフェス(BREP)も扱える。微分や特定のアプリケーション向けのビュー(構造解析とCFDの違いとか)にも対応してるし、水密性や正確性にも気を使ってる。

証明書が切れちゃったから、モバイルSafariが見せてくれないんだ。 :(

一つの数字を変えるだけで全てを再生成できるって、まさに私がSolidworks(や似たようなパラメトリックCADソフト)を使う時のやり方だよ。ちょっとした規律が必要だけど、全てのジオメトリや関係性をスケッチや方程式から導き出すのが鍵なんだ。そうすれば、値(スケッチの寸法やグローバル定数)を変えて、再構築ボタンを押せば、全部がかなり信頼性高く再生成される。誤解しないでほしいけど、これは素晴らしいプロジェクトで、こういう努力やOpenSCADみたいなのがパラメトリックCADの選択肢を増やしていくのを見るのが好きなんだ。でも、クリエイティブなデザイン作業にはグラフィカルインターフェースがすごく自然だと思う。実際、時々VRで自分のデザインに入り込んで、3次元で頂点をつかんで動かせたらいいのにって思うこともあるよ(例えば、非平面スプラインを微調整する時とか)。

同意だね。あの「プログラム的CAD」スレッドから学んだのは、コードが好きな人が結構いるってこと。彼らはシンプルなパーツしか作らないから、特に問題にはならないみたい。著者が言ってるように、「ファームウェアを書くみたいにパーツを書きたかった。Rustで。型を使って。バージョン管理もして。」

でも、クリエイティブなデザイン作業にはグラフィカルインターフェースがすごく自然だと思う。実際、VRの中に入ってデザインを直接触って、頂点を3次元で動かせたらいいなって思うこともある。そうだね、「しっくりくる」感覚とコードを組み合わせて作業するのは本当に難しい。たとえ反復ループがすごくタイトでも(「コードをちょっと変えて > 結果を見る」)、クリックしてドラッグするのに比べたらまだ緩い感じがする。精神的な負担がずっと少ない気がする。VRのおかげで環境アートは本当に変わったし、すごく楽になったと思う。たぶん、視点の問題が大きいんだろうね。コントローラーで調整してドラッグするのは素晴らしいけど、得られる視点は本当に比べ物にならないし、正確にやるのがずっと簡単になる。もっとツールが成熟するのが待ち遠しいな。

似たようなことをGUIの中でやろうとしてるんだけど - https://lilicad.com/ まだすごく基本的な状態だよ。それに100%雰囲気でコーディングしてるから、思ったほど堅牢じゃないんだ。

ゲーム用のパラメトリックもできるよ。コードやデータを使ってシーン全体を構築するのは、地図上の任意のポイント間の移動時間(バランス)みたいな複雑な問題を調整する時にすごく生産的だよ。パラメトリックは[LLM]の自動化をずっと実現しやすくするし、部分的なシーンツールを使うんじゃなくてエディターAPIを使うからね。1000行のC#は、GetObjectやSetComponentPropertyみたいな呼び出しのバケツよりもずっと多くのことができるよ。これによって、照明システムや材料、物理などの非幾何学的な問題に対しても、より深い統合と反復が可能になるんだ。

これに付け加えると、OpenSCADのような構成的固体幾何学システムは、G2フィレットやG2連続性のようなサーフェス関連のことをほとんどできないみたいだね(もっと高度なスプラインやパッチの作業はなおさら)。これは部分的にはポジティブフィードバックループだと思う。「ハッカー」ツール(OpenSCAD)が美的感覚(ブロック状の角や四角いブラケット、投稿のように)に影響を与え、それがまたツールに影響を与える。シンプルなフィレットや面取りを構成幾何学でやるのが面倒な作業になってしまうと、マウスクリック5回でできるようなことが減ってしまう。機械的や製造的に意味がある場合でも、フィレットや面取り、流れるようなサーフェスが少なくなるんだ。でもそれが「見た目」になって、人々はフィレットのことを考えなくなるんだよね。

"クリエイティブなデザイン作業をするにはグラフィカルインターフェースがとても自然だと思う" そう思う!正しい答えは一つじゃないと思う。人それぞれのワークフローや要件が違うからね。今、CADのルネッサンスを迎えているみたいで素晴らしい!新しい有望な会社や無料ツールがたくさん出てきてる。個人的にはデータの安定性と視覚的なアクセシビリティを優先したい。これがユーザーに直感的で使いやすいクリエイティブな作業空間を提供するから。だから、自分のモデラーをサイドプロジェクトとして始めたんだ: https://github.com/AdaShape/adashape-open-testing/releases/t... データモデルは完全に不変で、適切なモデルのブランチを作成できるようになる予定。今のところ、ユーザーには超堅牢なアンドゥ機能と保存不要(モデルはディスクに持続的にストリーミングされる)しか提供できてないけど、最終的には視覚的で堅牢な作業台にしたいんだ。速く反復できて、気が向いたときにバージョンを保存できるようにね。(TrimbleでSketchUpを含むさまざまなCAD製品に10年間携わってきたから、ある程度は分かってるけど、まだまだ初期段階だよ)

openscadのアイデアやこれ、他の多くの代替案がすごく好きなんだけど、これとこれの寸法を持つ形を言うと、次の形はどこかにくっつくべきだよね。それから、「外側のエッジを全て面取りして」って言いたいんだけど、どのプログラムでも、結局は自分のコードで計算し直して、形がどこに行くかを計算しなきゃいけない。面取りに関しては、もう諦めちゃった…

Build123dでは面取りができるよ。最初の形から位置を選んで相対的な配置もできるし、やり方はいろいろあるよ。

外側のエッジをすべて面取りする FreeCADでもできるよ。使ったことのある商用のパラメトリックCADプログラムも全部できるし、その中には使える無料プランがあるのもあるよ(PTC OnShape、Siemens Solid Edge、Autodesk Fusionなど)。

BOSL2はOpenSCADと一緒に使うのにいいライブラリだよ。面取りや丸みのパラメータを持つ基本的な形状関数がたくさんある。ただ、数学はなくならないけどね。

この投稿のすべてのレンダリングはその方法で作成された。Claudeはvcadでジオメトリを生成し、各STL/GLBをMCP経由でBlenderにインポートして、スタジオライティングを設定し、PNGにレンダリングした。人間はBlenderに触れていない。このやり方はちょっと無駄に思える。Blenderを操作するのにLLMが必要なの?普通のコードで自動化できるんじゃない?それに、かなりの電力を節約できるはずだし…。

誰もBRL-CADについて言及してないのが驚き。これがまさにBRL-CADのやり方だよ! https://brlcad.org/