いつもお世話になっております。
キャラクターの揺れものをAnimDynamicsからRigidBodyに置き換える検証を進めていて、効果的に動くようになってきたように見えます。
ただし、シーケンサーでサブシーケンス(Shot)にてSpawnableにしているキャラクターが、カット切り替わり時(Shot切り替わり時)に物理が激しく暴れており、困っています。
※Spawnableにしていますので、そのキャラクターが生成&配置されるタイミングかと思います。
そこで、ResetDynamicsを使ってみたのですが、全く変化が無い様で、これについて何かアドバイスを頂けないでしょうか。
こちらのサイトは参考にしました。
http://pafuhana1213.hatenablog.com/entry/2018/12/20/155353
以下、試してみた事です。
・アニメBPに RigidBody ノードは入れています。
・RigidBodyノードのSimulation Space を Wrold Space or Component Space に変更すると、揺れものが揺れる挙動は若干変わるので、RigidBodyノードが活きているようには思えます。
・RigidBodyノードのAlphaを試しに 0.0 にしても挙動が変わらず、揺れています。
(Alphaを0.0にすると物理挙動が無くなると思っているのですが、それは合っていますか?)
・Spawnableアクタの生成タイミングと思われるときに激しく暴れるので、アニメBPのBegin Playイベントで ResetDynamicsノードを繋いでみたが、全く変化がありませんでした。
Reset Physics にしても Teleport Physics にしても変化はありませんでした。
・試しに、アニメBPの Update Animation イベントでResetDynamicsノードを繋いでみましたが、これでもカット開始直後に揺れものが暴れる現象は変わりませんでした。
また、リセットし続けていと思うのですが、カット開始後しばらくしてもふんわり揺れています。
以上
よろしくお願いします。
お世話になっております。
・RigidBodyノードのAlphaを試しに 0.0
にしても挙動が変わらず、揺れています。
(Alphaを0.0にすると物理挙動が無くなると思っているのですが、それは合っていますか?)
RigidBodyノードのAlphaを0.0にすると、仰る通りRigidBodyノードによる物理処理は走りません。そのため、おそらくなのですが、SkeletalMeshに設定されているPhysics Assetが働いてしまっているのかもしれません。

