キャラクターがラグドールに特定の地面と接触しているとクラッシュする

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

現在開発中のゲームで、プレイヤーがラグドール化して、特定の地形に倒れ込んだ際にクラッシュが起きます。

その箇所が下記の箇所のEnsureやassertになります。

LogとDumpでは複数の箇所でほぼ同時に出ていました。

Ensure condition failed: !Constraint.AccumulatedImpulse.ContainsNaN() && FMath::IsFinite(Constraint.GetPhi()) [FileEngine\Source\Runtime\Experimental\Chaos\Private\EventDefaults.cpp] [Line: 135]

ContactHandle = {Chaos::FPBDCollisionConstraint *}

AccumulatedImpulse = {Chaos::TVector<float, 3>} {NaN, NaN, NaN}

Assertion failed: !Pose[ParentIndex].ContainsNaN() [File:\Engine\Source\Runtime\Engine\Public\BonePose.h] [Line: 621]

Ensure condition failed: !ActiveParticle->GetX().ContainsNaN() && !ActiveParticle->GetV().ContainsNaN() && !ActiveParticle->GetW().ContainsNaN() && FMath::IsFinite(ActiveParticle->M()) [File:\Engine\Source\Runtime\Experimental\Chaos\Private\EventDefaults.cpp] [Line: 399]

Ensure condition failed: !UpdateParams.WorldBounds.BoxExtent.ContainsNaN() && !UpdateParams.WorldBounds.Origin.ContainsNaN() && !FMath::IsNaN(UpdateParams.WorldBounds.SphereRadius) && FMath::IsFinite(UpdateParams.WorldBounds.SphereRadius) [File:\Engine\Source\Runtime\Renderer\Private\RendererScene.cpp] [Line: 2188] NaNs found on Bounds for Primitive CharacterMesh0: Owner: BP_Player_PLY_C_2147481097, Resource: SK_CH_PLY_002_01, Level: /Game/Maps/Area01, Origin: X=-nan(ind) Y=-nan(ind) Z=-nan(ind), BoxExtent: X=nan Y=nan Z=nan, SphereRadius: nan

Ensure condition failed: NewTransform.IsValid() [File:\Engine\Source\Runtime\Engine\Private\Components\SceneComponent.cpp] [Line: 740]

Ensure condition failed: !Constraint.AccumulatedImpulse.ContainsNaN() && FMath::IsFinite(Constraint.GetPhi()) [File:\Engine\Source\Runtime\Experimental\Chaos\Private\EventDefaults.cpp] [Line: 135]

パッケージにアタッチして調査したときには下記の箇所でブレークされました。

void FEventDefaults::RegisterCollisionEvent(FEventManager& EventManager)の

