粒子(布)与球碰撞
问题描述:
将球约束添加到布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是否是有效的位置(如果它有意义的话)。另外,它似乎在计算上更昂贵 - 这是我应该怎么做,或者不是?
答
布料像事物卡在障碍物的错侧并卡在那里并不罕见。更常见的是当检测到碰撞时,快速移动的对象重叠得太多。
一个常见的解决方案是,在检测到一个碰撞时,将前一步划分直到碰撞不太严重,然后解决它。我认为你会发现试图检测你的情况下碰撞有多深,但是如果你可以限制系统中球体的最高速度,你可以二进制拆分发生碰撞的帧数固定的次数,并假设它会够好吗?
if (it collides at time T and didn't at T-1)
if (it collides at T-0.5)
try T-0.75
else
try T-0.25
等等
你是否愿意接受,这有时会是错误的,或者它必须是总是一个好结果呢?
对不起,在链接中找不到代码,请提供链接至源代码? – Yola