Thinkbox Software 製品
ブログ

頂点ライティングをベイク化 

XMeshを使用したダイナミック頂点ライティングをベイク化 

以下のチュートリアルで、XMesh Saver用や、別の方法による3ds  Maxで容易に実行されることのないアニメーション化された頂点のカラー・データの保存用のカスタムのスクリプティングを追加してあります。

問題点

メッシュ上のダイナミック頂点カラーを保存するための有効な実行方法について、3ds Maxのユーザーが質問を行います。

3ds Maxにより、アニメーション化されたマッピング座標や頂点カラーを生成するために、アン・ラップのUVWモディファイヤ上の各マップ頂点のキーフレームを行うことは可能ですが、ベイク化の工程やプレイ・バックの両方が幾分、遅くなります。

他で論じられているThinboxの最新のプラグインのGenomeを使用した別のもう一つのソリューションがありますが、XMeshを使用した以下のワークフローが、最も実直なものです。

アニメーション化されたデータを生成するために、各フレームで実行されるMAXScriptを必要とするので、ベイク化と頂点カラーの割り当ての両方を実行するための短いMAXScriptを作成する必要があります。このため、実装されているUIに依存することなく、実質的にXMesh SaverのMAXスクリプトのインターフェイスを使用する完璧な例証と成りえます。

ソリューション

ティーポットとダイナミック・オムニ・ライトを有するシンプルなテスト・シーンを作成しますが、同じ方法で、別のシーンにも適用することが可能です。

例証シーン

  • 16 のセグメントに区切られた(区切られた数は、問題ではありません。)のティーポットを作成します。任意でその他のメッシュを使用することも可能です。
  • ワイヤー・フレームの色を白色に設定し、標準マテリアルを割り当ててください。
  • VertexPaint(頂点ペイント)モディファイヤを追加してください。これは、ライティングによる頂点カラーを保存するために使用します。
  • シーン上にオムニ・ライトを作成してください。
  • Auto Keyを有効化にし、若干のダイナミックな照明を生成するために、ワールド・スペースでのライトの位置のアニメーションを作成してみてください。ライトの色やその他の関連性のあるパラメーターのアニメーション化もまた行ってみてください。

 

ベイク化スクリプト

頂点カラーのベイク化とXMeshとして保存するスクリプトは比較的にシンプルです。

  • 保存するためのオブジェクトと、それ自体のユーザー変数のVertexPaint(頂点ペイント)モディファイヤを選択します。
  • XMesh Saverライセンスの取得を試み、それが成功すると、残りのスクリプトを実行することが可能です。
  • 保存するための連番名を設定します。特定の3ds Maxの時間軸で呼ばれる場合、フレーム番号をXMeshにより自動的に設定されるので、ユーザーが代わりに”0000”のようなフレーム番号を提供することに注意しましょう。
  • 任意で保存したいチャンネルもまた提供します。オブジェクトがより多くのマッピング・チャンネルを有する場合、例えば、”Mapping2″から”Mapping99″までを内包することも可能です。
  • レンダー・ステイト上の3ds Maxを設定するレンダー・ビギンのフラッグを設定します。全てのモディファイヤや、ビューポート用とレンダー・モード用の別の設定をサポートしているParticle Flow やTurboSmoothなどのオブジェクトはレンダー・モードに変更されます。
  • 現行のシーンの区切られた(セグメント)フレームを通じてループを行い、各フレームでタイム・スライダーの設定を行います。ダイナミック頂点カラーを割り当てる際にこれは必要となり、単純に”at time t”を使用した時間経緯を設定することにより、その他の場合において作動しますが、VertexPaint(頂点ペイント)モディファイヤと一緒には作動しません。
  • 現行フレーム上のライティングの工程や、メッシュ内へのベイク化、保管コンテナ用にVertexPaint(頂点ペイント)モディファイヤへの伝播などを行うために割り当てるMAXスクリプトのVertexColors(頂点カラー)関数を呼び出します。
  • ローカル(オブジェクト)スペースに、1つのオブジェクトを保存する手法であるXMeshSaverUtils.SaveMeshToSequence()を呼び出します。引数には、保存するオブジェクト、”Ignore Empty Meshes(空(カラ)のメッシュを無視)”フラッグ、”Ignore Changing Topology(変更したトポロジーを無視)”フラッグ、”Save In Object Mode(オブジェクト・モードでの保存)”フラッグと”Save Velocity(ベロシティ:速度)”フラッグがあります。この場合において、これら全てのフラッグがTrue(真)として設定されるべきです。
  • ループが一旦終了すると、レンダー・ステイト・フラッグを低下させ、ビューポート・モードへの変更が行われ、ライセンスのリリース(解放)が実行されると、他のXMesh Saverを使用することが可能となります。

