转载:Unity3d 汽车物理引擎 WheelCollider总结

 

WheelCollider总结

写了前面两篇文章,我想总结一下WheelCollider!

让我们能够更清晰的学会物理车的开发!

1.车的层次结构

一般这样分,车身,车身的包围盒,四个轮子和四个轮子的碰撞器!

2.分析驱动车的原理

车主体本身加了一个Rigidbody,物理车我们可以加一个到两个包围盒来

包住车身(但是绝对不能包住车轮,否则物理车不运动!)物理车有前后四个轮子,那么有的车需要前轮进行驱动,后轮进 行辅助,有的车需要后轮进行驱动,前轮进行辅助!这个很好办,如果是哪个

轮进行驱动,就设置这个轮子的WheelCollider.motorTorque,也就是轮子

的动力,WheelCollider.steerAngle,设置轮子的旋转角度,这样就基本OK

了,那么车轮如何随着地面的起伏行走呢?这就是另一个问题了!

关于如何使车轮始终保持在地面之上,并且随着地面的起伏进行起伏的运    动?

可以从车轮碰撞器(WheelCollider)向地面发射一条射线,用Physics.Raycast来获取一个RaycastHit;获取碰撞点,调整车轮的位置,

这里对WheelCollider的属性做一个补充,是拷贝的http://game.ceeger.com/Components/class-WheelCollider.html的片段!

Properties 属性

  • Center 中心
    Center of the wheel in object local space. 车轮在对象自身坐标的中心位置
  • Radius 半径
    Radius of the wheel.  车轮的半径大小
  • Suspension Distance 悬挂距离
    Maximum extension distance of wheel suspension, measured in local space.   Suspension always extends downwards through the local Y-axis. 最大车轮悬挂伸缩距离,以自身坐标计算。悬挂总是通过自身Y轴伸展向下。
  • Suspension Spring 悬挂弹簧
    The suspension attempts to reach a Target Position by adding spring and damping forces. 通过添加弹簧和阻尼力,悬挂试图达到目标位置(Target Position)。
  •     Spring 弹簧
    Spring force attempts to reach the Target Position. A larger value makes the suspension reach the Target Position faster.弹簧力尝试达到目标位置(Target Position),大的值可使悬挂快速达到目标位置(Target Position)。
  •     Damper 阻尼器
    Dampens the suspension velocity. A larger value makes the Suspension Spring move slower. 阻尼器控制悬挂速度,大的值可使悬挂弹簧移动变慢。
  •     Target Position 目标位置
    The suspension's rest distance along Suspension Distance. 0 maps to   fully extended suspension, and 1 maps to fully compressed suspension.   Default value is zero, which matches the behavior of a regular car's   suspension. 悬挂的静止状态距离沿着悬挂距离,0值充分伸展悬挂,1值充分压缩悬挂,默认值为0,这是一个标准的汽车悬挂行为
  • Mass 质量
    The Mass of the wheel. 车轮的质量
  • Forward/Sideways Friction 向前摩擦力
    Properties of tire friction when the wheel is rolling forward and sideways. See Wheel Friction Curves section below. 当车轮向前/侧向滚动时的摩擦力属性。参见下面车轮摩擦力曲线部分。

对于物理车就写到这儿,以后理解的更深一些,就继续续写……

下面我就物理,Rigidbody,以及“关节”的分别做个教程,呵呵……!

Unity3d物理汽车第二篇

1.第一篇留下的问题,还没有得到解答!我目前的结论就是可以赋值为负值!

2.我自己用了个方块做为车身,然后用四个轮子,把代码套了上去,车子竟然一动不动!

并且出现了以下警告:

MissingComponentException: There is no 'AudioSource' attached to the "Cube" game object, but a script is trying to access it.
You probably need to add a AudioSource to the game object "Cube". Or your script needs to check if the component is attached before using it.
PlayerCar_Script.Update () (at Assets/Scripts/Car Control/PlayerCar_Script.js:48)

我贴出来48行的代码:

audio.pitch = Mathf.Abs(EngineRPM / MaxEngineRPM) + 1.0 ;

就是audio,但是我忘了给物理车添加Audio Source(音频源),导致程序出现警告,导致后面的程序没有执行!

所以,汽车就没有开动了!当大家遇到警告的提示之后,一定要分析原因,检查问题!养成良好的分析问题的习惯,这就是积累经验的时候了!

