转载: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. 每日英语:Three Shows That Changed The Way Networks Think About Viewership

    As we continue examining this season’s DVR success stories in The Blacklist and Sleepy Hollow it mak ...

  2. Delphi对象池MyObjectPool.pas

    对象池一般在服务端使用,所以稳定性是第一的. 欢迎提意见 unit uMyObjectPool; interface uses SyncObjs, Classes, Windows, SysUtils ...

  3. 玩转Bootstrap(JS插件篇)-第1章 模态弹出框 :1-3 模态弹出框

    模态弹出框(Modals) 这一小节我们先来讲解一个“模态弹出框”,插件的源文件:modal.js. 右侧代码编辑器(30行)就是单独引入 bootstrap 中发布出的“modal.js”文件. 样 ...

  4. js如何获取前后连续n天的时间

    function GetDateStr(AddDayCount) { var dd = new Date(); dd.setDate(dd.getDate()+AddDayCount);//获取Add ...

  5. ActiveMQ入门实例(转)

    转载自:http://www.cnblogs.com/xwdreamer/archive/2012/02/21/2360818.html 1.下载ActiveMQ 去官方网站下载:http://act ...

  6. hadoop 大数据 介绍

    1.Hadoop是一个大家族,是一个开源的生态系统,是一个分布式运行系统,是基于Java编程语言的架构.不过它最高明的技术还是HDFS和MapReduce,使得它可以分布式处理海量数据. 2.HDFS ...

  7. [转]SpringMVC<from:form>表单标签和<input>表单标签简介

    原文地址:https://blog.csdn.net/hp_yangpeng/article/details/51906654 在使用SpringMVC的时候我们可以使用Spring封装的一系列表单标 ...

  8. python 基础笔记

    1,去掉了C语言中的大括号,用空格来对齐语句块.(空格一般用2个或4个,但没有限制) 2,要在py文件代码中使用中文,需要在第一行加入下面的代码: # -*- coding: utf-8 -*- 或者 ...

  9. linux 正则表达式和通配符

    linux 正则表达式和通配符 通配符用于查找文件 包含三种:  * ? [] * 代表任意个任意字符 ? 代表任意一个字符 [] 代表中括号中的一个字符 正则表达式(正则是包含匹配,只要包含就可以匹 ...

  10. Eclipse启动都会Error when loading the SDK

    http://jingyan.baidu.com/article/aa6a2c14fb54190d4c19c480.html