久しぶりの更新です…。
プロオプティマイザーをスクリプトで操作する際の注意についてです。
MAXScriptでプロオプティマイザーを使いポリゴン数を削減する
最近はVRの需要が増えてきました。
パース用に作ったデータのリダクションが必要な場面もよくあります。
ポリゴン数や頂点数の削減にはプロオプティマイザーを使いますが、実はこのモディファイヤをスクリプト操作してもMAX 2014では正常に動作しません。プロオプティマイザーで頂点数を削減するスクリプトを書いても、プロオプティマイザーそのものが有効にならないというバグがあります。
回避方法は簡単で、プロオプティマイザーの計算結果を待たずにスクリプトの実行ライ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
fn ReductMesh obj max_verts =( --objの中身が単体だった場合は処理を実行 if classof obj != ObjectSet then( --メッシュ変換 if superclassof obj == GeometryClass and converttomesh obj != undefined then( --頂点数のチェック verts_count = getNumVerts obj --プロオプティマイザーを割り当て if have_prooptimizer == undefined and verts_count >max_verts do( addModifier obj (ProOptimizer()) ui:on --最大頂点数が反映されるまでプロオプティマイザーを設定しつづける while getNumVerts obj >max_verts do( obj.modifiers[1].OptimizationMode = 1 obj.modifiers[1].SymmetryMode = 0 obj.modifiers[1].vertexCount = max_verts obj.modifiers[1].Calculate = true ) --モディファイやを統合 collapseStack obj --メッセージを表示する print (obj.name+"--削減しました") ) print (obj.name+@"--: "+ getNumVerts obj as string) ) else( return false ) ) --objの中身がオブジェクトセットだった場合ループする else( for a in obj do ReductMesh a max_verts ) ) --シーン内の全てのオブジェクトに適用する場合 for obj in $* do ReductMesh obj 50 --選択オブジェクトに適用する場合 ReductMesh $ 100 |
18000点のFBXファイルをDWG化できる超点数までリダク ションする必要があったのですが、しばらく原因がわからなくて焦りました。こういうのは、さすがに 手作業だと無理です。