Audio Source中一个参数pitch是音频源的音调!这里的audio.pitch的最大值是2;

3.现在贴出来车轮与地面碰撞的代码!JS语言写的!

//车轮碰撞器

var CorrespondingCollider : WheelCollider;
            //车轮印
            var SlipPrefab : GameObject;

//车轮的旋转值
           private var RotationValue : float = 0.0;

//更新函数

function Update () {

//光线投射碰撞,用来获取从raycast函数中得到的信息反馈的结构。

var hit : RaycastHit;

//WheelCollider是挂在一个空物体上的Transform上,所以,要用空物体的变换去变换

WheelCollider的中心点(本地坐标的点),这样ColliderCenterPoint就是世界坐标中的点了!

var ColliderCenterPoint : Vector3 = CorrespondingCollider.transform.TransformPoint( CorrespondingCollider.center );

//最主要的部分

//光线投射,从ColliderCenterPoint的位置,向CollesponndingCollider.transform.down方向,发射一条长度为 (车轮悬挂的最大延长距离(suspensionDistance)+车轮碰撞器的半径(radius))的线段!准确的叫线段!返回hit这个信息

if ( Physics.Raycast( ColliderCenterPoint, -CorrespondingCollider.transform.up, hit, CorrespondingCollider.suspensionDistance + CorrespondingCollider.radius ) )

{

//如果这条线段碰撞到了物体!

//设置车轮物体(不是车轮碰撞器)的坐标为碰撞点的坐标+车轮碰撞器的半径
  transform.position = hit.point + (CorrespondingCollider.transform.up * CorrespondingCollider.radius);
 }else{

//如果没有碰撞,就让车轮物体,不断下落,每帧下落(车轮悬挂的最大延长距离(suspensionDistance))的  距离
  transform.position = ColliderCenterPoint - (CorrespondingCollider.transform.up * CorrespondingCollider.suspensionDistance);
 }

}

//车轮物体的旋转为 车轮碰撞器所附加的空物体的变换*车轮碰撞器绕x旋转RotationValue,

//绕Y轴旋转steerAngle,绕Z轴旋转0度

WheelCollider.steerAngel返回车轮碰撞器绕自身Y轴旋转的角度

//乘法的顺序很重要,这里的意思,实际中是先后面的旋转,再前面的旋转!

transform.rotation = CorrespondingCollider.transform.rotation * Quaternion.Euler( RotationValue, CorrespondingCollider.steerAngle, 0 );
 // 累加RatationValue  每一帧车轮的旋转值为rpm*6*Time.deltaTime
 RotationValue += CorrespondingCollider.rpm * ( 360/60 ) * Time.deltaTime;

//WheelHit是有WheelCollider返回的碰撞信息

var CorrespondingGroundHit : WheelHit;

//返回WheelHit
 CorrespondingCollider.GetGroundHit( CorrespondingGroundHit );
 //WheelCollider.sidewaySlip是侧轮滑动的值,如果这个值大于2.0,则复制一个粒子对象,做为车轮印!
  if ( Mathf.Abs( CorrespondingGroundHit.sidewaysSlip ) > 2.0 ) {
  if ( SlipPrefab ) {

//复制 , SlipPrefab原物体,WheelCollider.point车轮其它物体碰撞点的位置,Quaternion.identity,不进行任何旋转
   Instantiate( SlipPrefab, CorrespondingGroundHit.point, Quaternion.identity );
  }
 }

我有理解不正确的地方,麻烦指正一下……!

下一篇总结一下,呵呵!