何れかのBodyのPhysics TypeがSimulatedに設定されているPhysics Assetが上図の部分で設定されている場合、Rigid Bodyノードとは別にPhysics Assetを使った物理処理が働いてしまいます。そのため、例えばRigid Bodyノードに指定しているPhysics Assetと上図の部分で設定されているPhysics Assetが同じものの場合、ご報告頂いた「Alphaを0.0にしても物理挙動が止まらない」「Reset Dynamicsノードを使っても変化がない」といったことが発生します。
まずは、SkeletalMeshに全てのBodyのPhysics TypeがKinematicに設定されたPhysics Assetを設定、またはPhysics Assetを設定しない状態にした場合に挙動が変化するかご確認いただけますと幸いです。
よろしくお願いいたします。
お世話になっております。
回答ありがとうございます。
ちょっと、根本的に誤解していたかもしれません。
確かに、現在、おっしゃる通りこのように設定しております。
・SkeletalMesh に PhysicsAsset を設定
・PhysicsType は Simulated に設定
・AnimBPでは RigidBody ノードを使う
こちらのページを参考に設定してみたのですが
上記設定で、PhysicsAssetで設定した物理パラメータが、Immediate Mode PhysX API を使用した高速な物理シミュレーションになるものと思ってしまっていました。
このようにしたい場合は、PhysicsType = Kinematic にするのが正しいのでしょうか?
以上
よろしくお願いします。
お世話になっております。
教えて頂いた方法を確認してみました。
・SkeletalMeshにはKinematicのPhysicsAssetを設定。
・AnimBPの RigidBody ノードには Simulated の PhysicsAsset を設定。
これで、期待通り、RigidBodyのAlphaの値で強弱をつけたり、ResetDynamicsで動作が変化するようになりました。
ありがとうございます。
確認ですが、私の方で元々設定していた、SkeletalMeshにSimulatedのPhysicsAssetを設定して、AnimBPにはOverwritePhysicsAssetを設定しない場合、どのような動作になっていたのでしょうか?
(a) Simulatedでの物理計算と、RigidBodyによるPhysXの物理計算で2回処理されていた?
(b) RigidBodyによるPhysXの物理計算は行われていなかった?
さらに追加で質問させてください。
アニメBPを共通化したいので、SkeletalMeshのPostProcessAnimBPにRigidBodyノードを指定、かつ、そのスケルタルメッシュ用のSimulatedなPhysicsAssetを設定してみました。
共通のアニメBPの方からは、RigidBodyノードを削除しました。
これ自体は動作しました。
つぎに、SimulatedSpaceを WorldSpaceに変更したところ、モデル生成時に揺れものが激しく暴れます。
そこで、RigidBodyノードのalphaを0.0→1.0に変化させて、その挙動を抑制してみました。
アニメBPでこの処理を行った時はきれいにまとまったのですが、これをSkeletalMeshのPost process animBP に記述した場合、激しく暴れてしまいました。
アニメBPで記述した場合と、PostProcessアニメBPで指定した場合で、挙動が変わってしまうような理由はありそうでしょうか?
以上
よろしくお願いします。
お世話になっております。
・USkeletalMeshComponent::SetAllBodiesSimulatePhysics(false)
こちらでアニメBPも流用できましたし、WorldSpaceにしてもαで抑え込むこともできましたので、これで運用していこうと思います。
> Animation BPにてRigid Bodyノードはどの位置に配置されていますでしょうか?
コンポーネント空間で目線や首の制御を行った後、最後にRigidBodyを呼んだ後でローカル空間に変換して、Final Animation Pose に接続しております。
この件については中途半端になってしまいましたが、ひとまず問題ありません。
長々とお付き合いいただき、ありがとうございました。
以上です。
お世話になっております。
上記設定で、PhysicsAssetで設定した物理パラメータが、Immediate
Mode PhysX API
を使用した高速な物理シミュレーションになるものと思ってしまっていました。
はい、その通りです。ただ、はじめの回答にある画像の箇所に「PhysicsType = Simulated に設定されたPhysics Asset」が指定されている場合、RigidBodyノードとは別に物理処理が行われてしまいます(AnimDynamicsノードやRigidBodyノードがエンジンに入る以前の物理処理です)
そのため、RigidBodyノードには「PhysicsType = Simulated に設定されたPhysics Asset」を指定し、SkeletalMeshには「PhysicsType = Kinematicに設定されたPhysics Asset」を指定することで、RigidBodyノードによる物理処理のみを動かす事が可能です。
なお、SkeletalMeshにPhysics Assetを未指定にすることでもRigidBodyノードによる物理処理のみを動かす事が可能です。ただ、SkeletalMeshに指定するPhysics AssetはBoundingBoxの計算に使われるため、未指定の場合はBoundingBoxが意図通りの形にはならず違和感のある表示になる可能性があります。ご注意ください。
よろしくお願いいたします。
お世話になっております。
素早い対応ありがとうございます。
だいぶ理解できました。
RigidBodyのこちらに、PhysicsAsset をセットする必要があったんですね。
この Override Physics Asset にはピンが無いようなので、アニメBPの流用が難しくなりそうですね。
RigidBodyノードはスケルタルメッシュごとにアニメBPを作成し、SkeletalMesh の Post Process Anim Blueprint に設定するのが良いのでしょうか、、、
> RigidBodyノードには「PhysicsType = Simulated に設定されたPhysics Asset」を指定し、SkeletalMeshには「PhysicsType = Kinematicに設定されたPhysics Asset」を指定する
こちらは、1つのSkeletalMeshにたいして、2つのPhysicsAssetを用意するという事になりますでしょうか。
以上です。
お世話になっております。
確認ですが、私の方で元々設定していた、SkeletalMeshにSimulatedのPhysicsAssetを設定して、AnimBPにはOverwritePhysicsAssetを設定しない場合、どのような動作になっていたのでしょうか?
(a)
Simulatedでの物理計算と、RigidBodyによるPhysXの物理計算で2回処理されていた?
(b) RigidBodyによるPhysXの物理計算は行われていなかった?
確認した所、残念ながら(a)でした。この確認の過程で、USkeletalMeshComponent::SetAllBodiesSimulatePhysics で Skeletal Meshに指定されたPhysics Assetによる物理計算をOFFにすることで、RigidBodyによる物理計算のみを動作させることができることを確認いたしました。この方法であれば、Override Physics Assetで上書きする必要がなくなるため、Animation BPの流用がしやすくなるかもしれません。
SimulatedSpaceを
WorldSpaceに変更したところ、モデル生成時に揺れものが激しく暴れます
既にPhysics Assetの各パラメータを調整済みの場合は、以下のスライドにあるカット切り替わり前に物理を空回しするフローを検討すべきかもしれません。ご参考になれば幸いです。
アニメBPで記述した場合と、PostProcessアニメBPで指定した場合で、挙動が変わってしまうような理由はありそうでしょうか?
UDN、社内データベースを確認したのですが類似の報告はなく、また手元の環境でも再現することができませんでした。Animation BPにてRigid Bodyノードはどの位置に配置されていますでしょうか?もしFinal Animation Poseと直接接続されておらず、その間に複数の別処理を行うノードが挟まれている場合、PostProcess AnimationBPで使うときと挙動が異なる可能性があります。なぜなら、PostProcess AnimationBPでRigidBodyを使う場合、通常のAnimation BPで決まったポーズを元に物理計算を行うためです。
よろしくお願いいたします。