Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4 Anim Dynamicsを使ってアニメーションに物理を入れる

UE4.11の新機能にAnim Dynamicsというシンプルで高速な物理シミュレーションをスケルタルアニメーションの中に導入できる機能が実装されました。

これの良いところはまず『高速であるところ』、次に『物理機能として独立している』、更に『ボーン単位で細かく調整可能』といったところです。

逆に欠点は『シンプルな調整しかできない』というところです。シンプルなので複雑な当たり判定をつけるといったことはできません。様々なものと当たり判定をとりたいといった場合には既にUE4内にある物理アセットを使って調整しましょう。

では早速解説していきましょう。

Anim Dynamicsノードとは

今回使用するAnim DynamicsノードはアニメーションブループリントのAnim Graphで利用可能なノードです。ノード自体は入力ピン2つと出力ピン1つと非常にシンプルです。

f:id:alwei:20160403193635p:plain

"Component Pose"ピンには現在実行しているアニメーションポーズ情報を接続します。"Alpha"にはそのポーズが実際に物理の影響を受ける総量を"0から1"の間で設定します。その結果が右の出力ピンから出力され、"Final Animation Pose"などのピンへと接続をします。


これだけであれば設定は簡単ですが、Anim Dynamicsノードは選択をした状態にすると大量のプロパティが詳細パネルに表示されていることがわかります。

f:id:alwei:20160403194405p:plain

"Preview"カテゴリーにはどの情報をビューポート上のアニメーションしているキャラクターに表示をさせるかを選択します。特に理由がなければ全選択でも問題ありません。

次に"Setup"カテゴリーでは物理のセットアップを行います。ここがAnim Dynamicsノードのメインといっても間違いはないでしょう。
"Wind"カテゴリーはその名前の通り風に関する設定ですが、あまり気にする必要はないでしょう。よほど強風を演出したいというわけでなければデフォルト設定のままか、切ってしまっても問題はありません。
"Constraint"カテゴリーでは物理に対するコンストレイント(拘束)をつけます。ある程度の動きの制限をつけることがで可能ですが、よほど動きが激しいとかでなければそのままでも問題ありません。
"Planar Limit"カテゴリーではPlanarという平面コリジョンを配置することができます。平面コリジョンのみですが、ボーンに対してアタッチすることが可能で、場合によっては物理の動きを制限したいという場合にとても役立ちます。

主にこれらの設定を使って物理のセットアップを行っていきます。

ボーンに対して物理のセットアップを行う

それでは早速物理のセットアップを行っていきましょう。
まずはアニメーションノードとFinal Animation Poseノードの間にAnim Dynamicsノードを配置して接続します。

f:id:alwei:20160403195512p:plain

接続しようとすると自動的に"Local To Component"ノードと"Component To Local"ノードが配置されます。一度ローカル情報からコンポーネント情報に変換してから物理の処理を行うからです。終わると再度ローカル情報に変換して戻します。これでAnim Dynamicsノードが働くようになりました。

次にAnim Dynamicsノードをクリックして選択し、Setupカテゴリーに注目します。この時予めPreviewカテゴリーのチェックボックスは全ていれておいてもいいでしょう。
まず複数のボーンに対して物理の影響を与えたい場合は"Chain"にチェックを入れておきます。次に"Bound Bone"を物理の開始ボーンを設定します。ボーン自体がひとつであればこれだけでいいですが、ほぼ必ず複数ボーンが影響を与えるので、"Chain End"に影響を受ける階層的に子供のボーンを選択します。

f:id:alwei:20160403200422p:plain

次に"Box Extents"にそれぞれのボーンの当たり判定となるボックス範囲を設定します。"Local Joint Offset"にはボーンからの位置オフセットを設定します。もし物理によって伸びが大きすぎると感じた場合には、Zに少しだけ値を入れてあげると改善するかもしれません。これらの設定をした状態でビューポートに注目するとBox Extentsのコリジョン範囲が表示されます。

f:id:alwei:20160403200732p:plain

この当たりはメッシュと直接とっているわけではなく、あくまでも設定したボーン同士でのみの当たりです。なので場合によってはメッシュの身体にもめりこんでしまいます。これらを回避したい場合にはPlanarを設定するか、物理アセットによる細かい調整が必要となります。今回は髪全てに対してこの調整を行っていきました。その結果が以下のようなものです。

こちらは別アニメーション。

このように使い方を理解してしまえば、使用するのはそこまで難しくありません。"Alpha"には実際どの程度物理の影響を受けるのか、見ながら調整をしてあげるといい感じになると思います。

Planar Limitを使って動く範囲を制限

Planar Limitを使うと指定したボーン上に平面コリジョンを配置することができます。これを利用することにより、メッシュ内へのめり込みを抑えることが可能です。

f:id:alwei:20160403201712p:plain

上記のような設定を入れておいて、Previewで"Show Planar Limit"をチェックしていると、ビューポートに平面コリジョンが表示されます。

f:id:alwei:20160403201921p:plain

これで上手く制限をしてあげれば、あくまでも平面のみですが、メッシュ上へのめり込みを抑えることが可能です。これ以上に複雑なコリジョンを設定したい場合には、物理アセットとの併用が必要です。Anim Dynamics側ではあくまでもシンプルな軽量コリジョンのみを使うことをポリシーとしているので。

結果このような感じ。

複雑なコリジョン以外はいける

Anim Dynamicsの使い方を解説してきましたが、今回思ったのは案外複雑なコリジョンでなければ結構いけると感じました。
逆にものすごく複雑なコリジョンを判定したい場合にはかなり使いづらいと思います。大雑把でもよければAnim Dynamicsを使用し、複雑な当たり範囲を設定してあげたい場合には物理アセットを利用することをおすすめします。