InnerPhysicsParallelForRange(CollisionHandles.Num(), [&](int32 StartRangeIndex, int32 EndRangeIndex)ラムダ

ラグドールを止めたり、地形側を調査したりしてますが根本解決ができていない状態です。

似たような内容でアセット法線問題?

[Content removed]

同じensureの内容

https://forums.unrealengine.com/t/huge-freeze-while-playing-chaos-engine-issue/1500582

[Attachment Removed]

このEnsureなどの出力を含むエラー報告はいくつかありますが、外部からNaNの値が混入したケースが多く、別段に明確な修正は行われていないようです。

再現可能だと思われますのでRegisterCollisionEventの中でメンバを調査していただくと良さそうです。

Ensureのある行で止まっていると思いますので、まず (FConstraint *)ContactHandle をウォッチします。

このパラメータが参照可能であれば関連する剛体の情報が参照できます。

接触しているアクターの確認はParticleの中で確認できます。

[Image Removed]

PushOutの値やPhiの値はManifoldPointsから確認できるはずです。

[Image Removed]ここで参照できるパラメータの中でスケール値、法線、などにNanのパラメータが混入していたらそれが原因の可能性が大きいです。

可能であればダンプとシンボルをご共有いただけるとこちらでも調査できるのでアップロードをお願いします。

もしアップロードに問題があるようであれば外部のストレージをご案内しますので申し付けください。

[Attachment Removed]

どこかでNaN値が発生しているのが原因ならこちらも参考になるかもしれません

[Attachment Removed]

ありがとうございます。

こちらで担当のエンジニアに調査していただいたところ

FPBDCollisionContainerSolver::ScatterOutput()

CollisionSolver > ManifoldPoints
RelativeContactPoints = {Chaos::TVector<float, 3> [2]} 0x000002718e029464 {{-0.0128668295, -0.00776196737, -0.00374254887}, {318267.25, 129109.922, 10202.9268}}
ContactNormal = {Chaos::TVector<float, 3>} {0, 0, 0}
ContactTangentU = {Chaos::TVector<float, 3>} {0, NaN, NaN}
ContactTangentV = {Chaos::TVector<float, 3>} {NaN, NaN, NaN}
ContactDeltaNormal = {float} 0
ContactDeltaTangentU = {float} NaN
ContactDeltaTangentV = {float} NaN
ContactTargetVelocityNormal = {float} 0
ContactRxNormal0 = {Chaos::TVector<float, 3>} {0, 0, 0}
ContactRxNormal1 = {Chaos::TVector<float, 3>} {0, 0, 0}
ContactRxTangentU0 = {Chaos::TVector<float, 3>} {NaN, NaN, NaN}
ContactRxTangentV0 = {Chaos::TVector<float, 3>} {NaN, NaN, NaN}
ContactRxTangentU1 = {Chaos::TVector<float, 3>} {NaN, NaN, NaN}
ContactRxTangentV1 = {Chaos::TVector<float, 3>} {NaN, NaN, NaN}
ContactNormalAngular0 = {Chaos::TVector<float, 3>} {0, 0, 0}
ContactTangentUAngular0 = {Chaos::TVector<float, 3>} {NaN, NaN, NaN}
ContactTangentVAngular0 = {Chaos::TVector<float, 3>} {NaN, NaN, NaN}
ContactNormalAngular1 = {Chaos::TVector<float, 3>} {0, 0, 0}
ContactTangentUAngular1 = {Chaos::TVector<float, 3>} {0, 0, 0}
ContactTangentVAngular1 = {Chaos::TVector<float, 3>} {0, 0, 0}
ContactMassNormal = {float} 0.00100000005
ContactMassTangentU = {float} 0
ContactMassTangentV = {float} 0
NetPushOutNormal = {float} 0
NetPushOutTangentU = {float} 0
NetPushOutTangentV = {float} 0
NetImpulseNormal = {float} 0
NetImpulseTangentU = {float} 0
NetImpulseTangentV = {float} 0
NetSoftPushOutNormal = {float} 0
StaticFrictionRatio = {float} 0
bApplyFriction = {unsigned int:1} 0

となっているようで

ContactNormal = {Chaos::TVector<float, 3>} {0, 0, 0}この処理に寄ってNaNになってるかもしれないとありました。

現状は私の方でもLogやEnsureを追加してみているのですが、担当エンジニアから怪しいとあったところでNaNになってる可能性が高いなと思っております。

[Attachment Removed]

調査いただいた通りContactNormal(ContactPoint.ShapeContactNormal)​が0であるとNaNが生成されてしまうと思います。

恐らく対象のメッシュも確定していると思いますが、こちらはUseComplexAsSimpleでメッシュ​コリジョンを使っていますか?

もしメッシュコリジョンであれば縮退三角形やそもそもインポートした法線の長さが不正になっている可能性があります。

ヒット位置周辺のメッシュをご確認いただけますでしょうか。​

[Attachment Removed]

ありがとうございます。

担当者に連絡して確認してみます。

[Attachment Removed]

進捗はいかがでしょうか。もしアップデートがございましたらご共有ください。

また特定の地形のアセット上でのみ起こるということなので、原因の特定の目途が立っていないようであれば、問題のアセットをマイグレートしていただいてアップロードいただければ、コリジョンの形状について調査することも可能ですのでご検討ください。

[Attachment Removed]

ご連絡ありがとうございます。

現在、背景アセットである程度目処がたってるのでどの不具合や設定ミスが問題かを担当者にチェックしてもらいっています。

特定するまで時間がかかるみたいなので、進展ありましたらまたご連絡させていただきます。

[Attachment Removed]

トラッキングのためにコメントさせていただきます。

> 特定するまで時間がかかるみたいなので、進展ありましたらまたご連絡させていただきます。

承知しました。進展をお待ちしております。

[Attachment Removed]

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

こちらで調査してみたのですが、対処できずでしたのでプライベートのスレッドにて問題のアセットを見ていただきたいと思います。

よろしくお願い致します。

[Attachment Removed]