ChaosFleshでシミュレーション時に背景のPhysicalMaterialの摩擦係数を影響させることは可能でしょうか?

お世話になっております。

ChaosFleshで剛体のシミュレートを行う場合、背景に設定されたPhysicalMaterialの摩擦係数や、剛体的なシミュレーション(例えば球が転がったりなど)やUEデフォルトのオーバーラップ処理を行おうと思うと、通常のコンポーネントのSimulatePhysicsで剛体シミュレーションを行い、Fleshでは元のメッシュから形状をあまり逸脱しない範囲で頂点シミュレーションを行う形になるのかなと思っています。

こちらをChaosFlesh側で完結することは可能なのでしょうか?

例えば摩擦係数はOptimusDeformerInstance経由で外部から設定してDeform処理時に考慮できなくもないですが、FleshのSolverにコリジョンを渡しているのでSolver内部で計算した方が良いのではと思っています。

その場合どのあたりの処理を変更するのが妥当でしょうか?FDeformableSolverでしょうか?

もう1つこれに関連して質問があるのですが、Deformされた四面体もしくは描画頂点列にCPUからアクセスしたいのですが、UOptimusDeformerInstance::GetBufferPool()のデータを直接参照ても大丈夫でしょうか?こちらのデータはCSで直接利用されているような気がしておりまして、何かしらロックする手段とかございますでしょうか?

質問だけになって申し訳ないのですが、よろしくお願いいたします。

[Attachment Removed]

> 通常のコンポーネントのSimulatePhysicsで剛体シミュレーションを行い、Fleshでは元のメッシュから形状をあまり逸脱しない範囲で頂点シミュレーションを行う形になるのかなと思っています。

通常のFreshの動作はこの方式を想定しているのでこのご認識は正しいと思います。「本体」として剛体があり、外部からのインタラクションは本体が受け持ち、FreshはKinematicParticleで一部が拘束されそのうえでメッシュ表面にソフトボディシミュレーションだけを加える形です。

次にDeformableSolverでの外部のコリジョンに対する摩擦の考慮ですが、ますDeformerCollisionを​はStaticMeshのBodyInstanceからコリジョン形状だけを抜き出して利用しており、PhysicalMaterialをSolverに引き渡しません。また質点のシミュレーションはソルバーの中にあり、摩擦を考慮するとなるとこのソルバーの中で考慮されるべきですがDeformerableSolverは摩擦を考慮した実装がありません。真っ当にやろうとするとソルバー全体に修正が必要になります。

OptimusDeformerに関してはSolverでの結果を元にディスプレイメッシュを制御している部分でソルバーが持つコリジョンなどの情報を持っていません。外部から適切な摩擦係数を伝達し、自由なコードが記述可能なDeformerGraph内で解くことは恐らく可能ですが、Solverが計算した結果と乖離が広がってしまうと思われるため素直な実装にはならないと思います。

​最後にDeformされた四面体もしくは描画頂点列にCPUからアクセスに関してはOptimusDeformerInstanceで扱うバッファはGPU用であり操作可能な実装はありません。DeformableSolverの結果であれば、UDeformableTetrahedralComponent (UDeformableGameplayComponent) ::GetDynamicCollection を経由して頂点情報が取得できます。

[Attachment Removed]

ご返信ありがとうございます。

> DeformableSolverの結果であれば、UDeformableTetrahedralComponent (UDeformableGameplayComponent) ::GetDynamicCollection を経由して頂点情報が取得できます。

こちらの情報ありがとうございます。結果が数フレーム遅れた情報になりそうなので、そういう情報で良いときは活用させていただきます。

摩擦の計算についてですが、DeformerGraph内での計算は自分もあまりよくないと思うのでそちらもやめておきます。

Solverでの摩擦の考慮ですが、すこし編集してみたところFDeformableSolver内のFPBDEvolution::CoefficientOfFrictionの摩擦係数を設定すれば計算に影響はしていそうです。

ただ現状は、FPerParticlePBDCollisionConstraint::PerGroupFrictionという形でグループごとの摩擦係数しか設定できないような形になっていそうで、パーティクル単位での摩擦係数の計算を行うとなるとApplyPerParticleCollisionFastFriction()の変更にまで影響が及び、変更コストは高そうです。

いったん頂点ごとの摩擦シミュレーションはあきらめて、メッシュ全体の剛体のシミュレーション結果と組み合わせる形で実装してみることにします。

よく考えると、頂点ごとの正しい摩擦係数をパーティクルごとに取得しようと思うと、PhysicalMaterialMaskのようなテクスチャから計算が必要な場合や、頂点形状の一致しないSimpleコリジョンからPhysicalMaterialを取得する場合があり、そのあたりのセットアップコストの高さで断念されていそうです。

現状考えている仕様はメッシュ単位のPhysicalMaterialでも十分なので、その粒度であれば剛体シミュレーションでも置き換えられそうです。

ありがとうございました。

[Attachment Removed]