摩托罗拉68000上的快速赛车物理

我已经有一个稳定的3D引擎,在系统的随机芯片上运行速度为60 fps,假设我保持polycount合理,60 fps可以保证(至less在TimeTrial模式下有这样的testing轨迹)没有敌人存在)。

  • 68000(20MHz以下)已经在做这个(手写汇编器):
    • input
    • AI
    • 碰撞检测跟踪
    • 细节层次(只是距离检查和网格指针交换)
    • 相机插值(高程差)
    • 一般的游戏状态管理

所以,不言而喻的是,在当前帧内没有太多的性能可用(保持60 fps),像刚体物理这样的过度使用解决scheme的所有向量,点积,交叉积(和相关的膨胀)。

通过试错&基准testing,我提出了以下68000scheme,速度非常快,允许参数化车辆特性,如加速/扫射(玩家需要在具有不同参数的车辆之间进行select):

通过Speed = LUTSpeed [idxSpeed] 进行非线性加速 (每按一次Up / Down,我们就会将idxSpeed加1)

LUTSpeed [] = { 1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4,5,5,6 } 

通过Strafe = LUTStrafe [idxStrafe] 进行非线性Straing (每次我们按左/右键我们将加/减1的idxStrafe)

 LUTStrafe [] = { 1,1,1,2,2,2,2,2,2,3,3,3,3,3 } 

Hill通过RelativeSpeed 加速/减速 = LUTRelSpeed [idxTrackPosition]将在轨道加载时基于山坡计算

 LUTRelSpeed [] = { 0,0,0,0, 1,2,2,2, 0,0,0, -1, -1, -2, -4, 0,0,0, ... } 

我现在只需要用上面的表格系统就可以实现转向。 什么是最快的转向方式,会给人一种逼真的倾覆感,并可能导致曲线中间的“失去控制”? 这不仅仅是一个简单的单一表,因为它需要考虑到速度(你不会漂移在10英里,而是在100英里)。 我怀疑整个“漂移”方程中的速度可能是一个简单的乘法修饰符,例如:

 LUTDrifting [idxSpeed] = { 0.0f, 0.1f, 0.2f, 0.3f, ... 0.9f, 1.0f } Of course, no floats would be used, just fixedpoint, float is here just to illustrate the concept 

现在,我可以看到一个解决scheme,它使用2个向量(当前的正向vector和一个导向vector),结果vector将是这两个乘积(因此即使转向只会调整导向vector,结果会减慢向前移动)。 但是要做到这一点,必须有一个计算简单的方法!