当たったらどうすんだよ

当たらなければどうということはない

ZBとBlenderでUE4用のキャラを作る #10:Blenderキャラに物理で動く揺れモノを!

番外編で「予想していたトラブルに遭遇したけどなぜか外出して帰ったら勝手に解決した!」経緯を書きました。というわけで、ぼくが番外編で書いたように「物理をオンにしたらボーンがひっくり返ったよ!?」みたいな状況に陥ったら「PCごと再起動」してみてください。昔から続く万能の「おまじない」です。

ソースのご紹介

最初に、今回の記事を作成するにあたり、参考にさせていただいたソースを紹介いたします。

unrealengine.hatenablog.com

pafuhana1213.hatenablog.com

docs.unrealengine.com

特にalwei(Twitter id @aizen76)さんにはいくつか質問もさせていただきました。ありがとうございました。

ワサビミドリさんの骨

f:id:kanianthi:20160614222337j:plain

↑画像で示した通り、すでにワサビミドリさんにはモーションがつき、FBX6.1ASCIIでエクスポートも終わっています。この、オサゲ左右に今回はAnimDynamicsノードを利用して簡易物理シミュをつけたいと思います。

もともとUE4内で揺らすつもりだったので、オサゲや前髪に骨は入れましたがモーションはつけていません。なお、もともとはアーマチュアモディファイヤの下に「修正スムーズ(Corrective Smooth)モディファイヤを付けて変形補正をしていたのですが、どうやらUE4では修正スムーズの結果が反映されないようですので、現在のシーンファイルでは外しています。

そのため、若干変形補正用のコンストレインツの付け方やパラメータにも変更を加えました。この辺はサンプルファイルを完成品と捉えず、皆さんで研究していただけたら、と思います。

UE4での基本セットアップ

すでにFBXは用意してありますので…

  1. UE4へのスケルタルメッシュインポート
  2. ThirdPersonAnimBPのリターゲット
  3. 各アニメーションの更新
  4. マテリアルの作成

などの基本的な作業は「すたちゅーさん導入記事」と同様です。

kanianthi.hateblo.jp

ここではそれ以降の部分を解説します。

AnimDynamicsノードをアニメーションブループリントに付け足す

f:id:kanianthi:20160614223725j:plain

↑では同じ「アニムダイナミクス」ノードが二つ並んでいますが、上が左のおさげ用で下が右のおさげ用です。パラメータについても左右が反転しているだけで同じものです。また、こうしたノードの複製はコピペでもいけますので便利です。

また、画像は「walk/Run」ステートになっていますが、AnimDynamicsは、おそらくアニムグラフそのものにもつけられそうですがまだ試していません。とりあえず実験、という意味で、単一ステートではもっとも動きに変化のあるwalk/Runで作業してみました。というか…

f:id:kanianthi:20160614225210j:plain

言ってるそばから、どうせなら修正しておきましょう!とアニムグラフそのものにAnimDynamicsさせる修正を行いました。重複するのでwalk/Runステート内のノードは削除しておきます。

f:id:kanianthi:20160614225339j:plain

続いて、アニムダイナミクスノードを選択すると右ペイン下の詳細パネルに出てくるパラメータを指定します。まずはおさげの根元と先っぽを「チェーン」で指定し、連続した動きになるように設定します。

次に重要なのはBox Extentsという物理シミュ用のダミー立方体の大きさとLocal Joint Offsetによる物理ジョイント位置の補正です。

f:id:kanianthi:20160614230107j:plain

番外編記事でも書いたように、ワールドの座標系とは違い、ボーンのローカル座標軸は「ロール方向がX」になります。つまりボーン軸から見て前(ノーマル方向)がXです。

UE4で描画されるボーンの位置は、Blenderでセットアップした時と比較して「ボーンひとつ分」後退していることが多くなります。これはUE4でのボーン位置は相対的なモノであって、Blenderでモーションをつけるときに行うメッシュとの関係性とは異なるために生じる問題のようです。

f:id:kanianthi:20160614231058j:plain

↑つまりこんな感じ。

upperArmボーン(上腕)がどう見ても肩になっちゃっています。しかし動かすと正常に腕が動きます。なぜこんなことに?というと、LeafBoneと呼ばれる終端ボーンがないからなのですが…とりあえずそこは本題と離れるので今回は割愛し、とにかくモデリングしたときとUE4のボーン位置はズレる。でもBlenderで作ったアニメーションを再生するだけなら問題なし!と覚えておけば十分です。

しかし今回のように、物理シミュレーションはUE4内で生成される動きですから、ある程度ボーン位置を補正しておかないと結果がおかしくなり、異常にリグが暴れたりする結果を招くのです。

物理コンストレインツと簡易コリジョン

まず最初に、今回のセットアップでは

  • X回転はボーンのロール(ねじれ)
  • Y回転は横の揺れ(ヨー)
  • Z回転は縦の揺れ(ピッチング)

となることを理解しておきましょう。

物理シミュは楽しいのですが、好き勝手に物理させておくとあり得ない動きになってしまいます。そこでコンストレイントをかけて動きを制限するのですが、どのようにパラメータをつければ狙った動きになるのか、最初にそれぞれの軸回転の「表現」をイメージしておくことがモーションデザインでは重要です。

f:id:kanianthi:20160614232718j:plain

↑コンストレイント関係はこんな感じです。

Linearは距離でAngularは角度の制限です。それぞれの数値がどう動きになるのかイメージしながら実験し、狙った動きになるまで数値を煮詰めます。おさげがあんまり下に向いて欲しくなければ、正方向の角度制限をきつくすれば良いのではないでしょうか。

最後にPlanar Limitという平面コリジョンを設定します。

今回は胴体(というか胸rib)につけるかと思ったのですが、上腕につけた方が動的な印象が良かったので左右の腕にコリジョンを設定しました。

f:id:kanianthi:20160614233342j:plain

↑画像の半透明緑色の板キレがPlanarLimitです。

妙な青い矢印状のなにかがついていますが、コリジョンの裏表を表示しています。物理シミュを行うボーンに対して、平面コリジョンが裏側を向いていると結果が暴れるのでPlanar Transformの数値でキャラクタに対して後ろを向くようにコリジョンを設定します。(実は最初これが分からなくて暴れる物理にヤキモキしましたw)

以上の設定で呆気なくBlenderで作成したキャラに物理で動く揺れモノが設定できました。数値は作業途中のものですので、サンプルファイルをDLした方は好きなように変更して実験してみてください。

最後にサンプルプロジェクトへのリンクです。

1drv.ms

ワサビミドリさんのBlenderファイルとFBXなどはこっち

1drv.ms