物理引擎

Unity内置了NVIDIA的Physx物理引擎,Physx是目前使用最为广泛的物理引擎,被很多游戏大作所采用,开发者可以通过物理引擎高效、逼真地模拟刚体碰撞、车辆驾驶、布料、重力等物理效果,使游戏画面更加真实而生动。

1、刚体

在介绍物理引擎之前,需要先学习一下刚体(Rigidbody)。Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过NVIDIA物理引擎与其他的游戏对象发生互动的运算都需要游戏对象添加了刚体组件。

下面创建一个游戏对象,给这个游戏对象添加上刚体组件。如下图所示。

下面我们学习一下物理组件中刚体的一些属性。

Mass:质量,该项用于设置游戏对象的质量,数据类型是float类型,默认情况都是1,一般来说,大部分刚体的Mass属性值应该设置为0.1-10.0之间,这样模拟出来的刚体更加接近于生活。

Drag:阻力,这里的阻力是指物体移动时的阻力,物体在任何方向移动都会受到Drag的影响。数据类型float类型,默认情况下为0,Drag值是阻碍物体做位移运动,它的方向总是和物体移动的方向相反,通过设置Drag值可以达到羽毛和石头掉落的效果。

Angular Drag:旋转阻力,与Drag相似,旋转阻力也是用来物体运动的,旋转阻力是用来阻碍物体旋转的,数据类型是float类型,默认情况都是1。

Use Gravity:使用重力,若开启此项,游戏对象会受到重力的影响。

Is Kinematic:是否开启动力学,若开启此项,游戏对象将不再受物理引擎的影响从而只能通过Transform属性来对其操作

Interpolate:插值,该项用于控制运动的抖动情况,有3项可以选择,None:没有插值;Interpolate:内插值,基于前一帧的Transform来平滑此次的Transform;Extrapolate:外插值,基于下一帧的Transform来平滑此次的Transform

Collision Detection:碰撞检测,该属性用于控制避免高速运动的游戏对象穿过其他的对象而未发生碰撞,有3项可以选择,Discrete:离散碰撞检测,该模式与场景中其他的所有碰撞体进行碰撞检测;Continuous:连续碰撞检测;Continuous Dynamic:连续动态碰撞检测模式

Constraints:约束,该项用于控制对于刚体运动的约束

2.刚体变量

为了获取和更改物体的运动状态,unity3D还预留了多个变量接口,这些接口简化了对物体运动状态的处理,使得开发人员能够轻易地对物体的运动状态进行干预。

角速度(angularVelocity):表示刚体的角速度向量,其数据类型为Vector3,该向量的方向即为刚体旋转轴的方向,旋转方向遵循左手定则;该角速度的大小为向量的摸,单位为rad/s。建议不要对此变量进行修改。

Void Start(){GetComponent<Rigibody>().angularVelocity = Vector3.up;
}

位移速度(velocity):表示物体的位移速度值。一般不建议去修改。

Void Start(){GetComponent<Rigibody>().velocity = Vector3.up;
}

重心(centerOfMass):通过调低物体的重心,可以使物体不易因其他物体的碰撞或作用力而倒下,若不对重心进行设置,unity3D会对重心位置自动进行计。

Void Start(){GetComponent<Rigibody>().centerOfMass= Vector3.up;
}

碰撞检测开关(detectCollisions):用于表示物体是否能够与其他物体产生碰撞效应,默认是TRUE,是可以与其他物体碰撞的。

Void Start(){GetComponent<Rigibody>().detectCollisions= Vector3.up;
}

惯性张量(inertiaTensor):该变量用来描述物体转动惯量,其数据类型为Vector3.如果不对该值进行设置和干预,他将通过挂载在物体对象上的碰撞器组件自动进行计算。

Void Start(){GetComponent<Rigibody>().inertiaTensor= Vector3.up;
}

惯性张量旋转值(inertiaTensorRotation):该变量指物体张量的旋转值,其数据类型为Quaternion,即四元数。

Void Start(){GetComponent<Rigibody>().inertiaTensorRotation= Vector3.up;
}

其他变量如最大角速度(maxAngularVelocity)、最大穿透速度(maxDepenetrationVelocity)、坐标(position)、旋转(rotation)、是否使用锥形摩擦(useConeFriction)

Void Start(){GetComponent<Rigibody>().maxAngularVelocity= 1.9f;GetComponent<Rigibody>().maxDepenetrationVelocity= 2.0f;
}

