【发布时间】:2015-07-10 11:47:43
【问题描述】:
将球体约束添加到布料模拟的正确方法是什么?
我正在尝试添加一个限制Skeel Lee's cloth simulation source code 的球体(或胶囊),但我不确定如何正确执行。
我创建了一个相当简单的约束,它将粒子以相反的方向“踢”出球体(从矢量到中心的相反方向):
void SatisfySphereConstraints()
{
foreach (var simObj in this.simObjects)
simObj.CurrPosition += SphereConstraint(simObj.CurrPosition, _center, _radius);
}
Vector3 SphereConstraint(Vector3 position, Vector3 center, float radius)
{
var delta = position - center;
var distance = delta.Length();
if (distance < radius)
return (radius - distance) * delta / distance;
return Vector3.Zero;
}
然后我在现有代码中插入了方法:
ApplyForces();
Integrate();
for (var i = 0; i < constraintIterations; i++)
{
foreach (Constraint constraint in constraints)
constraint.SatisfyConstraint();
SatisfySphereConstraints(); // <-- I added it here
}
碰撞代码在这种情况下工作得很好(C 是球体的中心,P 是当前粒子位置,P' 是解析位置):
但是如果粒子移动得很快就会出现问题,因为那时粒子基本上会跳到球体的另一边(P1 是之前的位置,P2 是当前位置,P' 是我如何认为应该解决),而不是回到之前的位置:
由于这是一个布料模拟,在这种情况下,布料基本上会跳过球体,而不是被球体“停止”。
现在,我可以尝试返回上一点的方向,但由于球体可能也在移动,我不确定 P1 是否是一个有效位置(以及它是否有意义)。此外,它的计算成本似乎更高——我应该这样做吗?
【问题讨论】:
-
抱歉,在链接中找不到代码,能否提供源代码链接?
标签: algorithm simulation physics collision particles