ぼっちプログラマのメモ

UE4とかUE5とかについて書いたり書かなかったり。

「UE4.18で生まれ変わった物理アセットエディタ(Physics Asset Editor)について」 と 「物理と少し仲良くなる方法について」 その2

qiita.com
本記事はUnreal Engine 4 (UE4) Advent Calendar 2017の13日目の記事です。

長くなっちゃったので、3つ記事分割しました!
その1:http://pafuhana1213.hatenablog.com/entry/2017/12/13/000000
その2:ここ
その3:http://pafuhana1213.hatenablog.com/entry/2017/12/13/003018

追記:
2018年も物理と仲良くなる方法について書きました!
pafuhana1213.hatenablog.com

この記事ではグレイちゃんのツインテールに物理をつける作業を通して、どういう流れで物理アセットを作っていくかについて説明します。

作業に取りかかる前に

早速色々パラメータ調整をしていきたい所ですが、まず少し落ち着きましょう!
f:id:pafuhana1213:20171212214803p:plain

物理アセットの初期状態は↑のようにBodyがびっしりと配置されています。これはこれで便利な時もあるのですが、今回のように特定の部位だけに物理を適用したい場合は作業の邪魔になります。さらに、不要なBodyは処理負荷の観点からもオススメできません…

なので、不要なBodyは消すか、全Bodyを消して必要なBodyを新たに作成しましょう!今回はBodyの追加方法を説明したいので後者の手順でいきます。全消しは簡単で、Skeleton Treeの項目を全選択してdeleteするだけです。

Bodyの追加

今回はツインテを揺らしたいので、頭とツインテにBodyを付けます。
f:id:pafuhana1213:20171212220408g:plain

この右クリックメニューから追加できるBodyですが、エディタ右下にあるToolsのBody Creationの部分で形状・条件を設定する事が可能です。
f:id:pafuhana1213:20171212220702p:plain

Bodyの物理ONOFF

次に、どのBodyを物理で揺らすのかを設定します。Bodyは全て物理で揺れるものという訳ではなく、物理では動かないコリジョンのためのBodyも用意する必要があります。
f:id:pafuhana1213:20171212221202p:plain
f:id:pafuhana1213:20171212221223p:plain
ON・OFFの設定は詳細パネル 又は 右クリックメニューの Physics Typeで設定します。

  • Default : 親(Skeletal Mesh Component)のSimulate Phyiscs設定に従う
  • Kinematic:物理OFF
  • Simulated:物理ON

今回は頭はKinematic、ツインテはSimulatedに設定します。

ちなみに、Kinematic設定になっているBodyはアイコンが変わります。
f:id:pafuhana1213:20171212221513p:plain
超分かりやすい!!!

ここまでの結果がこんな感じです
f:id:pafuhana1213:20171212221824g:plain

暴れん坊将軍なので、次はConstraintの設定をしていきます。

Constraintによる回転制限

Constraintを使うことで、物理によるBodyの回転を制限する事が可能です。デフォルトでは以下のようにXYZ軸全てにおいて制限無しになっています。そりゃ荒ぶる…
f:id:pafuhana1213:20171212222718p:plain

ちなみにConstraintの回転制限の表示に関しては、Showのここから切り替え可能です。
f:id:pafuhana1213:20171212222238p:plain

今回は前後に揺れるような髪の動きにしたいので、前後の1軸でのみ動作するように制限を掛けます。回転の制限はConstraintの詳細パネルにある「Angular Limits」から設定可能です。
f:id:pafuhana1213:20171212222830p:plain

完全に制限する場合は Locked、一定の角度に制限する場合はLimitedに設定します。

さらに、その下にあるSoft ConstraintをOFFにします。この設定はバネのような表現をするためにConstraintを緩和するものなのですが…「個人的な印象ですが」 有効だと荒ぶることが多いです。なので、今回はOFFにしておきます。
f:id:pafuhana1213:20171212225852p:plain

で、設定した結果がこれ
f:id:pafuhana1213:20171212223558g:plain

一気にいい感じになりましたが、ツインテの根本部分がプルプル震え続けています。次はこれを抑えます。

Primitive同士の重なり・衝突を削減

f:id:pafuhana1213:20171212223914p:plain
上の画像はツインテの根本の部分で、複数のBodyが持つPrimitiveが重なり合っているのが確認できます。これは非常に悪い状態で、物理が始まるとお互いを弾き合います。すると、物理開始直後に荒ぶったり常にプルプルするという好ましくない挙動になりがちです。また、Primitive同士の衝突頻度が高い状態もあまり好ましくありません。

その為、各Primitiveの大きさを調整する必要があります。調整の手法は2パターンあって、まずはPrimitiveをいつものGizmoを使って調整する手法があります。
f:id:pafuhana1213:20171212224433p:plain

次に、Bodyの詳細パネルから直接数値を入力して調整する手法です。
f:id:pafuhana1213:20171212224703p:plain

少し余談なのですが、↑の画像にある Consider for Boundsには是非注意して下さい。この設定が有効になっている場合、そのBodyが持つPrimitiveは Skeletal Meshのバウンディングボックスの計算に使われます。デフォルトは有効になる為、Skeletal Meshがアニメーションによってシルエットが変化しても、その形状に応じたバウンディングボックスが作成されます。しかし、もし何らかの物理挙動を実現するために超特大のPrimitiveを作成した際に問題になります。Skeletal Meshの見た目よりも遥かに大きなバウンディングボックスが作成されるため、カリング計算など様々な面で支障が生じる可能性があります。そんな時に役立つのが、このConsider for Boundsフラグです。もしSkeletal Meshのバウンディングボックスが物理アセットが原因でおかしくなっている場合はこの設定を調整してみて下さい。

で、結果がこちら
f:id:pafuhana1213:20171212230311g:plain

このgifだと分かり辛いとは思いますが…かなり安定しました!
これで終わり!
物理アセットの調整終了!!!


f:id:pafuhana1213:20171212231018j:plain
と言いたい所ですが…フレームレートが低下したり、急激な動きが発生すると荒ぶることがあります…
次の記事はその荒ぶりを可能な限り回避するためのTipsを紹介していきます。