在游戏里优雅地开车
相信不少同学都体验过赛车竞速类游戏带来的驾驶的乐趣,无论是 GTA 中驾驶汽车在城市里漫无目的冲撞,还是在极品飞车系列中漂移过弯氮气加速。在游戏的虚拟世界中体验紧张刺激而又带有真实感的驾驶,离不开游戏引擎对车辆的物理模拟。
这篇文章将简要的介绍一下在游戏开发中实现载具驾驶所需要的一些简单车辆动力学原理。包括动力和传动系统,车轮和制动系统,以及转向系统。
阅读本文推荐拥有的前置知识包括:
加减乘除 高中物理
油门焊死!动力和传动系统
动力系统
首先我们需要弄清楚,汽车引擎的输出究竟是什么。这可以从内燃机的工作原理说起……
大家中学物理一定都学过内燃机的工作原理,这里复习一下四冲程内燃机的四个冲程:
进气(吸气)冲程:活塞落下,将汽油和空气的混合物体,通过一个或者多个进气门注入汽缸。 压缩冲程:升起的活塞将燃料和空气的混合物压缩。 动力(点火)冲程:接近压缩冲程顶点时的燃料和空气之混合物体被火星塞点燃,将活塞推下。 排气冲程:活塞升起,将燃烧过的废气通过一个或者多个排气门排出气缸。
由此可知,内燃机的产生动力源自于动力冲程,燃料和空气混合物燃烧产生巨大的压力,将活塞推开,通过连杆和曲轴将线性的压力转化为转动力矩。至此发动机完成了动力输出,也就是说,汽车引擎输出的是力矩 (Torque)。 ,国际单位是 Nm。
除此之外,可能会有人听说过“马力”的概念,马力 (horsepower) 是一个古老的功率单位,常用在汽车、航空和造船领域,引擎输出的功率等于输出扭矩 × 转速。在分析汽车引擎的性能时,通常将引擎的输出扭矩和功率描述成一个关于转速变化的函数,即发动机的转速特性曲线。在 Forza Horizon 4 游戏中选购汽车引擎配件时展示的图像就是转速特性曲线。
有时候在讨论车辆引擎性能的时候,比起扭矩,更多的会讨论输出功率。但在本文所讨论的车辆模拟模型中,只需要考虑扭矩输出。
内燃机引擎的转速并不能无限的提高,为了降低引擎的磨损,汽车引擎存在一个转速上限,通常称为 "Redline",也就是发动机转速表中的红色区域。当引擎转速超过阈值时,就会立即切断燃油供应。此时在阻力的作用下发动机转速下降,而当转速低于阈值时恢复燃油供应,发动机恢复动力输出,提升转速。如此循环往复,转速在 Redline 前反复横跳,也是在游戏中常见的一个现象。
传动系统
这里我们将只考虑前置后驱车的传动模型,也就是引擎在汽车前侧,汽车后轮为驱动轮。汽车引擎输出的动力将会经过变速箱和传动轴,最后到达后轮。为了更好的利用引擎输出的动力,在动力传递到驱动轮之前,引擎的扭矩和转速将经过若干级变速齿轮的调节。由于引擎转速存在限制,为了尽可能地提高车速,即用更低的扭矩换取更高的转速,也能尽可能最大化的利用发动机牵引力,即通过更低的转速换取更高的扭矩,汽车使用变速箱来实现对变速齿轮传动比的调节。
变速齿轮通过引入传动比,改变输入的转速和力矩。设某一齿轮的传动比为 x,经过该齿轮变速后的扭矩和转速可以通过下列方程描述:
由以上方程也可知,功率,也就是转速 × 扭矩,在经过齿轮变速后是不变的。
为了简化模型,我们通常认为引擎的输出经过了两级齿轮变速,变速箱 (gear) 齿轮和差速器 (differential) 齿轮,它们的传动比分别用
为了简化模型,我们通常认为引擎的输出经过了两级齿轮变速,变速箱 (gear) 齿轮和差速器 (differential) 齿轮,它们的传动比分别用
其中 η 是传动效率,在模拟实现中,我们可以假定 η = 1 或是根据转速改变(更高的转速通常意味着更高的磨损消耗)。其中差速器齿轮传动比也被称为车辆的最终传动比 (Final Drive Axle Ratio)。
当我们已知车轮的半径时,车速与引擎转速的关系就可以确定了(假定车轮与地面没有相对滑动)
真实汽车的变速箱齿比、最终传动比,车轮半径,以及引擎最大扭矩等数据可以在网上查询得到。例如下表是某日产 GT-R 的数据:
| Property | Value |
|---|---|
| Maximum Horsepower @ RPM | 565 @ 6800 |
| Maximum Torque @ RPM | 467 @ 3300 |
| Transmission Description | Auto-Shift Manual w/OD |
| Number of Transmission Speeds | 6 |
| First Gear Ratio (:1) | 4.06 |
| Second Gear Ratio (:1) | 2.30 |
| Third Gear Ratio (:1) | 1.59 |
| Fourth Gear Ratio (:1) | 1.25 |
| Fifth Gear Ratio (:1) | 1.00 |
| Sixth Gear Ratio (:1) | 0.80 |
| Reverse Ratio (:1) | 3.38 |
| Final Drive Axle Ratio (:1) | 3.70 |
数据源自 https://www.caranddriver.com/nissan/gt-r/specs
方程 (5) 表明,当齿轮传动比恒定时,车速与引擎转速呈线性相关,我们可以通过发动机转速-车速曲线来描述这一关系。结合驱动力-车速特性曲线图,我们就可以得到一个合理的驾驶换挡时机。
车轮驱动和制动
经过变速齿轮、传动轴和差速器之后,引擎输出的力矩最终传递到了车轮上,引擎力矩驱动车轮产生旋转,轮胎与地面之间的摩擦力,给轮轴产生向前的驱动力,最终驱动汽车向前运动。
而当车辆制动时,制动器施加在制动盘上的摩擦力给车轮产生反向力矩,阻止车轮旋转,车轮与地面之间的摩擦力给轮轴产生向后的制动力,阻碍车辆向前运动。
在实际情况中,轮胎在加速和减速时与地面并非 100%无相对滑动,我们通常使用一个相对的 滑动率 (slip ratio) σ 来描述车轮与地面之间的相对滑动:
其中 ω 和 R 分别为车轮的角速度和半径,v 是车辆相对地面的运动速度。轮胎能提供的最大驱动力/制动力均与滑动率相关。
由图也可以看出,轮胎与地面的摩擦力存在一个峰值,大约在 10% 左右的相对滑动率。在达到峰值之前,摩擦力与滑动率的关系近乎线性相关。
直线动力学
阻力
上文我们已经分析了来自引擎的驱动力和制动器的制动力,我们已经可以开始实现一个直线运动的汽车了。汽车在运动过程中,除了驱动力和制动力,还持续受到环境阻力,这其中主要包括滚动阻力
其中,空气阻力可以用下列方程近似描述:
其中:A 是车辆前面积(参考值 2.2m²),ρ 是空气密度(参考值 1.29 kg/m³),v 是车辆运动速度。
滚动阻力可以用下列方程近似描述:
滚动阻力受到轮胎气压、材质、胎面纹理、地面材质、温度等参数的影响,但我们可以近似将其视作与速度线性相关的值。文献[3]中指出,在车速大约 100km/h (30m/s) 时,滚动阻力与空气相等。因此我们可以据此计算得到一个
于是车辆加速时的合力为:
接下来运用我们幼儿园学过的牛顿第二定律就可以让车动起来了!
车速,转速和离合器
如果我们回顾上文提到的汽车动力和传动系统,在实现直线加速时可能会感到迷惑:当汽车从静止并启动时,引擎输出的转速和扭矩是多少?上文中提到的各种引擎转速特性曲线,都没有提到转速等于 0 的情况。如果有过机动车驾驶经验会知道,当发动机转速过低(例如 300 rpm 以下)会熄火。也就是汽车引擎在工作时不存在转速为 0 的情况。
这时候就需要我们一直忽略掉的离合器。离合器是一个介于发动机与车轮传动装置之间的一个机械构件,可以手动控制(手动挡)分离和闭合。学过科目一就知道,汽车低速起步时不需要踩油门,踩下离合器挂上一档再缓慢松开离合器,汽车就会开始缓慢前进。如果此时观察汽车转速表,会发现在整个过程中转速始终维持在 800 rpm 左右。
离合器的结构可以简单的理解为两个同心圆盘,当离合器全分离时,两个圆盘彼此分离,无接触,两者转速可以完全不一致。当离合器全闭合时,两个圆盘紧密接触,两者转速一致。而当离合器半接触时,两个圆盘彼此接触,但此时两个圆盘可以存在相对滑动,在摩擦力的作用下两个圆盘的转速会趋于一致。由此实现了车辆从零到一的起步过程。
当车辆运行时,离合器完全闭合,车轮旋转的转速经过传动系统决定引擎的转速,此时通过引擎的转速特性曲线可以得到当前引擎的最大输出扭矩,在油门的控制下,引擎输出力矩,再经过传动系统成为施加在车轮上的转动力矩,带动车轮加速旋转,驱动车辆加速前进。这一过程可以在游戏循环中迭代模拟。
车辆转向
低速转向
车辆在较低运行速度下转向时,我们可以认为车轮与地面不存在相对滑动,车辆的转向运动符合阿克曼转向模型 (Ackerman steering)。即车辆转向可以用如下的几何关系描述:
车辆为了能稳定的转向,四个轮胎的法线垂线需要相交于一点,该点就是车辆转向的圆心。此时由几何关系可以发现,两个转向轮(也就是前轮)的偏转角存在微小的差异。为了简化实现,我们可以把四轮简化为 2 轮,即只有一个前轮和一个后轮,也就是摩托车那样。
此时只需要非常简单的几何方法就可以实现车辆的低速转向,倒车同理。
高速转向
在车辆高速运行时,轮胎与地面存在较为显著的相对滑动,因此不再适用低速的 Ackerman steering。此时我们认为导致车辆转向的力和力矩来自于车轮的侧向力,即沿轮胎垂线方向上的力。
我们将轮胎的朝向与行驶方向之间的夹角称为侧偏角 (Slip Angle)
与纵向摩擦力类似的,在轮胎侧偏角较小时,侧向力与侧偏角近似线性相关,并且存在一个峰值,随着侧偏角进一步增大,轮胎侧向力将减小。
影响轮胎侧向力的因素除了侧偏角以外,轮胎的负载也是一个重要的因素。上图展示的是某轮胎在 5KN 的负载下的侧向力曲线,在这里我们可以近似的认为侧向力与轮胎负载成线性关系。在实现时,我们可以参照某一给定负载下的侧向力曲线(例如上图的 5kN 负载),按比例计算得到其他负载情况下的车轮侧向力。
最终车辆四轮的侧向力合力一部分将作为车辆质心的转动向心力,另一部分作为车辆刚体的转动力矩。
其中作用在质心的合力可以用下式表示:
其中,δ 为前轮转向角。
结合中学学过质点转动向心力方程,可以得到车辆质心的转动半径 R,进而通过几何关系完成车辆质心的移动。
而车体转动合力矩可以用下式计算:
其中 b,c 分别是车辆质心到前后轮的位移矢量,与对应的力矢量做叉积运算。
不足转向、过度转向和漂移
当车辆在高速状态下稳定转向时,前轮与后轮侧向力相等,此时车体不发生多余的旋转。若是转向时前轮侧向力小于后轮,转向时前轮产生的侧向滑动程度大于后轮,此时称为不足转向。而若是转向时后轮侧向力小于前轮,后轮产生的侧向滑动程度大于前轮,车辆就会发生所谓的漂移,此时称为过度转向。
因此实现漂移的关键是制造过度转向,也就是使得后轮侧向力小于前轮。在上文提到的车轮侧向力除了与侧偏角有关,还与轮胎的纵向滑动率有关,关系可以参考下图:
由图可知,侧向力随轮胎滑动率增大而减小,因此让后轮加速旋转或是制动,都可以通过提高后轮滑动率,从而降低后轮侧向力,从而实现漂移。想必大家都在游戏中试过手刹漂移,手刹一般作用于后轮,此举便是通过将后轮抱死,使得后轮相对地面产生较大滑动率,同时猛打方向盘在前轮产生较大的侧向力带动车体转动,由于后轮侧向力小于前轮,就会发生过度转向,也就漂起来了。
除此之外,对于后轮驱动的车辆,降低挡位并加大油门,引擎输出的巨大扭矩带动后轮高速旋转,也能制造较大的滑动率,降低后轮侧向力并实现漂移。
代码实现
本文中所介绍的简单车辆动力学已经足以用于一个 2D 游戏中实现一个车辆模拟了,所涉及的物理方程也不过是中学物理的水平。但在代码实现上还是需要一些 Trick,以及大量的魔法数字。其中一些参数,例如引擎转速特性曲线,难以用一个解析函数来表达。在 Unity 中我们可以利用 AnimationCurve 将这些参数绘制成曲线,在运行时对曲线进行采样从而获得相应的参数,如下图就是我在 Unity 中绘制的一个引擎的转速特性曲线。
而轮胎的纵向摩擦力和侧向力的曲线,也可以通过绘制 Curve 的形式设置。参考资料 [5] 中给出了一套在给定的轮胎滑动率和侧偏角下近似计算轮胎摩擦力和侧向力的解析函数模型,利用这个模型,我们可以运用一些真实轮胎的参数得到一个近似拟真的摩擦力曲线。
笔者在最终实现的 Demo 里面用了很多的 trick 使得驾驶和漂移的手感看起来像那么回事,也简化了许多部分。例如在实现中没有实现离合器的半离合传动,而是将引擎的转速特性曲线画到了 0 转速,在汽车起步时让引擎从 0 转速开始工作。其次笔者没有实现车轮打滑的机制,作用在车轮上的力矩在抵消了摩擦力带来的力矩之后,剩下的部分被忽略了。合理的做法应当是计算出车轮上最终的合力矩后,利用车轮转动惯量计算车轮角加速度使车轮加速旋转产生相对滑动。因为没有打滑机制,手刹漂移也不是通过抱死车轮实现的,而是在按下手刹键后直接调整后轮最大侧向力,调节比率暴露作为参数以调节漂移手感。
点击 阅读原文 在 GitHub 上找到这个 Demo
References
[1] Marco Monster. Car Physics for Games. https://asawicki.info/Mirror/Car%20Physics%20for%20Games/Car%20Physics%20for%20Games.html
[2] Gillespie, T. D. 车辆动力学基础. 清华大学出版社, 2008.
[3] Zuvich, Ted. "Vehicle dynamics for racing games." Game Developers Conference Proc. 2000.
[4] Chaichaowarata, R., and W. Wannasuphoprasit. "Tire test for drifting dynamics of a scaled vehicle." Journal of Research and Applications in Mechanical Engineering 1.3 (2013): 33-39.
[5] Tire Model in Driving Simulator. http://code.eng.buffalo.edu/dat/sites/tire/tire.html