現在弊社でシューティングゲームを開発中です。銃を撃ち、弾丸が看板などにあたったらFS_MasterFieldを発生させ、物理的な反応を看板にさせようと考えています。
サンプルにある看板のように、ボーンの構成をなるべくシンプルにしており、そこに物理アセットを追加。さらにスケルタルメッシュにはポストプロセスアニメーションブループリントを設定し、そのブループリントのAnimGraphではRigidBodyを設定ています。
サンプルでは看板及びFS_MasterFieldを配置し、FS_MasterField(の子ブループリント)は毎フレーム物理的な力を与えるように設定しています。
初期状態は以下のようになっており、この状態であれば看板が揺れます。
[Image Removed]
ですが以下のように少し下にずらすと揺れなくなってしまいます。
[Image Removed]
この揺れない原因が良く分からず、ボーンの構成や物理アセット(コリジョン)の追加などを試したのですが揺れませんでした。
コリジョンが設定されているボーンに近いほど反応が良くなりますので、FS_MasterFieldはボーンに対して力を加えるということでしょうか? もしくは看板のどこでもFS_MasterFieldが発生しても揺れるようにする方法は無いでしょうか?
<br/>
何卒宜しくお願い致します。
再現手順
お送りしたプロジェクトサンプルを展開し、Project_Sample.uprojectを実行してください。
ThirdPersonMapが開きますので、表示されているFS_MasterFieldの位置を適宜変えていただいてPIE実行してください。
見ていただきたいサンプルデータは全て/All/Game/Developers/kano/Signboardにあります。
フィールドは対象の剛体の質点に対して影響を与えます
サンプルプロジェクトではAnimNodeのRigidBodyノード(ImmidiatePhysics)で動作しており、このノードではボーンの基点に対して質点が設定されてフィールドが適用されています。(FAnimNode_RigidBody::UpdateWorldForcesのPerSolverFieldのifブロック内を参照してください)
そのためコリジョンなどは参照されておらず、マスターフィールドがメッシュのどこに触れても動作するようにすることはできません。
余裕を持った大きなフィールドで制御する必要がございます。
フィールドシステムが対象とする位置は通常オブジェクトの原点です。オプションとして剛体の重心を利用するようにMetaDataFilterを設定することが可能です。
ただしRigidBodyノードではこの設定は参照されず、ボーンの基点を収集します。
[Image Removed]
フィールドシステムはご説明申し上げた通り、大量にサンプルされた点を対象に外力を与える仕組みのためコリジョンを参照させることはできません。
コリジョンを参照したいのであれば、オブジェクトに対してSimulatePhysicsを有効にして(RigidBobyノードを利用しません)通常のコリジョンクエリを使って対象の剛体を取得しAddImpulseAtLocationなどのAPIを通じてコンポーネントに外力を与える方法が検討できると思います。
回答ありがとうございました。大変参考になりました。これらの情報を元に対応していきたいと思います。
こちらの質問はクローズしていただいて問題ありません。
何卒宜しくお願い致します。