在非常简单的3D赛车游戏中,如何处理碰撞?


9

我想知道在一些简单的3d赛车游戏中是如何发生碰撞的(尤其是在Outrun 2 / Motoracer之类的游戏中)。

在具有复杂环境(开放世界)的经典赛车游戏中,我想这是通过一个基本的盒子(用于汽车)与飞机相撞(用于轨道,建筑其他东西)来完成的。整个过程将使用一些边界框进行优化(这是许多游戏中完成碰撞的方式)。

在《 Outrun 2 / Motoracer》这样的游戏中,游戏玩法是如此简单,以至于开发人员可能并不需要它,并且一切都可以简化很多。对于那些从未玩过的人,这里是这么具体:

  • 汽车/自行车总是粘在道路上。
  • 道路总是相同的大小,并且形状非常简单。
  • 唯一的可能性是沿着这条路行驶,这不可能离开这条路,或者与其他东西发生碰撞(其他汽车/自行车除外,但我们不在乎)。
  • 当您与道路相撞时,会发生非常基本的街机碰撞(只需将汽车从道路上推开)

这是我认为碰撞(可能)已经完成的方式:

整个轨迹可被视为3d贝塞尔曲线的巨型曲线。从该曲线可以生成道路多边形(使用从曲线生成的前,左和上向量)。其他元素(如房屋,树木等)也可以使用此方法放置和对齐。

然后,处理碰撞(并绘制汽车):

1)从当前汽车3d位置找到3d曲线上的最近位置。换句话说,将3d汽车位置转换为贝塞尔曲线位置。道路上的每个3d位置都可以视为沿着3d曲线(t)+横向位移(d)的位移。检查下面的图像是否不清楚(这是2d示例,但这很容易应用于3d)。

在此处输入图片说明

当t = 0轿厢在轨道段的起点时,当t = 1轿厢在终点处。当d = -1或1辆汽车在轨道边界时,当d = 0汽车在道路中间时

2)使用t和将汽车与道路对齐d(非常简单:对于t和,d我可以得到3d位置+上/前/左向量)。这辆车现在粘在路上了

3)检查d轿厢的横向位移。如果价值太大(d > 1)或太低,则(d < -1)汽车偏离轨道。只需将其夹在正确的位置即可。

这也使3d剔除非常简单,只需将轨道从当前汽车t位置绘制到即可t + some_big_enough_value_to_avoid_visible_clipping

也许我完全错了:仅检查汽车(边界框)和代表轨道(没有建筑物等)的一组非常简化的多边形的碰撞会更快,更简单。3d世界(以及由此产生的colision模型)以前只是使用某些3rd party工具(运行游戏时不再有3d曲线,只是一堆多边形)生成的。

Answers:


16

我从事过一些与您描述的类似的商业游戏。

在这些游戏中的每一个中,我们实际上都具有沿轨道的侧面创建不可见的“墙”的多边形,并针对这些墙进行了传统的碰撞测试。这意味着我们可能会在道路侧面,不可见墙的内部产生其他可碰撞的危险,并且还使我们能够以比通常的样条线方法更快的速度改变道路宽度。

但是话虽如此,我们还是在“ 我认为碰撞如何工作”部分中做了您列出的内容,以防止碰撞隧穿/毛刺,并且该系统还大量用于赛车AI逻辑。我们还使用它来确定领先的汽车,以便在HUD上显示“ 1st / 2nd / 3rd / etc”指示器。有时,这些数据还用于在重大事故后重生汽车。

我认为碰撞将如何起作用的过程中,您错过的一件事情是,当您使用这种花键时,通常会给花键加筋。肋是数据的位,表示轨道从样条线向各个方向的横向延伸量。因此,对于100米长的花键,您可能会有50条肋,沿其长度每两米给出一条轨道宽度。这使您的轨道可以沿其范围更改宽度。在我从事的游戏中,这些肋骨还区分了“跑道表面”和“可驾驶区域”。因此,您需要设置一组道路宽度,以告诉您距样条线的中间有多远的柏油碎石,然后是另一条道路宽度,以指示沙/草/其他物体离开道路的距离。这使我们能够让玩家在赛道上行驶一段合理的距离,但仍然让AI知道真正的路面在哪里。

我从事过的许多游戏也将其他数据存储在肋骨中。一款游戏将轨迹照明信息烘焙到肋骨中,以便轻松计算区域是否处于阴影中(然后将其用于汽车渲染,决定是否绘制镜头光晕以及其他效果)。另一个信息是关于哪些电影摄影机位置可以看到样条线的一部分的信息,因此在重放过程中我们不必进行视线计算。还有一个信息包括有关样条上有多少车道,它们所走的方向以及每个车道所在位置的水平位移的信息。这使我们可以包括可以在车道内正确行驶的交通汽车。肋骨非常适合存储您可能需要的有关路面的各种数据。

肋通常存储在与样条曲线关联的数组中。出于速度原因,正常的实现将具有均匀间隔的肋骨,因此一旦知道对象沿样条线的距离,就可以通过将沿样条线的距离除以肋骨之间的距离来计算数组中最接近的肋骨索引。否则,您将无法对肋骨数组进行二进制搜索以找到正确的道路宽度数据。

您的剔除描述对如何使用样条线方法给出了很好的基本描述,但实际上比您建议的要复杂一些-如果您以这种方式使用剔除样条线,则长发夹弯通常不会画出相反的一面转弯时,由于按沿轨道的距离进行测量,转弯的另一侧可能会很远,即使当乌鸦飞过时仅相隔几米。此外,可以看到世界几何体的距离通常不同于可以看到轨道网格的距离,因此,这些距离也不是真正适合该系统的距离。我的经验是,在大多数情况下,最好不要使用跟踪跟踪逻辑来确定是否应绘制模型。它更加可靠,使用标准的相机视锥测试可以减少故障。


内容
丰富

0

在我的OpenGL赛车手中,我最初使用两个圆圈来定义轨迹的边界,但这似乎太麻烦了。我只是使用glReadPixel读取像素颜色。如果玩家的赛车在绿色(草绿色)像素上方,则运动会受到进一步限制。对性能的影响很小。


这听起来像是您在描述2D游戏(圆圈,按像素颜色碰撞)。是这样吗?然后答案是题外话。
克罗姆斯特

我指的是透视投影游戏。glReadpixel可以在2d正交或3d透视模式下应用。
ztech79 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.