将球约束添加到布sim中的正确方法是什么?粒子(布)与球碰撞
我想添加一个球体(或胶囊)约束到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'
是怎么我认为应该解决),而不是返回回到以前的位置:
由于这是一个布料模拟,布基本上跃过在CA领域而不是被球体“阻止”。
现在,我可以尝试返回前一点的方向,但由于球体也可能移动,所以我不确定P1是否是有效的位置(如果它有意义的话)。另外,它似乎在计算上更昂贵 - 这是我应该怎么做,或者不是?
对不起,在链接中找不到代码,请提供链接至源代码? – Yola