我想知道在一些简单的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曲线,只是一堆多边形)生成的。