注意: オブジェクト・スペースでメッシュをベイク化しますが、スクリプトに若干の変更を加えることで、ワールド・スペースでのベイク化を可能にします。現行の場合では、XMesh Loaderを使用し、オリジナルのオブジェクトを単純に置き換え、各フレーム上のワールド・スペースの新規の頂点リストを読み込ませることなく、同じ動きを生成するための同じペアレンティング(階層化)を割り当てることが可能です。

こちらがスクリプトです

theObject = $Teapot001
theMod = theObject.vertexpaint
XMeshSaverUtils.AcquireLicense()
if XMeshSaverUtils.HasLicense do
(
XMeshSaverUtils.SetSequenceName @”C:\temp\bakecolor_0000.xmesh”
XMeshSaverUtils.sourceChannels = #(“Velocity”, “Color”, “TextureCoord”, “MaterialID”, “SmoothingGroup”)
XMeshSaverUtils.SetSceneRenderBegin()
for t = animationrange.start to animationrange.end do
(
slidertime = t
AssignVertexColors.ApplyNodes theObject vertexPaint:theMod
XMeshSaverUtils.SaveMeshToSequence theObject true true true true
)–end t loop
XMeshSaverUtils.SetSceneRenderEnd()
)–end if
XMeshSaverUtils.ReleaseLicense()

スクリプトを起動

  • スクリプトを起動することで、特定のフォルダ内のXMeshとXMDATファイルの連番を作成し、時間の大半が、メッシュに頂点カラーを割り当てることに費やされます。任意のティー・ポットはアニメーション化されておらず、さもなくば、頂点リストやフェイス・リスト、カラー・チャンネル用のマップ・フェイス・リストが最初のフレーム上でのみ保存され、全ての以下のフレーム用に再使用されます。カラー・チャンネルのみが各フレームに保存され、著しいデータ量を削減されます。
  • 保存が一旦終了すると、コマンド・パネルの”作成”  > ジオメトリ・タブのThinkboxカテゴリーから、XMesh  Loaderオブジェクトを作成する必要があります。
  • オリジナルのティーポットのピボットと、XMesh Loaderがピボットで整列していることを確認し、何らかのアニメーションを使用する場合には、同様の変形を再生成するために、XMesh Loaderをオリジナル、もしくはそのペアレントへに階層化を行ってください。
  • オリジナルのティーポットを隠し、シーン上にはXMesh Loaderとライト照明のみを残してください。
  • オムニ・ライトの消灯(無効化)を行うと、XMesh Loaderが黒色に変わります。
  • 頂点カラーを表示するため、XMesh Loaderを選択し、右クリックを行い、オブジェクトの属性(プロパティ)を選択した後に、”Display Vertex Colors(頂点カラーの表示)”を有効化にして、ダイアログを非表示にするため、”OK”を押します。
  • XMesh Loaderの現行の不具合により、スライダーの時間が変更時に、ビューポート上での頂点カラーの更新が正確に行われませんが、列の上に”TurnToMesh”のような何らかのモディファイヤを追加するなどの別の単純な方法で、強制的に更新を行うことが可能となります。

タイム・スライダーを移動させると、ダイナミック頂点カラーを表示しているティーポットを確認することができるはずです。

 

ライト自体が消灯した状態でも、オムニ・ライトのライティング照明を、頂点カラーが表記しています。