UE4にはRigid Body Animation Node(RBAN)と呼ばれる物理アセットを使った軽量物理機能が存在しており、今もよく使われている物理機能です。UE5では物理エンジンがChoasへと標準搭載となり、Rigid Bodyノードは通称Chaos RBANと呼ばれるようになりました。
Chaos Rigid Body Animation Nodes (Beta)
Chaos RBANはPhysXで処理されていた部分がそのままChaosと差し替えられているので一見すると変化がないように見えますが、実際に触ってみると挙動も大きく違っていることがわかります。特にそれまでと比較して安定性が抜群に上がっており、変な挙動をするといったこともほとんどありません。うまく理解して使うと表現の幅が大きく広がります。
Chaos RBANではPhysX RBANにはなかったワールドオブジェクトのサポートや、ワールド空間の動きをあらゆるシミュレーション空間に渡せるようになったため、急激な回転や極端な加速でも安定した動きで動作できるようになりました。
これまでUE4ではキャラクターの物理はKawaii Physicsが使われることがよくありましたが、形状を維持して制御するような物理に対しても非常に有効に働きますので、思いっきり揺らしたい時と、安定して揺らしたいときなどの使い分けも可能です。
github.com
Kawaii Physicsそのものは設定も非常に簡単なので、初心者向けには非常に良い選択肢だと思います。
Chaos RBANはより表現の幅を広げたい中級者以上にお勧めしたい物理です。
今回使用したモデルはバーバラという原神のキャラクターで、公式から配布されているPMX形式のMMDモデルです。様々なバージョンがあり、どれが正しく動くかなどの保証はありません。今回は最新の2.3verのものを使用しています。
www.hoyolab.com
更にこのモデルをVRM4UのPMX読み込み機能を使って読み込んでいます。PMXの読み込みについては解説しませんので、気になる方は調べてみてください。
ruyo.github.io
この記事の解説はUE5.0.3を利用しています。5.1以降ではまた結果が変わってくるかもしれませんので、ご了承ください。
物理アセットについて
Chaos RBANは物理アセットを用いて調整します。物理アセット自体はキャラクターごとにいくつでも追加が可能です。例えば衣服、小物、髪など全て同じ物理アセットとして作るよりも、複数作って個別に制御した方がより扱いやすいケースもあります。
まずは物理アセットを通常通りに作成してください。作成時に物理ボディが既に作成されていた場合は、スケルトンツリーからボディを全て選択して、削除します。
物理アセットを調整する際に、左下のグラフタブが開いていると、大量にボディやコンストレイントを選択する際にエディターの反応が極端に悪くなります。こちらは閉じておくことをオススメします。
次にスケルトンツリーの歯車ボタンから『メッシュボーンを表示』でメッシュに使われているボーンを表示しておくようにします。これで次のボディセットアップへと移ります。
ボディセットアップ
ボディは物理設定を行う上で最も重要な要素です。スケルトンツリーからボーンを右クリックし、『形状を追加』から追加を行います。ほとんどの場合はカプセル形状で間に合いますが、球形状も極稀に使うことがあります。ボックス形状は角張ったものでない限り使うことはほぼありません。テーパーカプセルはクロスを使う時にのみ使用するので、RBANでは使いません。
ボディを追加した後にまずは向きを調整し、更に形状の大きさや長さを調整します。各ボディがどのように当たるかを想定しながら背骨や脚周りなどを中心に作成しておきます。大きさはある程度大雑把でも大丈夫ですが、どのボディがどのボディとコリジョンで当たるのかをよく考えながら追加していきましょう。
髪やスカートなどのチェーンのある物理要素ではそれぞれが連結するようにボディを配置していきます。1つボディを作ったら、ボディを右クリックし『プロパティをコピー』し、先に他のボディを追加してからそれぞれのボディに対して同様に右クリックから『プロパティを貼り付け』で作成する同様の内容をペーストできるのでボディの作成効率が向上します。
ボディを作成したのになぜか反映されないというケースがあるので、一度物理アセットを保存して、再度開いてから作成するとボディが正常に作成されます。
一旦必要なボディが作成できたら次へと進みます。ボディについては最後まで調整仕直すことが多いので、この後の工程を行った後でも必要に応じて何度もボディセットアップすることをオススメします。
KinematicとSimulated
ボディに対して設定できる『Physics Type』には『Kinematic』と『Simulated』の2種類があります。
Kinematicとは運動による変化が生じない完全に固定されたボディの事を指します。固定コリジョンとして利用したり、ヒンジのような仕組みを実装する際に利用します。
Simulatedは運動による変化が生じる動くことが可能なボディの事を指します。揺れるものであれば動的コリジョンとして、衣服や小物など何にでも利用します。
使い分けとしてはベースとなる身体のボディと、揺れものが動く際にチェーンの根本になるような部分はKinematicとし、それ以外の部分はSimulatedを使うことが多いです。
以下では青部分がKinematic、それ以外のボディはSimulatedが設定されています。親ボディで固定を行い、その下にある子ボディがぶら下がっているということになります。
チェーンのあるSimulatedに設定されたボディに対して非常に重要なのが、上から順に『Mass(kg)』プロパティの値を徐々に減らしていき、上位ボディが下位にあるボディを合計した値を越えないように調整することです。特に長いチェーンであれば、先端ほど小さい値を入れておく必要があります。これが出来ていないと下の重さで上のボディが引っ張られて、ボディが落下し続けてしまうという現象が発生します。
またSimulatedのボディに対してはある程度の『Angular Damping』を入れておきます。これは角度移動を制限し、激しく回転した際の動きを軽減してくれます。一般的には10~50程度を入れておきます。
物理の動きがやわらかすぎて、もう少しメッシュの形状を保ったままに動かしたい場合、『Linear Damping』を4~16程度入れつつ、『Inertia Tensor Scale』を1.2~1.5程度入れて調整すると形状を保ちつつも自然に揺れるような物理が実現可能です。前者は強くしすぎると動きが固くなってしまうので、後者の数値でバランスをとるとより自然になります。特に『Linear Damping』は上げすぎると、コリジョンの突き抜けが発生しやすくなるので、注意が必要です。
コンストレイント
コンストレイントはチェーンに対しての拘束条件を設定します。コンストレイントを設定する際には、2つのボディを複数選択した状態で右クリックします。
通常はチェーンとなる親と子を選択し、『選択ボディのコンストレイント』で追加を行ないます。
そのままではコンストレイントが表示されていないので、ビューポート上部の『キャラクター』ボタンからコンストレイントを必要に応じて表示できるようにしておきます。同時にスケルトンツリーの歯車ボタンから『コンストレイントを表示』もやっておきましょう。
コンストレイントには多くの設定がありますが、特に設定しておく必要がある部分のみ解説します。
『Angular Limits』内の『Swing 1 Motion』『Swing 2 Motion』『Twist Motion』を『Limited』にします。これらの調整はそれぞれのLimitの値を変更することで揺れものとして動く軸に制限を加えることができます。Limitの値を変更するか、個別に『Limited』と『Locked』に修正して動きを制限させます。数値の設定がよくわからなければ『Limited』のみ設定しておきましょう。
ある程度調整を加えて、シミュレートで確認を行います。動きが安定しない場合は、『角度モーター』→『ターゲットの向き』内にある『ドライブ』の『SLERP』にチェックを入れて『強度』を強めにすると、ボディが安定しやすくなります。
チェーンとなるボディに一通りのコンストレイントが追加できたら設定完了です。コンストレイントの調整が終わったら、ビューポート上部から設定できるコンストレイントとスケルトンツリーの歯車ボタンから設定したコンストレイントの表示をオフにしておきましょう。
コリジョンの設定
最後にコリジョンを設定していきます。各ボディはどのボディと衝突判定を持つかが設定されていません。ボディを選択すると、選択されたボディ以外はグレーで表示されます。この状態ではどのボディともコリジョンが存在していないということになります。
ここではみやすくするために一時的にキャラクターメッシュは非表示にしています。
複数のボディを選択し、ツールバー上部にある『コリジョンを有効にする』ボタンを押すことで、それぞれのボディがコリジョンを持つようになるので衝突判定が発生するようになります。
コリジョンが設定されてからボディを選択すると、衝突判定を持つボディは薄紫で描画されるようになり、コリジョンが設定されていることになります。逆にコリジョンを無効化したい場合は再度複数のボディを選択し、『コリジョンを無効にする』ボタンを押すことでコリジョン情報を削除可能です。
互いに干渉したいコリジョンのみ設定しておくことでより細かい物理調整を行うことができます。スカートやコートなど、身体に当たるようなコリジョンは背骨や脚に大きめのカプセルボディコリジョンを用意し、チェーン要素のあるものは小さめで互いにはコリジョン判定を設定せずに、背骨や脚周りのカプセルボディとコリジョンを設定しておきましょう。
Rigid Bodyノード
最後にゲーム内で物理を確認するためには、各キャラクターのAnimBP内にRigidBodyノードを作成しておく必要があります。ノードグラフ内に配置し、『RigidBody』ノードを選択し、『Overrid Physics Asset』から作成した物理アセットを選択します。これで物理アセットの効果がゲーム内で始めて発生します。
『Sim Space Settings』はシミュレーション空間における影響力の効果を設定します。
『マスターアルファ』の数値を上げることで、シミュレーション空間における影響力を変化させることができます。0の場合、完全にローカル空間のみでのシミュレーションとなり、数値を1に設定すると完全にワールド空間でのシミュレーションになります。『最大直線速度』『最大角速度』『最大直線加速度』『最大角加速度』を設定することで、シミュレーション空間における物理の影響力を制限させることができます。通常、それぞれの値は10から100程度で設定します。
『外部直線抗力V』『外部直線速度』『外部角速度』は外部から別の力を加えたい時に設定します。主な利用方法としては風などの効果がメインです。必要に応じて力を外部から加えたい場合にはこちらの値を調整することになります。特に外部から変化を与えたいという場合でなければ設定は不要です。
PostProcess Animationブループリント
PostProcess AnimationブループリントにRigidBodyノードが入ったAnimBPを設定しておくことで、物理の効果をアニメーションエディター内などあらゆる箇所で確認ができるようになり、便利です。
設定方法はスケルタルメッシュの設定から、『Post Process Anim Blueprint』に作ったAnimBPを設定しておくだけです。
設定後に『ポストプロセスアニメーションブループリント"XXX_XXX"は実行中です。』という表示がでていれば物理が正常に実行されているはずです。
トラブルシューティング
Q. なぜかボディを設定したはずなのに、エディター上で確認ができません
A. 物理アセットエディターがUE5.0.3時点で不安定がことが多いです。おかしいと思ったら保存して、一度物理アセットを閉じてから再度開いて編集してみましょう
Q. どうやってもなぜかボディが伸びてどこかへいってしまいます
A. チェーンの子で1つでもMassが親よりも重くなっていないか確認してください。重いボディが1つでも存在すると伸びてどこかへいくことがあります
Q. 物理の揺れが激しすぎる
A. 『Inertia Tensor Scale』のXYZに1.2~1.5程度入れてみてください。
Q. モーションの動きが速くて服を突き抜けます
A. 1フレームで瞬間的に大きく動くモーションはコリジョンをどうやっても突き抜けます。モーションの動きを抑えるか諦めてください
Q. 物理がめちゃくちゃ荒ぶります
A. イベントシーンでカットが変わったりして、一瞬でワープしてませんか?AnimBPでReset Dynamicsノードを呼び出して『In Teleport Type』で『Reset Physics』を呼び出してください
Q. 物理アセットをもっと簡単に設定したい!!
A. 面倒ですが、がんばって設定してください。ボディやコンストレイントのプロパティはコピーできます。可能な限りコピペを駆使して少しでも楽にできるよう考えてみてましょう
まとめ
Chaos RBANは国内、国外ともにほとんどノウハウが見当りません。元々UE4でのPhysX RBANも数が少なかったです。
今回、自分で検証した内容を可能な限りまとめてみました。これで完璧に設定できるとは思いませんが、ある程度はこの通りに作るだけでも動くものができると思います。
ぜひうまく活用して色んな物理の動きを楽しんでください。
Chaos RBAN(Rigid Body Animation Node)のみで、髪、服、スカーフの物理を全て調整。UE5から安定性が抜群に上がっているので極端に暴れることもなく非常に難易度が高いスカートでも十分見れる品質。詳細は後日にでも。モデルは原神公式より。 #UE5 #UE5Study pic.twitter.com/0JEXJanguk
— alwei (@aizen76) 2022年10月30日