ClothにLODを設定した状態のメッシュをMutableに適用すると、クラッシュが発生する

私たちのプロジェクトではMutableを利用しています。

ClothにLODが設定されているメッシュがあるのですが、その状態でMutableに適用するとクラッシュが発生してしまいます。

「Mutable Sample」でも下記の手順を踏むと同じクラッシュが発生することを確認しました。(エンジンのバージョンは5.7.3で確認)

1. 「SK_Jacket_A」を開く

2. メッシュを選択し、「セクションからクロスデータを作成」でクロスを生成する

3. 同様に「セクションからクロスLODデータを作成」でLOD1を生成する

4. 同様に「クロスデータを適用」でクロスを適用する

5. 「CO_Jacket_A」を開き、「クロージングを有効化」にチェックを入れた状態でコンパイルする

6. パラメータの「Jacket」に「Jacket_A」を設定すると、クラッシュが発生

こちらについて、何か解決策はあるでしょうか。

お手数ですが、ご確認の程お願いいたします。

[Attachment Removed]

再現手順
「Mutable Sample」で下記の手順を実行

​1. 「SK_Jacket_A」を開く

2. メッシュを選択し、「セクションからクロスデータを作成」でクロスを生成する

3. 同様に「セクションからクロスLODデータを作成」でLOD1を生成する

4. 同様に「クロスデータを適用」でクロスを適用する

5. 「CO_Jacket_A」を開き、「クロージングを有効化」にチェックを入れた状態でコンパイルする

6. パラメータの「Jacket」に「Jacket_A」を設定すると、クラッシュが発生​

[Attachment Removed]

詳細な再現ステップのご用意ありがとうございます。問題を再現することができたので、

本件を UE-368346 Mutable: Crash when a mesh does not have all ClothData attached としてバグ登録しました。

この操作のように二つのLODを生成して一つだけアタッチしているような

「ClothDataの数と実際にアタッチされたクロスデータの数が一致しない」場合に配列外参照が起こってしまいます。

すべてのLODを実際にアタッチすることで問題を回避することが出来ますが、頻繁にこのような設定が起こりえる場合には

以下の様にループ条件を修正することを検討できます。

void BuildOrCopyClothingData(
 
...
 
			// Reconstruct clothing asset lod map.
			NewClothingAsset->LodMap.Init(INDEX_NONE, Component->LODCount);
#if 1 // workaround
			for (int32 LODIndex = 0; LODIndex < ClothAssetData.AttachedSections.Num(); ++LODIndex)
#else
			for (int32 LODIndex = 0; LODIndex < NumClothLODs; ++LODIndex)
#endif
			{
				for (int32 SectionWithClothIndex : ClothAssetData.AttachedSections[LODIndex])		//crash occurs in this line
				{
					NewClothingAsset->LodMap[SectionClothMetadata[SectionWithClothIndex].LODIndex] = LODIndex; 
				}
			}
 
...
 
#if 1 // workaround
				for (int32 LODIndex = 0; LODIndex < ClothAssetData.AttachedSections.Num(); ++LODIndex)
#else
				for (int32 LODIndex = 0; LODIndex < ClothingAsset->LodData.Num(); ++LODIndex)
#endif
				{
					TArray<TArrayView<FMeshToMeshVertData>, TInlineAllocator<8>> MeshToMeshDataViews;
 
					for (int32 AttachedSectionIndex : ClothAssetData.AttachedSections[LODIndex])	//crash occurs in this line
					{
						MeshToMeshDataViews.Add(MakeArrayView(SectionsClothData[AttachedSectionIndex].MappingData));
					}
 
					bool bModified = MutableClothingModule->UpdateClothSimulationLOD(
							LODIndex, *ClothingAsset, MakeConstArrayView(MeshToMeshDataViews));
				
					bNeedsLodTransitionUpdate = bNeedsLodTransitionUpdate || bModified;
				}
 
 

[Attachment Removed]

ご確認ありがとうございます。

担当者にデータを確認してもらい、下記のデータ修正を行ってもらったところ、クラッシュは発生しなくなったのですがクロスの見た目が壊れた状態になってしまいました。

- Mesh側

- ClothのLOD追加

- Mutable側

- LOD作成後のスケルタルメッシュを再度読み込んで各スロットにマテリアル設定

> すべてのLODを実際にアタッチすることで問題を回避することが出来ますが

確認なのですが、こちらについて上記修正で対応としてあっているでしょうか。

また、クロスが壊れてしまう原因についても確認すべきところがあれば教えていただきたいです。

[Attachment Removed]

クロスが壊れてしまう状況を再現できていません。セットアップの手順を真っ新なMutableSampleで再現する手順をご共有いただけますと幸いです。

こちらで検証した手順を以下に示します。

  1. SK_Jacket_A の LOD3 を選択し Create​ Clothing Data From Section ( Clothing LOD 0 が作られる)
  2. LOD0を選択し、 今作った Clothing LOD 0 を割り当てて、ウェイトをペイントする
  3. ​ ペイントを終了し LOD3 を選択して Create Clothing LOD From Section > LOD Index : Add LOD 1 > Remap Parameter にチェックしてCreate
  4. LOD4を選択して Create Clothing LOD From Section > LOD Index : Add LOD 2 > Remap Parameter にチェックしてCreate
  5. LOD4を選択して Create Clothing LOD From Section > LOD Index : Add LOD 3 > Remap Parameter にチェックしてCreate
  6. LOD1 を選択して Apply Clothing Data > (Clothing) LOD 1
  7. LOD2 を選択して Apply Clothing Data > (Clothing) LOD 2
  8. LOD3 ​を選択して Apply Clothing Data > (Clothing) LOD 3
  9. アセットを保存
  10. CO_Jacket_Aを開きコンパイル > プレビューでLODを変更して動作を確認

結果として スケルタルメッシュ LOD 3から Clothing LOD 0-1、 スケルタルメッシュ LOD4 から Clothing LOD 2-3 の合計4つのClothing LODを作成して、スケルタルメッシュのLOD0-3にアサインしています。

​結果を動画にしましたご確認ください。

[Attachment Removed]

ご確認ありがとうございます。

その後の調査の過程でクロスが壊れる問題はプロジェクト側の問題であることがわかりました。

プロジェクトの処理を修正しクラッシュが発生せず、クロスも問題ない見た目になっております。

本件については解決できたため、Closeとしていただいて問題ありません。

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

[Attachment Removed]