unity-----------------------------关于WheelCollider设置或小车运动的注意事项的更多相关文章

  1. 关于Unity中的小案例之运动的小船以及摄像机跟随技术(专题五)

    实例步骤 1.创建Unity项目和文件目录,保存场景 场景搭建 2.导入美术做好的资源包(第68) a: 导入地形资源包terrain.unitypackage,把里面的Map/Prefabs/Ter ...

  2. unity灯光烘焙设置详解

    游戏场景中灯光照明的构成 现实生活中的光线是有反射.折射.衍射等特性的.对这些基本特性的模拟一直以来都是计算机图形图像学的重要研究方向. 在CG中,默认的照明方式都是不考虑这些光线特性的,因此出来的效 ...

  3. 【Unity】Collider随骨骼动画运动

    Collider位置和角色的动作不一致会导致Mesh互相镶嵌,让游戏失真. 想象一扇门的Collider没随它打开的动画移动,结果就是你看着门开着却穿不过去. 而我遇到的情况是:     角色在执行跑 ...

  4. Unity几个有用的游戏运动特效

    本文摘要 本文主要记录了我在开发格斗游戏时用到的几个运动特效,可以方便地表现武器挥动.运动模糊和其他一些特效.灵活使用可以大幅提升格斗游戏的视觉效果和感染力.有关Unity的其他话题也可以查阅我的其他 ...

  5. Unity Shader 屏幕后效果——摄像机运动模糊(速度映射图实现)

    速度映射图主要是为了得到每个像素相对于前一帧的运动矢量,其中一种方法是使用摄像机的深度纹理来推导. 推导过程如下: 先由深度纹理逆推出NDC(归一化的设备坐标)下的顶点坐标,利用VP矩阵(视角*投影矩 ...

  6. Unity目录结构设置

    摄像机 Main Camera 跟随主角移动,不看 UI 剧情摄像机 当进入剧情时,可以关闭 main camera,启用剧情摄像机,不看 UI UI 摄像机 看 UI Unity编辑器常用的sett ...

  7. unity 3d 三、空间与运动

    3D游戏编程第三次作业 简答并用程序验证[建议做] 游戏对象运动的本质是什么? 游戏对象运动的本质是游戏对象Position.Rotate.Scale属性数值的变化. 请用三种方法以上方法,实现物体的 ...

  8. 【Unity原神AR开发实战 2022】下载原神模型,PMX转FBX,导入到Unity,AR设置,测试应用程序,生成应用程序

    文章目录 一.前言 二.模型下载 1.官网下载 2.模之屋官方下载 3.第三方链接 三.pmx转fbx 1.Blender插件CATS的下载与安装 2.pmx模型的导入 四.Unity开发部分 1.V ...

  9. 贴图在Unity中的设置

    例如:一张512X512的图片占用的内存大小,计算方法:512*512*4/1024=1.024MB. 如果在贴图设置里设置成真彩色那就等于计算的值,设置成16位色彩,内存占用会减少. 在进行性能优化 ...

随机推荐

  1. [Windows Azure] How to Scale a SQL Database Solution

    How to Scale a SQL Database Solution On Windows Azure, database scalability is synonymous with scale ...

  2. 聊聊javascript的null和undefined

    只要是说到js的变量和数据类型,就脱不开null和undefined,这兄弟俩就是js的重要基础,不可不察,无数的同学们都用过放大镜多角度多批次地研究过这兄弟俩,真是深受欢迎.^-^ js也真是怪异, ...

  3. _ENV和_G

    5.1之前, 全局变量存储在_G这个table中, 这样的操作:a = 1 相当于:_G['a'] = 1 但在5.2之后, 引入了_ENV叫做环境,与_G全局变量表产生了一些混淆,需要从原理上做一个 ...

  4. 使用 CocoaPods 给微信集成 SDK 打印收发消息

    使用 CocoaPods 给微信集成 SDK 打印收发消息 推荐序 本文介绍的是一套逆向工具,可以在非越狱手机上给任意应用增加插件.在文末的示例中,作者拿微信举例,展示出在微信中打印收发消息的功能. ...

  5. __slots__ Python Class限制添加属性

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: class Student(object): pa ...

  6. dubbo超时重试和异常处理

    dubbo超时重试和异常处理 dubbo超时重试和异常处理 参考: https://www.cnblogs.com/ASPNET2008/p/7292472.html https://www.tuic ...

  7. 16款纯CSS3实现的loading加载动画

    分享16款纯CSS3实现的loading加载动画.这是一款实用的可替代GIF格式图片的CSS3加载动画代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div clas ...

  8. PHP只显示姓名首尾字符,隐藏中间字符并用*替换

    //测试时文件的编码方式要是UTF8 $str='中文a字1符'; echo strlen($str).'<br>';//14 echo mb_strlen($str,'utf8').'& ...

  9. 为什么hash作为内存使用的经典数据结构?

    听到这样说法:hash是内存中使用的经典数据结构.内存是典型的随机访问设备. 为什么hash这种数据结构很适合内存使用呢?如何理解内存是随机访问设备呢? 因为我想知其所以然,如何理解背后的原因,我花费 ...

  10. require.js+knockout.js+.underscore模板引擎的使用

    第一种使用方式: HTML: <ul data-bind="template: { name: 'peopleList' }"></ul> <scri ...