Unity利用WheelCollider制作汽车

利用WheelCollider制作汽车

环境搭建

  • 地形
  • 摄像机

模型准备

  • 车体
    • 正方体
  • 车轮
    • 圆柱体

创建汽车对象的步骤

  1. 创建一个空的GameObject作为汽车的根对象,添加刚体组件RigidBody,设置质量为1000-1500
  2. 将准备好的车身拖进汽车的根对象中,作为其子对象
  3. 在汽车根对象下创建一个Colliders对象,并根据车身组织在Colliders里面添加一些BoxCollider
  4. 在汽车根对象下创建一个WheelColliders对象,往里面添加四个空对象,分别给四个空对象添加WheelCollider,作为四个轮胎

注意事项

  1. 必须得给汽车根对象添加RigidBody,否则汽车无法模拟移动
  2. 必须添加BoxCollider,不然重力会使汽车掉落
  3. 适当给汽车设置一定的空气阻力,不然汽车在没有力矩的情况下会滑动很久

RigidBody重要参数

  • Mass

    刚体的质量,在汽车上表示汽车的质量

  • Drag

    根据力移动对象时影响对象的空气阻力大小。0 表示没有空气阻力,无穷大使对象立即停止移动

  • Angular Drag

    根据扭矩旋转对象时影响对象的空气阻力大小。0 表示没有空气阻力

  • centerOfMass

    质量重心,会自动根据附加到刚体上的碰撞器自动计算,建议设置到前座附近

WheelCollider

用于地面交通工具的特殊碰撞体,内置了碰撞检测、车轮物理组件和基于打滑的轮胎摩擦模型。

  • Mass

    车轮质量,必须大于0,典型值20-80,可以根据汽车的实际情况增大或减小

  • Radius

    车轮的半径,根据实际的车轮模型大小进行调整,本地空间中测量

  • wheelDampingRate

    车轮的阻尼率。必须大于零。

  • Suspension Distance

    车轮悬架离车身的最大延伸距离,可以理解为车轮在行进过程中车轮离开正常位置的最大距离

  • Force App Point Distance

    从静止车轮的底部到车轮受力点的距离。默认值为 0,表示在静止车轮的底部施加力,但明智的做法是将此点定位在略低于汽车质心的位置。

    模拟悬架几何形状的实际侧倾中心,向下移动作用点会在转弯时引入更多侧倾,向上移动作用点则会减少转弯时的侧倾。

    最好不要将该参数设置为零,因为这会导致模拟在某些配置下不稳定。如果您观察到车辆在平坦表面上无法进入“睡眠”状态(表现出抖动行为或在无用户输入时沿表面漂移)

  • Center

    车轮在对象局部空间中的中心位置

  • suspensionSpring

    • spring

      描述弹簧的刚度。其单位为牛顿米,改变车辆响应道路颠簸所需的时间以及轮胎承受的载荷量,从而影响操作体验。

      较大的值,会使悬架更快的达到目标位置,增加操作的可变性,使车不稳

      较小的值,可以提供更平稳、响应更迟钝的驾驶体验

    • damper

      弹簧消散其储能的速率

      较大的值会使悬架更慢地到达目标位置

      较小的值会使汽车看起来更有弹性

    • targetPosition

      描述车轮的目标位置(静止情况下的位置),在汽车行驶过程中,发生颠簸时,车轮都会向这个位置靠近

      取值为0-1,0表示完全伸展的悬架,1表示完全压缩的悬架

  • Forward/Sideways Friction

    模拟车轮向前的摩擦曲线

    在这两个方向上,首先确定轮胎打滑的程度(基于轮胎橡胶和道路之间的速度差异)。然后,将该打滑值用于计算施加在接触点上的轮胎力

    曲线以轮胎打滑的度量值作为输入,并以力作为输出。曲线由包含两部分的样条图近似模拟。第一部分从 (0 , 0)(ExtremumSlip , ExtremumValue),目标点处曲线的正切值为零。第二部分从 (ExtremumSlip , ExtremumValue)(AsymptoteSlip , AsymptoteValue),目标点处曲线的正切值再次为零:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-awlmbiyh-1619582446461)(WheelFrictionCurve.png)]

    根据真实轮胎的特性,在低打滑条件下,轮胎可能会施加很大的力,因为橡胶会通过拉伸来补偿打滑。随后,当打滑变得非常高时,随着轮胎开始滑动或旋转,力会减小。因此,轮胎摩擦曲线的形状与上图相似

    *属性:* *功能:*
    Extremum Slip/Value 曲线的极值点。
    Asymptote Slip/Value 曲线的渐近点。
    Stiffness Extremum ValueAsymptote Value 的乘数(默认值为 1)。改变摩擦力的刚度。将此值设置为零将完全禁用车轮的所有摩擦力。通常在运行时修改刚度以使用脚本来模拟各种地面材质。
  • brakeTorque

    制动扭矩,以牛顿米表示。用于刹车时设置,一般只给后轮设置制动扭矩

  • motorTorque

    轮轴上的电机扭矩(以牛顿米表示)。根据方向,可以为正值或负值,前进后后退

  • steerAngle

    车轮转向角度(以度为单位),始终围绕本地 Y 轴。用与左转右转

  • sprungMass

    WheelCollider 支撑的质量。车辆模拟使用簧载质量模型 - 它将所有车轮支撑的汽车的全部质量一次分解为由每个车轮支撑的一组簧载质量。然后,计算每个车轮-质量对的所有悬架和轮胎力,最后整合施加到车身的所有力。在最简单的情况下,对于具有四个车轮的完全对称的车辆,所有簧载质量将等于汽车质量的四分之一。该属性根据车辆配置自动进行计算。

