Clothシミュレーションをボーンアニメーションに変換する方法

こんにちは!Rhinoです。
テレワークが始まり新鮮な気分で仕事をしている毎日です。

先日仕事中にClothシミュレーションしたものをボーンアニメーションに変換してUnityなどに出力できないかなあと思ったものですから、そのやり方をまとめてみました。
コンシューマーの場合はHoudiniからVATを使ってUnreal Engineに出力するという経験はあるのですが、近頃はモバイルの仕事をする機会が多いためボーンアニメーションをベースに考えてみました。

旗を揺らしてみよう

メッシュにnClothを割り当てる

まずは適度に分割したメッシュを用意します。

メッシュを選択後、[FXメニュー] [nCloth] [Create nCloth]を押してメッシュにnClothを割り当てます。

Outlinerなどで見て頂くといつくかのノードが出来ているはずです。

タイムスライダから再生してみてください。
どんどん下に落ちていきませんでしたか?

風を吹かせよう

下に落ちていくだけでは困りますので位置を固定し、さらに風に吹かれているような動きをつけたいと思います。

左端の頂点の位置をコンストレインを使って固定してみます。
頂点を選択後、[FXメニュー] [nConstraint] [Transform Constraint]を押して固定します。

風を吹かせるには先ほど出来たnucleusノードのアトリビュートを開いて[Gravity and Wind]から風速や吹く方向、動きにノイズを与えたりして風に吹かれているような動きをつけてあげます。

Wind Speed(風速)160
Wind Direction(方向)110
Wind Noize(ノイズ)0.3

メッシュのサイズなどにも寄ると思いますが、今回は上図のようにしてみました。
風速の値がかなり大きめです。

今度はどうでしょう?再生してみて下さい。
風に吹かれているように見えますでしょうか?

思ったような動きにならない場合はパラメータを色々と変えてみて探ってみて下さい。

動きをループさせよう

動きは付いたかと思いますが、このままでは1度再生させたら終わりですよね。
これでは使いにくいですよね。
そこで動きをループさせたいと思います。

まず今の動きのキャッシュを作ります。
800F(フレーム)のキャッシュを作ってみましょう。
メッシュを選択後、[FXメニュー] [nCache] [Create New Cache][nObject]のオプションを開いて下さい。

Cache directoryでキャッシュの保存先、Cache nameでnClothノードのシェイプ、
One fileでジオメトリごとに 1 ファイルとして設定します。
Applyを押すとキャッシュが作成されます。

タイムスライダを前後に動かしてみて下さい。
動きが保存されていましたでしょうか?

このキャッシュを使ってループする動きを作成していきます。
[Windowsメニュー][Animation Editors][Trax Editor]を開いて下さい。

先ほど作成したキャッシュがTrax Editorに読み込まれているはずです。
次に同じキャッシュを別のトラックにインポートします。
[Trax Editor][File][Import Cache]を選択してインポートして下さい。

ここから800Fのキャッシュから400Fのループする動きを作っていきます。
新しくインポートした方のキャッシュを400F分右に移動してみて下さい。

キャッシュ同士が重なっている400F~800Fの部分の前後がつながるように編集してループする動きを作ろうというわけです。

タイムスライダを400Fに移動してキャッシュをアトリビュートエディタで開いてcacheBlendノードを見て下さい。
ここでキャッシュの有効/無効のウエイトをつけることができます。
上のキャッシュを段々と無効にしていき、下のキャッシュを段々と有効にしていくことで、繋がっていないはずの400F前後の動きがつながるという仕組みです。

400Fの部分では上のキャッシュのウエイトを1、下のキャッシュのウエイトを0にしてキーを打ちます。

800Fの移動し、今度は先ほどとは逆に上のキャッシュのウエイトを0、下のキャッシュのウエイトを1にしてキーを打ちます。

Trax Editorで確認して頂くとこのようになっているはずです。

400F~800Fでループする動きになりましたか?

ボーンアニメーションに変換する

頂点アニメーションをゲーム機などで直接再生するのは負荷などの問題で難しい為、扱いやすいボーンアニメーションに変換していきたいと思います。

頂点の位置上などに適度な数でボーン(MayaではJoint)を追加していきます。
その後、各頂点と対応するJointをコンストレインし、頂点が動いたらJointも動くといった状態にします。

一旦、Jointを設置しやすいよう0(ゼロ)Fに戻ります。

頂点を選択後、Jointを選択して[Rigging][Constraint][Point On Poly]を押して頂点の位置にJointをコンストレインします。

回転のコンストレインは必要ない為、コンストレインを[Break Connection]で切ります。
Rotateの値はすべて0(ゼロ)に戻しておきましょう。

Jointも一緒に動きましたか?

旗を移動させることも考えて、JointのルートになるJointを作成し、すべてのJointを子供にします。

Jointを旗のメッシュに[Rigging][Skin][Bind Skin]でスキニングします。
この時ルートになるJointにはウエイトを入れないようにしましょう。

タイムスライダを400F~800Fに戻します。
最後にJointを選択後、[Animation][Key][Bake Simulation]でJointの動きをキーフレームアニメーションにします。

あとは余分なコンストレインやnClothノード、トラックなどを削除したら完成です。

最後に

皆さんいかがでしたでしょうか?
ボーンアニメーションではためかせることができましたでしょうか?
動きの滑らかさはJointの数やスキニングなどを調整することで改善できるはずです。
また、同じようなメッシュであれば工程は同じだと思いますので、Pythonなどを使って自動化できそうです。
色々と試してみて下さいね。
では、また!

コメント

タイトルとURLをコピーしました