在2D碰撞之后计算结果速度矢量

3

目前我有一个小型物理游戏,使用分离轴定理进行碰撞检测和响应,但是当我发现没有多少文档讲解对象在使用SAT碰撞检测与另一个形状碰撞后的速度变化时,我陷入了僵局。

这里有两个我所说的内容的图示。

enter image description here

enter image description here

请问有人能指导我正确的方向吗?

碰撞后可以提供的所有信息都是最小穿透向量。

编辑:找到了一些在线代码与此相关,但我不理解它:

void CBody::ProcessCollision(CBody& xBody, const Vector& N, float t)
{
    Vector D = m_xDisplacement - xBody.m_xDisplacement;

    float n  = D * N;

    Vector Dn = N * n;
    Vector Dt = D - Dn;

    if (n > 0.0f) Dn = Vector(0, 0);

    float dt  = Dt * Dt;
    float CoF = s_fFriction;

    if (dt < s_fGlue*s_fGlue) CoF = 1.01f;

    D = -(1.0f + s_fRestitution) * Dn - (CoF) * Dt;

    float m0 =       GetInvMass();
    float m1 = xBody.GetInvMass();
    float m  = m0 + m1;
    float r0 = m0 / m;
    float r1 = m1 / m;

          m_xDisplacement += D * r0;
    xBody.m_xDisplacement -= D * r1;
}
1个回答

0

碰撞检测和如何处理碰撞是两个不同的事情。

碰撞后发生的事情取决于您想要实现的物理效果。

例如,在您的顶部图片中,假设红色部分是不可移动的墙壁,只有蓝色部分在移动。蓝色部分的运动向量已经分解为平行于红色墙壁表面和垂直于其表面的正交部分。在这种情况下处理碰撞的简单方法是简单地翻转垂直于墙壁的速度向量分量。因此,向量[-4,10]将变为[4,10]。


虽然那样做可以行得通,但由于你没有原则来选择要翻转的组件,所以你的同样方法在所有情况下都不会起作用。我试图实现的是刚体物理模拟。 - HDalton
使用完美的弹性还是考虑真实世界的能量损失?加入摩擦力或不加?很多选择会影响物理引擎的复杂度。我的例子只是最简单模型之一。建议先从非常简单的模型开始,必要时再逐渐升级。 - Roland Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接