ChaosCloth在某些手机可能出现破面

Cloth资产用Brush刷MaxDistance,如果有的顶点或线段在PhysicalMeshWireframe和PariticleIndices预览视图下显示为粉色,在荣耀X20SE手机上就会顶点乱飞。

由FClothVisualization::DrawPhysMeshWired可知,粉色表示InvM为0。

经过追查发现是在FClothingSimulationSolver::ParticleMassClampAndKinematicStateUpdate中计算Cloth的InvM,这里可能出现1除以0的情况,直到5.7版本这段代码都是如下所示。

请问可以在此处判断如果Particles.M(Index)为0,则InvM设为0吗?是否会有其他风险,或是否有更好的地方修复此bug?

<br/>

void FClothingSimulationSolver::ParticleMassClampAndKinematicStateUpdate(Softs::FSolverParticlesRange& Particles, Softs::FSolverReal MinPerParticleMass, const TFunctionRef<bool(int32)>& KinematicPredicate)
{
  for (int32 Index = 0; Index < Particles.GetRangeSize(); ++Index)
  {
    Particles.M(Index) = FMath::Max(Particles.M(Index), MinPerParticleMass);
    Particles.InvM(Index) = KinematicPredicate(Index) ? (Softs::FSolverReal)0. : (Softs::FSolverReal)1. / Particles.M(Index);
  }
}

[Attachment Removed]

重现步骤
Cloth资产用Brush刷MaxDistance,如果有的点没刷到,在荣耀X20SE手机上就会出现破面的情况。

[Image Removed]

[Attachment Removed]

你好,

根据您的描述,异常“顶点乱飞”很可能来自数值不稳定(NaN / Inf / 极小值),尤其是在某些移动端浮点容错更差时被放大。

您贴的代码中,理论上,只要 MinPerParticleMass > 0,就不应该出现除 0的情况。而这里的MinPerParticleMass 似乎是0.0001。InvM为0,可能是因为KinematicPredicate中,由于MaxDistance太小导致的。

另外,直接判断 M == 0,因为这里是浮点数,判断浮点数是否为0也是不太安全的。而可能的原因或许是在于一些与MaxDistance有关的计算。

这边还是推荐修复资产上的问题。资产没有刷MaxDistance的目的是什么,是希望这些点成为固定点不参与模拟么,而从截图来看,这些粉色点看起来不像是固定点。这些都是在资产上需要处理的。同时,也建议检查一下这个资产的网格拓扑结构。

希望以上信息对解决问题有所帮助。如果您有更多的相关问题,欢迎与我联系。

Henry Liu

[Attachment Removed]