ブラウザ向けのローカルファーストCADプログラム CADmium
(mattferraro.dev)CADmium: ブラウザで動作するローカルファーストCADプログラム
2024年5月21日
私たちは新しいオープンソースのCADプログラムを開発中です。かなり進んでいますが、皆さんの助けが必要です。このプロジェクトに参加したい方は、Discordに参加してください!
何が必要か?
3DパラメトリックCADプログラムを作るために必要なもの:
- 2D制約ソルバー
- B-repカーネル
- ヒストリートラッカー
- 3Dユーザーインターフェース
- ファイル形式
それぞれについて話していきます!
2D制約ソルバー
2D制約ソルバーは、線が平行または垂直に保たれるようにしたり、2つの円が同じ半径を持つようにしたりする役割を担います。
- 一般的なアプローチは、すべての未知数を大きなベクトル
xにまとめ、すべての制約条件を線形方程式として表現し、大きな行列方程式Mx = bに組み立てることです。 - 理論的には、
Mの逆行列を作れば終わりです。x = M^-1 b - 実際には多くの最適化が必要です。しかし、このアプローチには欠点があります。
Mは正方行列であるときにしか逆行列を作れません。- 制約条件が多すぎると
Mが大きくなりすぎて、このアプローチは破綻します。 - 制約条件が少なすぎる場合は仮定の挿入で解決できますが、これはモデラーの期待と一致しないことがあります。
- 未知数が多い場合、この行列方程式を解くのは非常に遅くなります。
代替アプローチ:
- 問題を2D物理シミュレーターとして定式化する:
- 各点は質量
mと速度vを持ちます。 - 各制約条件は、接続された点に力
Fを加えるバネです。 - 摩擦力は速度に比例します。
- シミュレーションを小さな
dtで前進させ、収束するまで繰り返します。
- 各点は質量
- このアプローチは小さな変化を多数積み重ね、バネの位置エネルギーを0にします。
- 各時間ステップでの実行時間は、バネの数と未知数の数に比例して線形です。
- このアプローチは並列化に適しており、実際に非常に高速になり得ます。
- 過剰拘束の問題でも文句を言いません: 一貫したシステムは正常に解かれ、一貫しないシステムではバネが妥協します。
- 拘束不足の問題でも無限遠へ飛んでいかず、最も近い有効な構成を見つけます。
- このアプローチは不等式制約条件にも対応できます。
B-repカーネル
機械系CADでは、ユーザーは部品のエッジや面と直接やり取りできる必要があります。
- すべてのパラメトリックCADプログラムは、部品の境界をデータ構造として直接表現します。
- 立方体は、6つの面、各面は4つのエッジ、各エッジは2つの点からなるソリッドとして表現されます。このアプローチは境界表現(B-rep)と呼ばれます。
- 曲面の場合は、スプラインを一般化したNURBSサーフェスを使うことで、自由形状に対する芸術的な制御と円錐曲線の正確な表現が可能になります。
- この方法で形状を表現するのは難しく、和集合・交差・差集合といったブーリアン演算を実装しようとすると、さらに難しくなります。
- こうしたデータを扱い、ブーリアン演算を実行するライブラリをB-repカーネルと呼びますが、作るのは非常に困難です。
現在のCAD市場:
- 主要なCAD企業はそれぞれ独自のB-repカーネルを書いており、完成までに数十年を要しています。
- 最も重要なB-repカーネルはParasolidで、多くの産業製品を支えています。
- オープンソースCAD市場では、OpenCascadeが唯一の人気あるB-repカーネルです。
新しいオープンソースB-repカーネル:
- Truckという新しいオープンソースB-repカーネルが開発中です。
- Rustで書かれており、メモリ安全性の保証、並列化のしやすさ、WebAssemblyへのコンパイル対応といった利点があります。
- Truckは小型で軽量であり、
.stepファイルの読み書き、サーフェスの三角形分割、NURBSサポート、ソリッドの交差・和集合・差集合演算に対応しています。
ヒストリートラッカー
パラメトリックCADプログラムは、設計のフィーチャーヒストリーを保存します。
- スケッチ、押し出し、回転などの操作によって部品を完成させます。
- 「パラメトリック」とは、以前の段階に戻って変更を加えた後、フィーチャーを再生して少し異なる部品を得られることを意味します。
- 変数の注入によって、モデルをパラメータ化できます。
パラメトリックCADの脆さを解決するためのアプローチ:
- レジリエント・モデリング・ストラテジー(RMS): 部品を設計するためのルールセット。
- スケッチにフィーチャーヒストリーを追加すること: スケッチのフィーチャーをフィーチャーツリーに保存・表示し、RMSの考え方を単一のスケッチに適用できます。
- すべてのユーザーイベントを追記専用ログに記録し、無制限の元に戻す/やり直し機能を提供します。
3Dユーザーインターフェース
私はブラウザでCADを実行するというアイデアが気に入っています。
- Onshapeはブラウザで動作しますが、実際にはAWSのGPU対応クラウドインスタンス上で動いています。
- CADmiumはWebAssemblyにコンパイルされたTruckを使用することで、すべての処理をブラウザ内で実行できます。ローカルファーストなアプリです。
技術スタック:
- Three.js: 3Dビューポート
- Svelte: 状態管理/リアクティビティ
- Threlte: SvelteとThree.jsの橋渡し
- UIとB-repカーネル間のメッセージ受け渡し
- Electron: ローカル実行
- その他の標準技術: Typescript, TailwindCSS, Vite など
ファイル形式
CADmiumはすべてにJSONを使います。
- 操作ログはJSON Linesで構成されます。
- 設計した部品を、より単純な交換形式へエクスポートできます。
- 例:
{ "steps": [ { "type": "sketch", "id": "Sketch-01", "data": { ... } }, { "type": "extrude", "id": "Extrude-01", "data": { "distance": "10mm", "sketch": "Sketch-01", "faces": [0], "type": "new" } } ] } - CADmiumのコマンドラインインターフェース(CLI)を使って、
.stepまたは.stlに変換できます:$ CADmium export my_part.cadmium --format stl
結論
ここで挙げたアイデアのどれが成功し、どれが失敗するのかは分かりませんが、この領域のどこかに、小さなチームが製造業に大きな影響を与えられる機会があります。
必要な支援:
- Rustプログラミング(全般的な改善)
- 計算幾何学(Truckへのパッチ)
- Three.jsの支援(新しいカメラコントローラー、より良いライティング、ポストプロセッシング)
- 助成金の機会、または裕福なスポンサー探し
今は扱わないが、後で再訪したいもの:
- ベンチャーキャピタル
- ツールパス生成(CAM)
- 有限要素解析(FEA)
このアイデアに興味があるなら、CADmiumのDiscordサーバーに参加して話しましょう!
GN⁺の意見
- Rustの利点: Rustはメモリ安全性と並列化のしやすさのおかげで、オープンソースプロジェクトに非常に適しています。これはCADmiumの安定性と性能を高めるうえで大きな助けになるでしょう。
- WebAssemblyの活用: WebAssemblyを使ってブラウザ上で直接CAD作業を行えるのは非常に革新的です。これにより、インターネット接続が不安定な環境でも作業を続けられます。
- ファイル形式の単純化: JSONを使ったファイル形式は理解しやすく、テキストエディタで直接修正できるため非常に有用です。これは共同作業とバージョン管理を容易にします。
- フィーチャーヒストリーの重要性: フィーチャーヒストリーによって無制限の元に戻す/やり直し機能を提供することは、ユーザー体験を大きく向上させる可能性があります。これにより、設計過程でのミスを簡単に修正できます。
- オープンソースコミュニティの力: オープンソースプロジェクトは、コミュニティの参加と貢献によって急速に発展できます。CADmiumも、多くの開発者とユーザーの参加によってさらに発展していけるでしょう。
まだコメントはありません。