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曲线的渐近点。
    StiffnessExtremum 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

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值