2015-07-10 150 views
0

将球约束添加到布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'是分辨的位置):

Satisfying sphere constraints for slow particles

但是,如果颗粒非常迅速,因为那时颗粒基本上跳到球的另一边(P1是以前的位置,P2是当前位置出现问题,P'是怎么我认为应该解决),而不是返回回到以前的位置:

Satisfying sphere constraints for fast particles

由于这是一个布料模拟,布基本上跃过在CA领域而不是被球体“阻止”。

现在,我可以尝试返回前一点的方向,但由于球体也可能移动,所以我不确定P1是否是有效的位置(如果它有意义的话)。另外,它似乎在计算上更昂贵 - 这是我应该怎么做,或者不是?

+0

对不起,在链接中找不到代码,请提供链接至源代码? – Yola

回答

0

布料像事物卡在障碍物的错侧并卡在那里并不罕见。更常见的是当检测到碰撞时,快速移动的对象重叠得太多。

一个常见的解决方案是,在检测到一个碰撞时,将前一步划分直到碰撞不太严重,然后解决它。我认为你会发现试图检测你的情况下碰撞有多深,但是如果你可以限制系统中球体的最高速度,你可以二进制拆分发生碰撞的帧数固定的次数,并假设它会够好吗?

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 

等等

你是否愿意接受,这有时会是错误的,或者它必须是总是一个好结果呢?