物理引擎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来平滑此次的TransformCollision Detection:碰撞检测,该属性用于控制避免高速运动的游戏对象穿过其他的对象而未发生碰撞,有3项可以选择,Discrete:离散碰撞检测,该模式与场景中其他的所有碰撞体进行碰撞检测;Continuous:连续碰撞检测;Continuous Dynamic:连续动态碰撞检测模式Constraints:约束,该项用于控制对于刚体运动的约束刚体变量为了获取和更改物体的运动状态,unity3D还预留了多个变量接口,这些接口简化了对物体运动状态的处理,使得开发人员能够轻易地对物体的运动状态进行干预。碰撞器(体)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) 相同。关节Hinge Joint 链条连接 他可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。想想两个物体间连个链条,大家就理解了。 Fixed Joint 固定连接 他模拟了两个物体间存在一根杆子,固定了两个物体的相对位置和相对朝向。 spring Joint 弹簧连接 模拟两个物体间有一根弹簧,大于或者小于固定位置的时候产生相对的弹力,根据弹性系数距离偏移越大作用力越大。 Character Joint 角色关节连接模拟人体骨头间的关节连接,就是两个物体能根据一个关键点自由的朝一个方向旋转,但固定在一个相对距离,而且可以设置关节的限制。可以用在蒙皮骨骼模型上做活动关节,这样就可以做到很多游戏引擎里那种各种自由姿势的死法了。 Configurable Joint 可配置连接万能连接方式,通过配置非常多的参数和限制,你可以做到能想到的任何物体与物体间的连接方式,包括上面所有的,当然配置起来比较复杂。 常见Joint参数用法connectedBody 连接到的物体(必须是rigidbody)breakForce 物体连接断裂所需要的力breakTorque 物体连接断开所需要的扭力 当物体连接断开的时候会触发这个消息 Connected Body 连接体-------------为刚体指定的关节连接物,如不设定,则与世界相连 Anchor 锚点-----------------------主体摇摆围绕的锚点坐标,基于本地坐标系 Axis 坐标轴-----------------------摇摆方向的坐标,基于本地坐标系 Auto configure connected anchor—自动配置连接锚(这个无需更改) Use Spring 是否使用弹簧-----------弹簧使刚体相对它连接的主体达到一个特定的角度 Spring 弹簧-----------------------用于如激活Use Spring的弹簧属性 Spring 弹簧力----------------维持对象移动到一定位置的力 Damper 阻尼------------------值越大,对象移动越慢 Target Position 目标角度-----弹簧的目标角度。弹簧拉向这个角度,以角为单位 Use Motor 是否使用马达-------------Motor使对象旋转 Motor 马达------------------------用于如激活Use Motor的马达属性 Target Velocity 目标速率-----对象设法达到的速度 Force 力---------------------用于达到目标速率的力 Free Spin 自由转动-----------如果启用,Motor永远不会破坏旋转,只会加速 Use Limits 是否有限制-------------如果启用,铰链的角度将被限制在最大和最小之间 Limits 限制-----------------------用于如启用Use Limits 的边界属性 Min 最小---------------------能达到的最小角度 Max 最大---------------------能达到的最大角度 Min Bounce 最小弹跳---------物体碰触最小限制时的弹跳值(5.5.3版本好像不行) Max Bounce 最大弹跳---------物体碰触最大限制时的弹跳值(5.5.3版本好像不行) Break Force破坏力-----------------允许这个铰链破损的力 Break Torque 破坏扭矩-------------允许这个铰链破损的扭矩 Enable Collision使碰撞------------使连接在一起的物体碰撞 Enable Preprocessing使预处理------禁用关节预处理有助于稳定不可能完成的配置
来源:https://blog.csdn.net/SHAOLANWAGN/article/details/99292204