2018-05-11

voronoi for each 2 (VAT)

ここで作った Voroni Fracture を、 Houdini 16.5 で 頂点アニメーションテクスチャとして出力して UE4 で再生する手順を紹介する。



使用したバージョン: Houdini 16.5.460
Game Development Toolset 1.10 Development
Unreal Engine 4.19.1
シーンファイルへのリンクは一番下にあり。

4. ピースのコントロール

3-1~6 では、Split ノード (split1) に番号をハードコード入力することで、For Each ループに入れるピースを決定していたが、他にも方法はいくつかある。

  1. マウスで選択
    1. split1 の Group パラメータの右端にある矢印アイコンをクリック
    2. ビューポート内で好きなように選択し、 Enter キーを押して確定すれば、Group 内の値が更新される。
    3. 気に入るまで何度でもやり直しが可能。
  2. Group Create ノードを使う
    1. TAB->Create Group を実行し、できた group1 を sort1 と split1 の間に挿入。group1 に表示フラグを指定。
        sort1 はバイパスしても良い。
    2. Base Group の Enable をオフにする。
    3. Keep in Bounding Regions を オンにする。
    4. Size を例えば 3, 0.8, 3 などとすれば、下図のように選択可能。

      バウンディングボックスのマニピュレータを使って編集することも可能。
    5. split1 の Group に設定されている値を削除し、group1 を指定する。
    6. 表示フラグを dopimport1 に指定すれば、group1 で指定した部分だけが細かく破砕されたことが確認できる。

5. 頂点アニメーションテクスチャ出力の下準備

破砕した RBD シミュレーションを頂点アニメーションテクスチャ (VAT) として出力するには、ビューポートで確認できるシミュレーションの見た目だけでなく、中でのデータの流れも整理する必要がある。

A. Unpack 追加
まず、VAT 出力する RBD シミュレーションはパックされた状態で、すべてのピースが同等の (パック関連の) アトリビュートを持っている必要がある。ここで作ったシミュレーションでは、split1 の二つの出力のうち、主出力 (左) には Unpack を追加したが、右にはしていない。そこで、右にも追加することで、Merge ノード (merge1) が、同じアトリビュートやデータタイプを持つことが出来るようにする。そして最後に setup_packed_prims またパックされる。

  1. unpack1 を Alt ドラッグしてコピーするか、 TAB->Unpack として新しい Unpack ノード (unpack2) を作成。
  2. unpack2 を split2 と merge1 を接続しているワイヤに挿入。
  3. normal1 にテンプレートフラグがついているならオフにする。

B. Connect Inside Edges をオンにする
上の状態で Houdini 内でシミュレーションすると、For-each を通らなかった方のピースが内側と外側でばらけてしまい、中身のないシェルのようになってしまう。そこで、

    • assemble2
    • setup_packed_prims
    の両方で、Connect Inside Edges をオンにする。
これにより、内側と外側がバラけることが無くなる。

