Scene Animateノードでは、APEX Scene Add Character で追加したキャラクターと、APEX Scene Add Prop で追加したプロップ(壁など)を組み合わせ、相互作用するラグドールシミュレーションを作成できます。
例えば、キャラクタが走ってきて壁に衝突しながら駆け抜けていくアニメーションを作成します。この時、壁はキャラクタと衝突してRBDで崩れるようにします。
シミュレーションの調整が終了後、Start Recording Posesでキーフレームにしました。今回はこのキャラクタによって崩された壁をVATとして出力したいと思います。
APEX(Scene Animate)のデータは「設計図」のようなデータ構造に過ぎないため、そのままではSOPとして扱えません。 そこで Scene Invoke ノードを使い、設計図とアニメーションを入力として計算させることで、変形後のジオメトリをポイント座標やアトリビュートとしてSOP上に焼き付けて出力します。
ただ、Scene Invoke はデフォルトでは 「最終的な見た目(変形後のメッシュ)」 を出力することに特化しています。そのため、出力されたGeoデータのアトリビュートを確認するとPしかありません。
Scene Invokeをropnet内のVertex Animation Textureノードに設定すると、PivotとOrientが必要だというエラーががでて出力ができません。
VAT (RBDモード) は形が変わらない『固い物』を扱うため、変形後のメッシュ形状ではなく、動かすために必要な『中心位置 (pivot)』と『回転角度 (orient)』のアトリビュートを必要とします。
Scene Animateの中にあるデータから、このpivotとorientを作成する必要があります。
まずは、Scene Invokeを使用し壁の形状データを出力します。
取り出したいのは壁データだけなので、Scene Output Pathで取り出したいキャラクターのBase.shpを取り出します。
デフォルトだとパックされたままになるため、Unpackします。
このような感じでRBDで計算済みの形状データが取得できます。
次のApex Add scene propで追加した際に各破片に追加されたコントロール(アニメーション済)を取り出します。
Scene Invokeを複製します。
ここで出力するのはBase.skelです。Unpackした状態で取り出してください。
このようにアニメーションデータとして取り出すことができます。
Base.skelとして取り出したポイントは下記の情報を持っています。
そこでこのtransform(3*3)からorientを作ります。
Attribute Wrangleノードを作成します。
下記のように入力します。
p@orient = quaternion(3@transform);「行列(transform)から『回転データだけ』を抽出して、Houdini標準の回転形式(orient、クォータニオン)に変換・保存する」 という処理を行っています。
必要があれば、Trailを使用してVelocityやAngular Velocityを追加することも可能です。
では、ここまで作成したorientとvelocityをBase.shpにコピーする必要があります。
Base.skel(各破片の重心、スケルトン)に保存されている計算済みの回転(orient)や速度(v, w)といった「動きのデータ」を実際のメッシュ(破壊された壁など)コピーしたいと思います。スケルトンと各破片を校正するポイントのマッチングを行うためにnameアトリビュートを使用します。
現在破片ジオメトリはPrimitivesアトリビュートとしてnameを持っているため、これをPointにプロモートする必要があります。
Attribute Promoteを使用し、nameをPointアトリビュートとします。
Attribute Copyを使用し、nameが一致するスケルトンの回転、速度、角速度、位置をコピーします。
ここまでで取得した回転情報などをコピーすることができました。
次に必要なのが pivot です。これは破片が回転する時の『中心』となる座標です。 重要なのは、VATの計算ルールの都合上、この座標は『動いている最中』のものではなく、必ず『動く前の初期状態(Rest skelton)』での位置でなければならない、という点です。
ここはアニメーション前の静止した状態で良いため、Scene Animateからunpack folderを使用します。
wall.charのBase.skelをアンパックします。
これでアニメーションするまえのBase.skelのみを取得することができました。
各ポイントが持っている情報のPをpivotアトリビュートに変換していきます。
Attribute Swapを追加し、Pをpivotに変換します。
この取り出したpivotアトリビュートも破片ジオメトリにコピーする必要があります。
Nameアトリビュートを元にマッチングした破片にpivotアトリビュートをコピーします。
これでVAT出力に必要なorientやpivotを破片ジオメトリに追加することができました。あとはVATノードで見つけやすいように名前をつけます。
ropnetを作り、その中にVertex Animation Textureノードを作成しましょう。
Vertex Animation TextureノードのInput Geometryに先ほどまとめたNullを指定しても、エラーメッセージ等はでません。
必要な設定を追加し、Render AllでVATを出力します。
VATのパラメータに関しては下記をご参照ください。
https://ikatnek.blogspot.com/2021/09/vat3-complete-guide-ja.html
また、出力したVATデータをUnrealで使用する方法は下記をご参照ください。