【问题标题】:Particle (cloth) to sphere collision粒子(布料)到球体的碰撞
【发布时间】: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


【解决方案1】:

像布一样的东西卡在障碍物的错误一侧并卡在那里并不少见。更常见的是在检测到碰撞时快速移动的对象重叠过多。

一个常见的解决方案是,在检测到碰撞时,将上一步细分,直到碰撞不太严重,然后再解决它。我认为您会发现在您的情况下尝试检测碰撞有多深是很困难的,但是如果您可以限制系统中球体的最高速度,您可以对发生固定次数的碰撞的帧进行二进制分割并假设就够了?

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

等等……

你是否准备好接受它有时会出错,或者它必须总是一个好的结果?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多