C. マテリアル情報を削除する
HDA 内で定義されているマテリアルは UE4 で VAT 再生する際には使わず、下記で作成するシェーダにカラーテクスチャをアサインするので不要。

  1. TAB->Delete Attribute を実行。
    • 作成された attribdelete1 を testgeometry_rubbertoy1と switch1 の間に挿入。
    • Primitive Attributes の項に shop_materialpath を設定 (右端の▽から Material (shop_materialpath) を選択。
  2. dopimport1 に表示フラグがついていることを確認。
  3. シーンを別名保存。
ここまでが、4_rbd_final.hip。ファイナルではなくなってしまったが…

6. 頂点アニメーションテクスチャノードの作成、出力

頂点アニメーションテクスチャの出力には Game Development Toolset が必要。インストール方法はこちらを参照のこと。

  1. /out に移り、TAB->GameDev Vertex Animation Textures を実行。vertex_animation_textures1 ができる。
  2. Method を Rigid (Rigid Body Dynamics) に設定。
  3. Export Node を /obj/box_object1 に。
  4. Texture Resolution は 1024 のまま。
  5. とりあえず Render ボタンをクリックして出力を実行。
      シミュレーションのキャッシュを取っておらずに、120フレームの出力には1分半ぐらいかかり、ジオメトリファイル (.fbx) と移動 (pos) と回転 (rot) の2種類のテクスチャファイルが出力される。

    移動テクスチャ


    回転テクスチャ

7. UE4 にデータを持ち込む

Unreal Engine を実行。ここでは、新しいプロジェクト (MyProject7) を使っている。

  1. Content 以下に新しいフォルダを作成、VertexAnimTex などわかり易い名前をつける。
  2. このフォルダに出力したファイル (fbx とテクスチャ2枚) をドラッグ&ドロップ。
    • ポップアップの FBX Import Options では Import All をクリック。
    • メッセージログは無視して先に進んでよい。

    • 読み込んだ3つのファイルとマテリアルが一つ出来るはず。
  3. FBX ファイルの設定
    FBX ファイル (4_rbd_final_mesh) のアイコンをダブルクリック、開いたウィンドウで以下の設定を行う。
    1. Build Settings 以下で、 Use Full Precision UVs をオンにする。
    2. Asset import Data > Mesh 以下の Vertex Color Import Option を Replace に設定する。

      これにより頂点カラーとして格納されている各ピボット情報が正しく認識される。
    3. ウィンドウを閉じて変更を保存する。
  4. テクスチャファイルの設定
    次に2枚のテクスチャに対し同様の変更を行う。
    1. 4_rbd_final_pos をダブルクリック、ウィンドウを開き、Compression Settings を HDR (RGB, no sRGB) から VectorDisplacementmap (RGBA8) に変更する。
        これにより使用メモリ量を削減できる。
    2. ウィンドウを閉じて変更を保存し、4_rbd_final_rot にも同様の変更を実行する。
  5. マテリアルの設定
    次にマテリアルの設定を行う。
    1. default_material をVAT_rubberToy などと名称変更する。
    2. VAT_rubberToy をダブルクリック、ウィンドウを開くと、ノード二つによるシェーダネットワークが確認できる。
    3. Base Color に接続されている None を削除する。
    4. Houdini に戻り、/out/vertex_animation_textures1 を選択し、Sample UE4 Shader Code > Rigid Vertex Animation UE4 Code 以下にあるコードを Ctrl+A ですべて選択し、Ctrl+C でコピー。
    5. VAT_rubberToy ウィンドウに戻り、Ctrl+V でコードをペースト。

      大量のシェーダノードがペーストされた。
    6. ペーストされたシェーダネットワークには適度にコメントがあり、これを元にペーストしたネットワークを VAT_rubberToy に接続していく。
      • ウィンドウ左側の Details 以下の目のアイコンをクリック、Show All Advanced Details をオンにする。
      • 同じく Details 以下の Num Customized UVs を 3 にする。
      • 二つ下の Tangent Space Normal をオフにする。
      • Multiply を Base Color に接続する。("This goes into Base Color" とコメントのついたノード)
      • BlendAngleCorrectedNormals を Normal に 接続する。("This goes into Normal" とコメントのついたノード)
      • TransformVector を World Position Offset に 接続する。("This goes into WorldPos Offset" とコメントのついたノードの右(下流)のノード)
      • Mask (RG) を Customized UV1 に 接続する。("This goes into Custom UV1" とコメントのついたノード)
      • Append を Customized UV2 に 接続する。("This goes into Custom UV2" とコメントのついたノード)
    7. ウィンドウを閉じて変更を保存する。
  6. マテリアルインスタンスの作成
    1. コンテンツブラウザの VertexAnimTex ディレクトリ上で、RMB->Materials & Textures->Material Instance を実行。作成されたインスタンスに vat_rbd_instance などと名前をつけ、ダブルクリックして開く。
    2. Parent に VAT_rubberToy を指定すると、パラメータが一気に増える。
    3. Scalar Parameter Values 以下のパラメータをすべてオンにする。
      • Boudning Max
      • Bounding Max_1
      • Bounding Min
      • Bounding Min_1
      • Number of Frames
      • speed
    4. Houdini に戻り、/out/vertex_animation_textures1 を選択し、Data For Realtime Shader 以下の値を上記に挿入(コピペ)していく。

      つまり
      • BBOX MAX -> Boudning Max
      • BBOX MAX 1 -> Bounding Max_1
      • BBOX MIN -> Bounding Min
      • BBOX MIN 1-> Bounding Min_1
      • 119 -> Number of Frames
    5. speed はデフォルトでは 0.33 となっているが、120フレームを 24fps でシミュレーションした場合、フレームレート/フレーム数 (24/120) = 0.2 とすることで Houdini でのシミュレーションと同じ再生スピードを設定可能。
    6. rotation_texture と translation_texture をオンにして、rotation_texture には 4_rbd_final_rotを、translation_texture には 4_rbd_final_pos を設定する。
    7. ウィンドウを閉じて変更を保存する。
    8. 4_rbd_final_mesh をダブルクリックして再び開き、Material Slots に vat_rubberToy_instance をアサイン、これをビューポートにドラッグ&ドロップすれば、頂点アニメーションテクスチャが確認可能。
    9. toylowres.jpg をコンテンツブラウザにドラッグ&ドロップし、これを vat_rubberToy_instance の diffuse (最初にオンにする必要あり) にドラッグ&ドロップすれば、UE4内のシミュレーションにも色がつく。
おしまい。

まとめ

0 件のコメント:

コメントを投稿