3Dモデルをいろいろ作ってみたい

3Dモデルをいろいろ作ろうとがんばっています。苦労した点、役に立ちそうな情報を発信していきます。

Scriptを作成してモデリング作業の効率アップ

前回記事のロフト操作だけで宇宙船を造形するというアイデアは半年くらい前から温めていたのですが、試してみるとけっこう手間がかかるためなかなか完成できないというのが実情でした。

 

ichidaya.hatenablog.jp

 

基準となる平面を選択後に長さを指定してオフセット平面を作る、その平面でスケッチを開く、中心点の指定と長軸、短軸の長さを指定して楕円を書いてスケッチを閉じる、これだけ操作して断面の楕円形が1個できあがりです。この一連の操作を何回か繰り返してロフト操作を実施してやっと1個の形状が完成です。宇宙船の胴体部分など所望のかたちにするのに断面を10個ぐらい定義しなければならず、めんどくさがり屋は作業を続ける気力が尽きてしまいます。

そこで宇宙船のモデリングの前にこういった機械的作業を簡単にするためのスクリプトを作成することにしました。Fusion 360はユーザーが自分で機能を拡張できるようAPIを提供してくれており、PythonまたはC++でプログラミングを行えます。私は試行錯誤がしやすいPythonを使うことにしました。

Shift-Sの押下でスクリプトとアドインダイアログが立ち上がり、そこから作成ボタンでスクリプトの編集や実行が可能です。

f:id:ichidaya:20190923000320p:plain

スクリプトとアドインダイアログ

作成したスクリプトBodyGeneratorMk2を起動します。現れたダイアログで左下のAddボタンをクリックすることで楕円がZ軸(画面上の青い軸)に沿って追加されそれらで作られる形状がプレビュー表示されます。ダイアログのテーブル内の数字(単位はmm)を変更することで楕円(この例では円)の大きさや位置を変更できます。気に入った形状になったらOKボタンを押して確定します。

f:id:ichidaya:20190923102130p:plain

BodyGeneratorスクリプト使用例(1)

 中心高さの値を変えていくと楕円の中心位置をずらしていくことができます。断面を並べる軸をY軸に変更すれば翼のような形状を作ることもできます。

f:id:ichidaya:20190923104445p:plain

BodyGeneratorスクリプト使用例(2)

このスクリプトを使って前述の宇宙船モデルを根気を切らすことなく作ることができました。参考までにスクリプトのソースを載せておきます。

www.dropbox.com

 ここから先はプログラミングに関する覚書です。作成したスクリプトの全体構造を示すクラス図を下に示します。仮称でmainとしているのは作成するスクリプトの本体でこの中のrun()メソッドがFusion 360から呼び出されて処理がはじまります。run()メソッド中ではCommandDefinitionとMyCommandCreateHandlerの2つのクラスのインスタンスを作成しています。CommandDefinitionは実行例の画面にでてくる入力用のダイアログボックスを表すクラスです。CommandDefinitionが保持しているXXXXInputクラスはダイアログボックス内の数値入力のフィールドやボタンに対応しています。数値が入力されたりボタンが押されたときの処理を行うイベントハンドラ(MyCommandInputChangedHadler、MyCommnadExecuteHandler)はMyCommandCreateHandlerが作成してCommandDefinitionに登録しています。

f:id:ichidaya:20190923110452p:plain

BodyGeneratorスクリプトのUIの構造

 作成される形状に相当するのはShapeクラスです。ダイアログ中のOKボタンが押下されたときに実行されるMyCommnadExecuteHandlerのnotify()メソッドの中でShapeのインスタンスが作成されます。ShapeインスタンスのbuidlShape()メソッドは以下の図にあるようなFusion 360提供のクラスを使って形状を作っています。コンストラクション平面やスケッチ、プロファイルなどマニュアルで作業を行うときに扱うオブジェクトごとにAPIが準備されています。

f:id:ichidaya:20190923135116p:plain

3D形状のクラス構造