Forge の Design Automation API に は、クラウド上で稼働させる「コアエンジン」が 4 タイプ用意されています。AutoCAD、Revit、Inventor、3ds Max です。これらコアエンジンはデスクトップ製品である AutoCAD、Revit、Inventor、3ds Max と異なり、ユーザ インタフェースを持たない「エンジン」です。遠隔で操作画面を見ながら対話作業することは出来ません。Design Automation API が提供するのは、コアエンジンにアドイン/プラグイン アプリをロードさせて実行する自動化の手段です。
いままで Design Automation API for AutoCAD、Revit、Inventor についてご紹介してきましたが、3ds Max についてはしていませんでした。今日以降、Design Automation API for 3ds Max コアエンジンを使った基本的な実装を数回にわたってご案内したいと思います。
3ds Max?
3ds Max は、設計ビジュアライゼーション、ゲーム、アニメーションに最適な 3D モデリングおよびレンダリング機能を提供するソフトウェアです。
意外に感じる方もいらっしゃるかと思いますが、オートデスクの歴史の中では、AutoCAD に次いで古い歴史があります(旧名 3D Studio Max)。古い話ですが、日本では自動車の TV CM で Dancing Baby(ダンシング・ベイビー)が使われたことで、作成に使用された 3D Studio Max が話題になりました。
販売戦略の一環で、一時期 3D Studio VIZ や 3ds Max Design の製品ラインで販売された時期がありましたが、現在は 3ds Max に統合されています。
3ds Max のカスタマイズ
そんな 3ds Max には、プラグイン アプリケーションを作成手段として、大きく 3ds Max SDK を使用する C++ と、ネイティブ スクリプト言語である MAXScript の 2 つの方法が用意されています。
MAXScript には pymxs Python モジュールによるラッパーが用意されているので、Python 言語を使ったスクリプトの作成も可能です(一部制限あり)。また、あまり一般的ではないように思いますが、.NET アセンブリを使った .NET プラグインの作成も可能になっています。
カスタマイズに 3ds Max SDK を使った C++、あるいは MAXScript か、どちらの言語を選択するかは、作業の形態とプラグインで実行する目的によって異なります。両方の言語には長所と制約がありますが、どちらを使用しても複雑なアプリケーションを開発できます。
一般に、MAXScript プラグインは、C++ で書かれた同等のプラグインよりも実行速度が遅くなります。したがって、パフォーマンスが重要になる場合は、SDK を使用した方がおそらく適しています。OLE/ActiveX/.NET コントロールを介して 3ds Max 機能をパブリッシュする場合、SDK を使用するよりも MAXScript でコード化した方が簡単です。MAXScript は、プラグインのプロトタイプ作成、比較的小さな機能の開発、およびテスト項目の作成に役立ちます。
今回は、この MAXScript を Design Automation API for 3ds Max で使用してみたいと思います。
MAXScript の編集と実行
MAXScript は拡張子 .ms を持つ ASCII テキストファイルです。3ds Max の [スクリプト(S)] プルダウンから [スクリプトを起動(R)...] メニューをクリックして、.ms ファイルを指定して実行することが出来ます。
MAXScript の編集は、[MAXScript エディタ(E)...] メニューでエディタを起動しておこなうことが出来ます。実行はインタプリタで逐次実行されるため、エラーが発生すると、その時点で処理が中断してしまいます。
MAXScript エディタに馴染みのない場合は、VS Code にオープンソースのエクステンションをインストールして利用することも可能です、例えば、Language MaxScript などがあります。
MAXScript リスナーを使うと、スクリプトを対話的に評価することが出来ます。MAXScript エディタと同じように独立したウィンドウを持つ MAXScript リスナーでは、スクリプトを1行づつ入力して実行したり、変数の内容を表示させてデバッグ作業に役立てることが出来ます。
Design Automation API for 3ds Max のコアエンジン
Design Automation API for 3ds Max がコアエンジンとして使用するのは、3ds Max Batch と呼ばれる 3dsmaxbatch.exe です。当然、MAXScript プラグインをロードして実行することが出来るようになっています。
3dsmaxbatch.exe は 3ds Max のインストール フォルダに同梱されているので、コマンド プロンプトから起動して作成したスクリプトをテストすることが出来ます。 MAXScript の指定には、3dsmaxbatch.exe の起動オプションを使用します。
ゴールの考察と最初のスクリプト
ここでは、AU 2021 でご紹介した Forge Viewer+Design Automation AutoCAD で作るコンフィギュレータ の素材を流用して、卓上扇風機モデル Table Fan.dwg を 3ds Max に読み込み、AutoCAD でモデルにアッタッチした Autodesk Material と互換性を持つ ART レンダラーを使ってレンダリング画像を作成する単純な例を考察してみます。
具体的には、コンフィギュレーター機能の一部として、「羽根」の色や「葉っぱ」の有無を指定、その値を Design Automation に渡し、同内容のレンダリング画像を生成します。ただ、今回は、指定内容のパラメータ渡し部分は一旦割愛するものとします。
Table Fan.dwg には、Color1 から Color6 に色別の画層があり、「羽根」ジオメトリがモデリングされているものとします。同様に「葉っぱ」ジオメトリは Leaf 画層にモデリングされています。また、すべての画層は「オン」/「フリーズなし」の状態で保存されています。
下記は、「羽根」の色を赤 - 色番号 1、「葉っぱ」有りの状態を画層オン/オフで作り出し、レンダリングする MAXScript です。
/* シーンリセット & DWG 読み込み */resetMaxFile #nopromptimportFile "C:/<your path>/Table Fan.dwg" #noprompt
/* 想定既定値(JSON 読み込み予定) */col = 1leaf = true
/* ColorX 画層オフ */global layfor i = 1 to 6 do(if col != i then (lay = LayerManager.getLayerFromName ( "Color" + i as string )lay.on = false))
/* Leaf 画層オン/オフ */lay = LayerManager.getLayerFromName ( "Leaf" )lay.on = leaf
/* 既定パース ビューポート */viewport.activeviewport = 4viewport.SetRenderLevel #smoothhighlightsviewport.setLayout #layout_4
/* ART レンダラー設定 */global art = ART_Renderer()art.quality_db = 20art.render_method = 1art.anti_aliasing_filter_diameter = 2.0art.enable_noise_filter = trueart.noise_filter_strength = 1renderers.current = art
/* レンダリング & 生成画像保存 */undisplay ( render outputfile:"C:/<your path>/result.jpg" )
このスクリプトで生成されたレンダリング画像は次のようになります。
AutoCAD DWG の読み込み時、形状をなめらかにするために「3D ソリッドの最大サーフェス偏差」設定を調整します。この設定値は、残念ながら、MAXScript からアクセスすることが出来ません。
同設定値は、C:\Users\<user name>\AppData\Local\Autodesk\3dsMax\2022 - 64bit\JPN\ja-JP\plugcfg フォルダにある dwg_dxf_import.ini ファイルの DWG_ACISDeviation 項に保存されますが、Design Automation API for 3ds Max の WorkItem 実行時、事前に用意した dwg_dxf_import.ini ファイルをコアエンジンに認識させる方法は出来ません。
このため、先のスクリプトで読み込みとレンダリングを自動化した場合、既定値 1.0 が適用されてしまい、形状によっては、ポリゴンが目立つ状態になってしまう場合があります。
対応策として一般的なのは、あらかじめ(手動で)「3D ソリッドの最大サーフェス偏差」を調整して読み込み、保存したシーン ファイル(.max)を用意して、Design Automation API for 3ds Max で使用する方法です。- ここでの目的は、MAXScript を Design Automation API for 3ds Max で実行させることなので、レンダリング設定や内容は最小限にとどめています。ART レンダラーの利用は、AutoCAD 上で DWG 内のジオメトリに適用した Autodesk Material の利用を意図したもので、それ以上の理由は特にありません。既定の Arnold レンダラーでは、 Autodesk Material のレンダリングで警告が多数表示されてしまい、Design Automation API のレポートログが見にくくなってしまうのを避けています。
今後、MAXScript から JSON ファイルを読み込んで、「羽根」の色や「葉っぱ」の有無を動的に変化させる方法を考えてみます。
By Toshiaki Isezaki
コメント