使用verlet集成进行非常基本的冲突解决

时间:2011-04-17 04:52:51

标签: game-physics verlet-integration

我正在学习如何为自己的娱乐做一些非常基本的物理学习,但我遇到了一个奇怪的问题。

我正在使用http://www.lonesock.net/article/verlet.html中描述的时间校正的verlet集成方法,到目前为止,它运行得非常好。运动和东西看起来都很不错。

我的问题出现在碰撞解决方面。我可以解决(似乎相当不错)地形,因为地形不会移动。我只是将玩家的当前位置设置到安全位置,事情似乎很好。然而,当我试图解决另一个精灵(物理演员等)时,事情似乎在整个地方拍摄。

我的解析代码如下:

void ResolveCollision(Sprite* entity1, Sprite* entity2)
{
    Vec2D depth = GetCollisionDepth(entity1, entity2);
    if (GetSpritePhysical(entity1) && GetSpritePhysical(entity2))
    {
        /* Two physical objects. Move them apart both by half the collision depth. */
        SetPosition(entity1, PointFromVector(AddVectors(
            VectorFromPoint(GetPosition(entity1)), ScalarMultiply(0.5f, depth))));
        SetPosition(entity2, PointFromVector(AddVectors(
            VectorFromPoint(GetPosition(entity2)), ScalarMultiply(-0.5f, depth))));
    }
    else if (GetSpritePhysical(entity1) && !GetSpritePhysical(entity2))
    {
        SetPosition(entity1, PointFromVector(AddVectors(
            VectorFromPoint(GetPosition(entity1)), ScalarMultiply(-1.0f, depth))));
    }
    else if (!GetSpritePhysical(entity1) && GetSpritePhysical(entity2))
    {
        SetPosition(entity2, PointFromVector(AddVectors(
            VectorFromPoint(GetPosition(entity2)), depth)));
    }
    else
    {
        /* Do nothing, why do we have two collidable but nonphysical objects... */
    }
}

可以看出,有三种情况,取决于碰撞的精灵是否是物理的。

这很可能是第一个有问题的案例;我正在使用相同的功能来获得穿透深度,这是我在(看似正在工作的)地形碰撞中。

为什么碰撞的精灵会飞到各处?我对这个问题感到非常难过。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

一旦你将它们分开,你就可以解决它们的速度/动量。你是怎么做到的?

最有可能的是,要确定要分离的方向,请使用从每个中心开始的向量。穿透越深,该矢量(碰撞法线)可能越不准确。这可能会导致意想不到的结果。

更好的方法是不必将它们分开,而是在移动它们之前计算碰撞点的位置,然后只移动它们那么远...然后解决速度......然后将它们移动到其余时间片的新方向。当然,它有点复杂,但结果更准确。