3

我想听听你对这个问题的建议......

为简单起见,我将只考虑 x 轴。

对位置 10 的对象进行成像,其宽度也为 10 个单位,每秒向前移动 100 个单位,并且由于低帧,每次更新时它应该移动 80 个单位。

在调用第一次更新后,它的位置现在是 90,并且在位置 120 处还有另一个相同大小的对象。

下一次更新,会将对象移动到位置 170。考虑到我需要实现碰撞检测,计算更新之前或之后的碰撞,没有一个会起作用。

现在来一个简单的问题...

在这种情况下该怎么办?

执行以下操作:

Position start = destinationPos - currentPos;
for (int i; i < start; i++)
    if (IsColliding(movingObj.Position + i, staticObj))
        //do the colliding stuff here

我不喜欢这个解决方案,在这种情况下可能没问题,但是如果你有 x、y、z 和很多移动物体怎么办?

我认为另一个很好的解决方案,但我不确定它是否可靠,是让另一个线程在一个循环中执行所有这些计算。

这个线程就像一个无限循环,在每次迭代中,我都会计算elapsedTime我认为会非常小的值并继续移动并计算碰撞,而渲染线程会慢得多,它会得到当前状态的对象,只是渲染它。

你们怎么看?

4

3 回答 3

7

幸运的是,对于我们这些数学白痴来说,这个问题或多或少已经得到了解决。您描述的问题是通过动态碰撞检测解决的,该检测用于确定两个对象是否在帧之间发生碰撞,并且对于某些类型的碰撞甚至可以准确地告诉您碰撞发生的时间,因此您可以更新世界的状态正确。

如果您对自己实现碰撞检测算法不是特别感兴趣,我会考虑使用已经完成此类事情的库:

很多关于这个主题的好书之一是实时碰撞检测

于 2009-05-23T18:43:04.113 回答
4

Mike Daniels 谈到了这一点,但您的回答是否定的:您不想将您的对象视为在离散的“爆发”中移动。让我们在 1d 中举个例子:一辆汽车从 x = 0 开始,向前加速 2 个单位/秒^2。您不会重新计算每一帧的速度和位置。相反,您将使用一些简单的微积分:速度是加速度的积分,位置是加速度的积分。因此 v =2*t和 p = t^2。然后,您要做的就是根据自初始条件以来经过的时间来替换 t。

现在假设您在位置 100 有第二个物体,以 -3 个单位/秒^2 的速度加速。那么它的速度是-3*t,它的位置是100 - (3/2)*t^2。求解两个位置何时相等,我们可以看到它们在 t = 40 时发生碰撞。

然后,使用方程式,您可以查看帧之间是否发生碰撞。有几个框架甚至可以为您执行此操作,但对它的工作原理有基本的了解很重要。

于 2009-05-23T19:17:37.370 回答
3

这是一个附带问题,但您可能会发现值得将逻辑更新速率与游戏的帧速率分离,并为物理和逻辑设置一个固定的时间步长。它使许多物理和碰撞的东西变得更简单,并在帧速率下降时阻止事物爆炸。

Glenn Fiedler 的网站有一个以这种方式工作的游戏循环示例。就个人而言,如果可以选择,我总是会选择固定费率更新。它只是简化了很多事情,尤其是在物理学方面。

于 2009-05-23T21:11:16.393 回答