设置WheelCollider参数的注意事项

  • 在同一条轴上的左轮右轮参数应该保持一致
  • Sideways Friction的stiffness设置不能太小,容易向左向右打滑,车子会表现的很飘
  • motorTorque需要根据每帧的值来进行设置,没有输入则需要设置为0

相机跟随的技巧

在汽车对象下创建两个子对象,一个表示Camera的位置,另一个则表示Camera的lookAt位置


脚本控制

以下是根据官方脚本给出的基本功能模拟的解释

基本功能模拟
  • 驱动方式

    ​ 将汽车的最大motorTorque平均分配每个车轮

    ​ 即:每个车轮的motorTorque = 最大motorTorque / 车轮数

    • 四驱

      给汽车的四个WheelCollider都设置motorTorque

    • 前驱

      给汽车的前轮WheelCollider都设置motorTorque

    • 后驱

      给汽车的后轮WheelCollider都设置motorTorque

  • 刹车

    • 手刹

      给汽车的后轮设置适当的brakeTorque,需要注意在汽车重新需要前进时,将此值设置为0

  • 前进

    给汽车的相应轮胎设置大于0的motorTorque,根据驱动方式中的公式算出

    当车速大于5英里每小时并且车身速度和车身前进方向夹角小于50度时,会给每个WheelCollider设置brakeTorque属性,达到减速的效果

  • 后退

    给汽车的相应轮胎设置小于0的motorTorque

    为模拟真实情况,后退的动力需要使用单独的motorTorque来控制,而不是直接用汽车的最大motorTorque/车轮数

  • 最大速度的限制

    比较车身Rigidbody.velocity和最大速度的值,将其限制在最大速度值以下

  • 转向

    基本功能:给前轮的WheelCollider设置steerAngle(0-maxSteerAngle)

    对速度和车身的控制:

    假如上一次车体Y方向角度比这次小于十度,就根据相差的度数乘以给系数SteerHelper,得出需要旋转的度数,根据这个度数算出四元数,然后将刚体速度直接旋转这个偏移度数。这个做法相当于做了一个角度辅助,不完全凭借WheelCollider物理效果,而直接操控速度方向,对车角度进行调整。

    效果:如果m_SteerHelper为0,车转角度时就很死,如果为1,车转角度就特别灵活

  • 牵引力控制模拟

    启动牵引力:给定一个系数TractionControl,范围为0-1,1表示汽车开始的扭矩力为0,0表示汽车一开始的扭矩力为最大值

    有输入时每次增加的牵引力:10*TractionControl

    根据滚动方向轮胎打滑程度,如果超过限制,则减小牵引力

  • 档位模拟

  • 抓地力的模拟

    根据速度直接增加一个向下的力

  • 声音

  • 特效

高级功能的模拟

待补充

参考:

WheelCollider:https://docs.unity.cn/cn/current/ScriptReference/WheelCollider.html

车轮碰撞体教程:https://docs.unity.cn/cn/2018.4/Manual/WheelColliderTutorial.html

CarController的详解:https://blog.csdn.net/narutojzm1/article/details/51374198/

调试实例:https://blog.csdn.net/Gao_sun/article/details/108267478?spm=1001.2014.3001.5501

你可能感兴趣的:(Unity)