qiita.com
本記事はUnreal Engine 4 (UE4) Advent Calendar 2017の13日目の記事です。
長くなっちゃったので、3つ記事分割しました!
その1:http://pafuhana1213.hatenablog.com/entry/2017/12/13/000000
その2:http://pafuhana1213.hatenablog.com/entry/2017/12/13/000100
その3:ここ
追記:
2018年も物理と仲良くなる方法について書きました!
pafuhana1213.hatenablog.com
この記事では物理の荒ぶりを避けるためのTipsを紹介していきます。
今更ですが…
色々紹介する前に…先に言わないといけないことがあります…
どんな状況でも荒ぶらず意図通りに動作する物理挙動は
ほぼ不可能だということを念頭に置いて下さい
例えば低フレームレートの環境では物理は必ず荒ぶります。また、テレポート移動などで物理で動く部分が壁などにめり込んだ場合は荒ぶる可能性が非常に高いです。このように状況によっては荒ぶる可能性があることを考慮して下さい。逆に言うと、荒ぶりを避けるために高フレームレート(60fps)を維持するようにしたり、めり込みを引き起こすような仕様は避けるなどの対応を入れるべきです。
また、物理は同じ条件であっても挙動が変化するケースが多いです。なので、カットシーンにおける物理による髪の動きを常に同じにしたい!といったことは実現するのが非常に難しいです。
(UE4.17から入ったプロジェクト設定のPhyiscsカテゴリにあるEnhanced determinismがそれを助けるかもしれませんが…未検証です。)
もし物理挙動を完璧にコントロールしたい場合は、物理挙動をベイクしたアニメーションを使用することを検討して下さい。その際は、その1で説明したアニメーションの録画機能を使ったり、MayaなどのDCCツールで物理挙動をベイクすることになると思います。
または、手付けでサクッと作った方が早いケースや、少し負荷がありますがAnimationBPでIK処理を組んでそれっぽく見せることも候補にいれるべきなのかもしれません。
物理の安定性、処理負荷、そして調整コストなど色々と考慮すべきことがあることに注意するようにしましょう!
…以上!では、楽しいTips紹介へ
Inertia Tensor Scale
今回物理アセットの記事を書こうと思った理由がコイツです!
新規:RigidBody Anim Node の改善
RigidBody ノードにルートボーンのシミュレーション空間のオプションが追加されました。アタッチされたスケルタルメッシュをプレイヤーのカプセルと逆向き回転させる場合に便利です。さらに、物理アセットエディタに慣性スケーリングとコンストレイント ドミナンス (優勢) を適用することで、安定性とジッターが大幅に改善されました。
これは4.18リリースノートの一部です。この中の慣性スケーリングがBodyの詳細パネルにあるInertia Tensor Scaleにあたります。
この値を上げることで、慣性による物理挙動を制限する事が可能です。それの何が良いのかというと…フレームレートの低下や急激な動きの変化などによる物理の荒ぶり具合を抑制してくれます!
かなりの効果がありますので、どうしても物理が荒ぶる場合は一度この値を上げてみて下さい。デフォルトの1.0から1.1や1.3に上げるだけでも効果が十分あります。ただし、値を上げすぎると普段の物理挙動も抑制されるため、少し硬い動きになる可能性があることに注意して下さい。
Parent Dominates
先程のリリースノートの文章にあったコンストレイント ドミナンス (優勢) が、Constraintの詳細パネルにあるParent Dominatesにあたります。
これを有効にすることで、その子要素の動きによる影響を無視することができます。ですので、今回のツインテのように先端部分が物理で振り回されるような場合は、根元部分のParent Dominatesを有効にすることで挙動が安定化する可能性があります。
Projection Linear / Angular Tolerance
先ほどと同じくConstraintが持つこの2つのパラメータは、物理挙動の誤差を補正する処理で使われる閾値です。この値を超えると補正処理が走るようになるので、もし荒ぶりがひどい場合はこの数値を上げてみると改善される可能性があります。ただし普段の挙動にも変化がある可能性もあるのでご注意下さい。
Position / Velocity Solver Iteration Count
これはBodyが持つパラメータの一つです。この値を上げることで物理挙動における計算回数を増やすことができ、その結果物理挙動が安定します。しかし、計算回数が増えるためCPU負荷も増えるのでご注意下さい。
Use CCD
これもBodyが持つパラメータです。Use CCD(Continuous Collision Detection)を有効にすることで、Primitiveの突き抜けの発生を抑制できます。しかし、こちらも負荷が増えるためご注意下さい。
Max depenetration velocity
これもBodyが持つパラメータです。この値が設定されている場合、Primitive同士が重なり合った際にその設定した速度で反発するようになります。なので、この値を低めに設定しておくことで、運悪く重なり合った際の荒ぶりを抑制出来る可能性があります。
実はStatic / SkeletalMesh Componentにも同じ設定があります。
上の動画はMax depenetration velocityを設定することで、物理が有効になっているCube同士が重なり合っている状態で実行した際の挙動がどう変わるかのデモです。左がデフォルトの0、右がMax depenetration velocityを1に設定した状態です。見ての通り、Max depenetration velocityを設定することでゆっくり離れていくようになります。
ただ…物理的には正しくない挙動なので使い所は少し限定されるかもしれません。
Contact Distance
こちらはConstraintが持つパラメータです。正直な所あまり理解できていないのですが、この値を上げることで早く衝突判定が行われるようになり、物理挙動の安定性が向上します。しかし、お約束ですが負荷も向上するのでご注意下さい。
ちなみに、Contact Distanceの値はProject設定のPhysicsカテゴリから一括で補正をかけることが可能です。
Substepping
Project設定のPhysicsカテゴリにあるSubsteppingを有効にすることで、物理の挙動が安定します。かなり効果があるのですが、こちらもCPU負荷が向上するのでご注意下さい。
Unreal Engine | 物理サブステップ機能
小さすぎるオブジェクトは物理を有効にしない
PhysXに渡す値の関係で、小さすぎるオブジェクトに対して物理を有効にすると安定しない可能性が高いようです。もし小さいPrimitiveが含まれる場合は削除した方が良いのかもしれません
ルートから遠ざかる程、質量(mass)を減らすようにする
こうすることで大幅な動きを避けることができるため、急に動きが変化した際の挙動を抑えられる可能性があります。Massの値はBodyから変更可能です。
急激な位置・向きの変化は避ける。又またはTeleportフラグを使う
例えばSet Actor Location / Rotationを使って1フレームで急激に位置・向きを変えた場合、物理計算が破綻し挙動がおかしくなります。その為、そういった急激なTransform更新は避けましょう。または、Teleportフラグを有効にしましょう。