3.刚体常用方法

下面我们直接看下面几行代码,通过注释来学习他们。

Void Start(){//给物体施加力GetComponent<Rigibody>().AddForce(Vector3.up*3);//施加爆炸力GetComponent<Rigibody>().AddExplosionForce(19.0,transform.position,10,1.5f,ForceMode.Force);//给物体施加相对力GetComponent<Rigibody>().AddRelativeForce(Vector3.up*10,ForceMode.Force);//给物体施加力矩GetComponent<Rigibody>().AddTorque(-Vector3.up*70,ForceMode.Force);//给物体施加相对力矩GetComponent<Rigibody>().AddRelativeTorque(-Vector3.up*70,ForceMode.Force);Void FixedUpdate(){//移动刚体GetComponent<Rigibody>().MovePosition(transform.position+Vector3.right*Time.deltaTime);//旋转刚体GetComponent<Rigibody>().MoveRotation(transform.rotation*Quaternion.Euler(new Vector3(0,100,0)*Time.deltaTime));//在指定点施加力GetComponent<Rigibody>().AddForceAtPosition(transform.position,ForceMode.Force);}}

以上代码都是刚体中的方法,除了以上方法还有:

计算相对刚体的最近点(ClosestPointOnBounds)

获取点坐标系的速度(GetPointVelocity)

获取基于相对点坐标系的速度(GetRelativePointVelocity)

确定物体是否处于休眠(isSleeping)

设置密度(SetDensity)

强制休眠(Sleep)

唤醒(WakeUp)

扫描检测(SweepTest)

扫描全部(SweepTestAll)

4.碰撞器(体)

Unity中碰撞器包括6种,如下所示

盒子碰撞器

选中游戏对象,添加组件BoxCollider,在场景视图中的立方体就会出现一个绿色的轮廓,这就是碰撞器的真身了。在Unity中会将游戏对象的碰撞器以绿色轮廓显示出来,方便我们手动调整碰撞范围。参数也比较简单:

Is Trigger(是否为触发器) 这个选项是供脚本使用的,如果勾选了这个则不会有碰撞的物理效果,但是游戏引擎会通知脚本有物体发生了碰撞。

Material(碰撞器材质) 在这里可以选择一种物理材质,来模拟更真实的碰撞效果,比如金属之间的碰撞与石头之间的碰撞效果肯定是不一样的。

Center(碰撞器中心点) 可以调整碰撞器离物体中心的距离,也就是移动绿框。

Size(碰撞器大小) 调整碰撞器的缩放大小,调整XYZ可以让碰撞器变成任意大小的长方体。

球星碰撞器

胶囊碰撞器

网格碰撞器

车轮碰撞器

地形碰撞器

5.物体发生碰撞的必要条件

unity中的两个物体要想发生碰撞,必须依赖于自身的碰撞器组件(Collider),并且至少其中一个物体必须附有刚体组件(Rigidbody),其中附带碰撞检测脚本的物体必须有刚体组件。

unity中的碰撞检测,主要有两种接口函数,一种是碰撞信息检测,一种是触发信息检测(在检视面板碰撞器组件中勾选IsTrigger属性选择框,则为触发器模式),这两种接口函数具体为:

碰撞信息检测

  只有进入碰撞器时,调用该方法,在两个物体离开碰撞器之前只调用一次1.MonoBehaviour.OnCollisionEnter(Collision collisionInfo) 在两物体保持接触时调用,在两个物体碰撞器离开之前每帧调用一次2.MonoBehaviour.OnCollisionStay(Collision collisionInfo)只有两个物体碰撞器离开时,调用该方法一次3.MonoBehaviour.OnCollisionExit(Collision collisionInfo)

触发信息检测:

只有进入触发器时,调用该方法,在两个物体离开触发器之前只调用一次
1.MonoBehaviour.OnTriggerEnter(Collider colliderInfo)
在两物体保持接触时调用,在两个物体触发器离开之前每帧调用一次
2.MonoBehaviour.OnTriggerStay(Collider colliderInfo)
只有两个物体触发器离开时,调用该方法一次
3.MonoBehaviour.OnTriggerExit(Collider colliderInfo)

以上的接口函数都是MonoBehaviour的函数,由于我们新建的脚本都继承这个MonoBehaviour这个类。所以我们的脚本里面可以直接写这些函数。

这两种模式下的碰撞检测有什么区别呢?区别是这样的:

在使用碰撞器类型检测时,两个物体是不能进入相互内部的,并且两个物体的碰撞器接触时,在附有刚体组件的物体是会受到力的反馈作用的;

而在使用触发器类型检测时,这时候两个物体是可以进入内部的,附有刚体组件的物体并不会受到力的反馈作用,这样一来,如果我们需要检测两个物体是否有接触,同时又不希望他们产生力的影响,就可以使用触发器检测来监测两个物体是否有接触了。

6.物理引擎的其它应用

1.Physics Material
物理材质 (Physics Material) 用于调整碰撞对象的摩擦力和反弹效果。摩擦力、弹力和柔软度是由物理材质决定的。
Unity提供的物理材质资源包中包含了大部分常见的物理材质。
创建Physics Material创建方法:

(1)在Project视图中,点击鼠标右键,依次点击Create->Physic Material即可。
(2)点击菜单栏Assets,然后依次点击Create->Physic Material即可。
Physics Material应用
将物理材质 (Physics Material) 从“工程视图”(Project View) 拖动到场景中的碰撞体 (Collider) 上。或拖动到Collider组件的Material栏
Physics Material属性
动态摩擦力 (Dynamic Friction):已在移动时使用的摩擦力。通常值为 0 至 1。值 0 的状态类似于冰,值 1 会使其非常快速的静止下来,除非有很大的力或重力推动对象。
静态摩擦力 (Static Friction):对象在某个表面上保持静止时使用的摩擦力。通常值为 0 至 1。值 0 的状态类似于冰,值 1 会使对象非常难以移动。
弹力 (Bounciness):表面的反弹程度。值 0 不会反弹。值 1 会反弹而不损失任何能量。
摩擦力合并模式 (Friction Combine Mode):两个碰撞对象摩擦力的合并方式。
平均值 (Average):计算两个摩擦力值的平均值。
最小 (Min):使用两个值的较小值。
最大 (Max):使用两个值的较大值。
相乘 (Multiply):摩擦力值相互相乘。

合并反弹 (Bounce Combine):两个碰撞对象弹力的合并方式。其模式与“摩擦力合并模式”(Friction Combine Mode) 相同。

7.关节

Hinge Joint     链条连接  

他可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。想想两个物体间连个链条,大家就理解了。

Fixed Joint    固定连接  

他模拟了两个物体间存在一根杆子,固定了两个物体的相对位置和相对朝向。

Spring Joint    弹簧连接  

模拟两个物体间有一根弹簧,大于或者小于固定位置的时候产生相对的弹力,根据弹性系数距离偏移越大作用力越大。

Character Joint    角色关节连接

模拟人体骨头间的关节连接,就是两个物体能根据一个关键点自由的朝一个方向旋转,但固定在一个相对距离,而且可以设置关节的限制。可以用在蒙皮骨骼模型上做活动关节,这样就可以做到很多游戏引擎里那种各种自由姿势的死法了。

Configurable Joint  可配置连接

万能连接方式,通过配置非常多的参数和限制,你可以做到能想到的任何物体与物体间的连接方式,包括上面所有的,当然配置起来比较复杂。

7.常见Joint参数用法

connectedBody      连接到的物体(必须是rigidbody)

breakForce              物体连接断裂所需要的力

breakTorque           物体连接断开所需要的扭力

<OnJointBreak>     当物体连接断开的时候会触发这个消息

Unity之物理引擎相关推荐

  1. Unity 3D 物理引擎简介 || Unity 3D 物理材质|| Unity 3D 力(AddForce)

    Unity 3D 物理引擎简介 早期的游戏并没有强调物理引擎的应用,当时无论是哪一种游戏,都是用极为简单的计算方式做出相应的运算就算完成物理表现,如超级玛丽和音速小子等游戏. 较为常见的物理处理是在跳 ...

  2. Unity(物理引擎)

    1.定义 物理引擎就是在游戏中模拟真实的物理效果,比如,场景中有一个立方体和一个球体,球体在空中,立方体在地面倾斜放置,在空中的球体开始自由下落,然后与地面上的立方体对象发生碰撞,而物理引擎就是用来模 ...

  3. [Unity 3D] 物理引擎学习笔记(一)

    刚体: 同是物理引擎提供的功能,碰撞检测只需要有 Collider 便可以运作,但所有与作用力相关的属性和函数却都依赖 Rigidbody. 重力: 一旦使用了 Rigidbody 组件,这个 Gam ...

  4. 《Unity 4 3D开发实战详解》一6.7 物理引擎综合案例

    本节书摘来异步社区<Unity 4 3D开发实战详解>一书中的第6章,第6.7节,作者: 吴亚峰 , 杜化美 , 张月霞 , 索依娜 责编: 张涛,更多章节内容可以访问云栖社区" ...

  5. Unity3D游戏开发初探—3.初步了解U3D物理引擎

    一.什么是物理引擎? 四个世纪前,物理学家牛顿发现了万有引力,并延伸出三大牛顿定理,为之后的物理学界的发展奠定了强大的理论基础.牛顿有句话是这么说的:"如果说我看得比较远的话,那是因为我站在 ...

  6. 【Unity 3D】学习笔记三十六:物理引擎——刚体

    物理引擎就是游戏中模拟真是的物理效果.如两个物体发生碰撞,物体自由落体等.在unity中使用的是NVIDIA的physX,它渲染的游戏画面很逼真. 刚体 刚体是一个很很中要的组件. 默认情况下,新创的 ...

  7. Unity——物理引擎

    刚体(Rigidbody) Mass:质量,用于计算速度,加速度 Drag:摩擦力,模拟运动中受到的阻力 Angular Drag:旋转摩擦力,如果旋转的话,力越大,停下来的越快 Use Gravit ...

  8. unity 下一帧执行_Unity中的Havok Physics物理引擎

    在GDC 2019上,我们宣布将Havok Physics作为预览版资源包加入到Unity资源包管理器,这意味着所有Unity开发者都可以使用这款知名的物理引擎.在当今主机平台中,Havok Phys ...

  9. Unity --- 物理引擎 ---- 刚体RigidBody 与 碰撞器 collider

    1.RigidBody(刚体)的作用是让物体具有物理特性(比如说重力,摩檫力等等) 2.如果想让物体能够与其它物体发生碰撞的话,我们还需要一个组件 --- Colider碰撞器组件 1.上图就是Uni ...

  10. Unity 3D游戏六:打飞碟物理引擎

    文章目录 前言 游戏要求 游戏分析 游戏实现 总结 选做题:打靶游戏 前言 中山大学数据科学与计算机学院3D游戏课程学习记录博客. 游戏代码: gitee 游戏视频: bilibili 参考师兄的博客 ...

最新文章

  1. mysql自定义收藏分类_MYSQL中SHOW的使用整理收藏
  2. 用markdown写博客园
  3. Spring MVC 学习 之 - 拦截器
  4. C++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“volatile”
  5. html5赛车小游戏,html5公路赛车小游戏
  6. python从字符串中提取数字_filter
  7. 为什么我们不要 .NET 程序员
  8. ElementUI:文本框实现远程搜索的用法
  9. jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
  10. LeetCode 793. 阶乘函数后K个零(二分查找)
  11. [转载] Python基础之类型转换与算术运算符
  12. osqa mysql_osqa安装出现的问题解决办法 | 学步园
  13. ubuntu安装流媒体服务器(nginx+rtmp,rtsp转rtmp,rtsp转m3u8)
  14. 毕设-基于SpringBoot企业人事管理系统
  15. 布丰投针实验 MATLAB仿真 以及报告
  16. HMI-PLC数据交换方式之一 区域指针
  17. 狂神说JAVA 数组、三种初始化和内存分析
  18. Python 网络数据采集(三):采集整个网站
  19. 【VSCode】yarn : 无法加载文件 A:\yuke\node\node_gobal\yarn.ps1,因为在此系统上禁止运行脚本。
  20. 一文带你看懂微信小程序费率怎么收

热门文章

  1. JNI入门与进阶,JNI调用外部非标准程序SO【一】
  2. 联想Y9000P-2022款踩坑指南 加装固态和内存 win10系统安装
  3. 基于DDS的多波形程控信号发生器
  4. vivado之FFT ip核的入门学习
  5. BP 神经网络算法原理
  6. 金山WPS+Google文件=谷歌金山Office?
  7. Adobe Reader历史版本安装包下载
  8. VC++消息钩子编程
  9. XP卸载IE8的方法
  10. 【Qt】绘制CIE色度图