編集履歴一覧に戻る
uchanのアイコン画像

uchan が 2024年04月13日21時42分24秒 に編集

初版

タイトルの変更

+

プログラミングで 3D モデリングの魅力

タグの変更

+

CadQuery

+

CAD

+

3DCAD

+

KiCad

+

3Dプリンター

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

セットアップや使用方法

本文の変更

+

筆者は最近、プログラミングによって 3D モデルを作っています。3D プリンタで印刷するモデルや KiCad の 3D ビューで表示するためのモデルです。本記事では、Autodesk Fusion 等のグラフィカルな 3D CAD ではなく、プログラミングによってモデルを作ることの魅力を語ってみたいと思います。 3D モデリングというと、普通はグラフィカルな 3D CAD を使うのではないでしょうか。3D プリンタ用モデル作成では、個人用途なら無償ということもあり、Autodesk Fusion を使う人をよく見かけます。かくいう筆者も Fusion は使ったことがあります。VR 空間で使うような 3D モデル作成では Blender や Maya などが人気なのでしょうか? グラフィカルな 3D CAD は操作が直感的なのが良いところです。加工対象の辺や面を選択するには画面上のオブジェクトをクリックすれば良いです。2D 図形を押し出して立体を作る場合、まず押し出すための 2D 図形をマウスで選択し、その後アイコンやメニューなどから「押し出し」を実行する、という感じの流れになります。見る方向を変えるのも画面上をマウスでぐりぐり動かすと回転できます。このように、まさに今作っている 3D モデルが画面上に表示され、それをマウスで操作しながら造形を進めていけるのが、グラフィカルな 3D CAD の利点でしょう。 しかし、筆者はプログラミングによって 3D モデルを作る方が快適だと感じています。これは非常に個人差があるはずで、読者の中にはグラフィカルな CAD の方が楽だと思う方もいると思います。あくまでも以下に書くことは筆者の感想です。 ## プログラミングによるモデル作成 そもそもですが、3D モデルを作る方法として、グラフィカル操作で作る他にプログラミングでモデルを作る方法があります。汎用プログラミング言語、あるいはモデル記述用の言語を用いたモデリングです。筆者がこの方法を知ったきっかけは Interface 誌 2021 年 10 月号の特集「3D プリンタ & メカ設計入門」の特集第 1 章「メカ設計プログラミングのススメ」です。この記事で CascadeStudio、CadQuery、OpenSCAD が紹介されています。 筆者は Autodesk Fusion、OpenSCAD、CadQuery を使ったことがあります。筆者としては、シンプルさ(覚えやすさ、使いこなしやすさ)では OpenSCAD が、表現力を含めた総合力では CadQuery が好きです。なぜなら、モデルをプログラムとして表現できるメリットがとても大きいと感じるからです。Fusion はなるべく使いたくありません。ソフトの動作が重かったり、モデルの修正が難しいと感じるからです。 例えば自動走行ロボットの車体(シャーシ)を設計するとしましょう。設計の過程で、モーターや基板などの取り付け位置を調整したり、シャーシの全長を変えてみたり、という試行錯誤をするでしょう。プログラムでモデルを作っていれば、変数を 1 箇所変えるとそれに合わせて全長が調整され、乗っている他の部品も適切な位置に移動する、というようなことが可能です。もちろん、そうできるように工夫してプログラミングをしておく必要はあるわけですが。初期の頃に作った部分を修正したい場合も柔軟です。プログラムの好きな箇所を好きな順序で編集できるので、素直に、初期に書いた部分に修正を加えれば良いわけです。古いコードをコメントで残しておけば、修正に納得しなかったときにコメントを外せば元に戻ります。 Fusion などのグラフィカル操作の CAD では、通常、歴史は一本道です。初期に行った操作を、後から「やっぱりやめる」とか「ちょっと操作を変える」というのは難しいです。後から「追加で修正を施す」ということになります。お絵かきで例えると、色を修正するときに消しゴムで消す代わりに、新しい色を上塗りする感じです。プログラミングとしてモデルを作れば、好きな部分を好きなだけ修正できるわけです。 ## バージョン管理との相性 CadQuery は Python でモデリングを行います。ということで、モデルを作り出すのに必要な情報がすべてテキストで表現されるということです。これは Git などのバージョン管理システムと相性がバッチリです。モデルのどこをどんな風に変更(改良)したのかをきちんんとバージョン管理できるというわけです。バージョン間で diff を取れば加えられた変更が分かります。モデル自体がテキスト表現されているので、テキストの diff で十分に差分が分かるのです。 もちろん、Fusion 等のグラフィカルな CAD で作ったファイルもバージョン管理できます。できますが、相性は悪いです。バージョン間の差分を普通の(テキスト的な)diff で表示したところで、それがどんな変更なのかは分かりません。もし、グラフィカルに変更を表示できる diff があればこの問題は解決するはずですが、そのような diff は現状でほとんど存在しません。少なくとも現状の git diff はテキスト差分専用です。 ## プログラミング力はそれほど要らない ここまでプログラミングによるモデリングの良さを説明してきました。もちろん、それにはプログラミングをする必要があります。しかし、3D モデルを作るのに高度なプログラミング力は不要です。 3D モデルを作るには、プログラミング技法を駆使する必要はなく、図形の生成や移動をひたすら羅列するだけでできるからです。if 文や for 文が書ければ便利ですが、それらを使わなくてもモデルを作ることは可能です。関数だっていくつも定義する必要はなく、main 関数にひたすら羅列していく書き方でもモデリングできるのです。 例として、筆者が作った[ピンヘッダの 3D モデルを生成するプログラム](https://github.com/uchan-nos/cadquery-models/blob/main/pin_header.py)を示します。 ``` def new(length=11.6, pitch=2.54, pin_thickness=0.64, lower_length=2.98): pla_thickness = pitch pin = ( cq.Workplane() .box(pin_thickness, pin_thickness, length) .edges('|Z').chamfer(pin_thickness/10) .translate((0, 0, length/2 - lower_length)) ) pla = ( cq.Workplane() .box(pitch, pitch, pitch, combine=False) .edges('|Z').chamfer(0.2) .translate((0, 0, pla_thickness/2)) ) return ( cq.Assembly() .add(pla, color=cq.Color('gray10')) .add(pin, color=cq.Color('lightgoldenrod1')) ) ``` ほら、if 文も for 文もありません。メソッド呼び出しがずらっと並んでいるだけです。イメージとしては、Fusion などのグラフィカルな CAD で行う操作を、すべて言葉で表現し、時系列に並べた感じです。必要なのは高度なプログラミング技法ではなく、造形メソッドの種類や使い方を覚え、適切なメソッド呼び出しができるようになることです。グラフィカルな CAD でも、操作やコマンドを覚える必要がありますよね。それと同じことです。ただ、プログラミングによるモデリングでは、過去に自分が使ったメソッドはファイルとして記録されているため、そのファイルを見れば思い出せますし、なんならコピペして再利用することもできます。グラフィカルな CAD だったら、自分が過去にどんな操作をしたか、パッと見返すことはできません。 ちなみに、上記のプログラムでは次のようなピンヘッダのモデルが生成されます。 ![キャプションを入力できます](https://camo.elchika.com/e6369fd24e8ff7c949224453cef9c27ef4b87bcc/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f34383635306138342d373234372d343137622d396564382d356163646438626261336161/) プログラミング技法は後々学んでいけば良いのです。プログラミング技法を学ぶほど、効果的にモデルを作れるようになります。例えば for 文などの繰り返し構文を使えれば、キーキャップなどの似た形を大量に作るような処理が簡単にできます。関数への適切な分割ができるようになれば、モデルの再利用性を向上させ、モデル作成の効率を上げることができます。あくまで、高度なプログラミング技法はプラスの要素であって、モデル作りに必須な知識でないことがおわかりいただけたでしょうか。 ## CadQuery を始めるには 筆者が書いた同人誌 [CadQueryによる3Dモデリング ―Pythonでモデル記述 & KiCadと連携―](https://uchan.booth.pm/items/5646902) がおすすめです。CadQuery は現状、日本語の情報があまりありません。筆者の同人誌以外では、次のような情報源があります。 - [CadQuery 2 ドキュメント — CadQuery Documentation](https://cadquery-ja.readthedocs.io/ja/latest/) - CadQuery の全体的な説明や、設計のコンセプトなどを日本語で読むことができます。 - 日本語訳は途中状態で不完全です。API リファレンスなどはほとんど英語のままです。 - [CadQueryを使ってみよう | CCT-recruit](https://recruit.cct-inc.co.jp/tecblog/cad/cadquery/) - 業務として CadQuery を使っている人が書いた記事のようで、CadQuery を使うことへの勇気をもらえます。 - CadQuery の解説記事としては内容がまったく足りません。インストール方法と基礎的な造形メソッドがいくつか紹介されているだけです。 - そのインストール方法も、今(2024 年 4 月)となっては古い内容になってしまっています。 - [CadQueryを使って、3Dプリンタデータ(STLファイル)を作成する #Python - Qiita](https://qiita.com/kotaproj/items/781aa28fd4c20f504890) - タッキング穴付きフックという、3D プリンタ対応の実用的な図形のコードが紹介されています。 - CadQuery の解説記事というよりは実例紹介という感じです。