unity学习(四) —— 物理系统之Rigidbody

Rigidbody

Rigidbodies允许你的 GameObject在物理的控制下行动。Rigidbody可以接收力和力矩来让你的物体真实地移动。每个包含 Rigidbody的 GameObject都会受到重力的影响,在你脚本施加的力下运动,或通过 NVIDIA PhysX物理引擎与其他物体交互。
unity学习(四) —— 物理系统之Rigidbody

属性

PS:带 - 的为上一行属性的选项介绍

属性 功能
质量(Mass) 物体的质量(单位默认为 千克)。
空气阻力(Drag) 物体在移动时受到多少空气阻力影响。0:没有空气阻力,无穷:物体立即停止运动。
角阻力(Angular Drag) 在因力矩旋转时受到多少空气阻力。0:无空气阻力,无穷:物体停止转动。
使用重力(Use Gravity) 如果允许,物体会受到重力影响。
Is Kinematic 如果允许,物体将不再由物理引擎驱动,且只能通过 Transform操作。
Interpolate 只有当你在 Rigidbody移动中看见 jerkiness,再去尝试其中的选项。
- None 不应用Interpolate
- Interpolate 在上一帧的 Transform的基础上对 Transform进行平滑处理。
- Extrapolate 在下一帧预估的 Transform的基础上对 Transform进行平滑处理。
碰撞检测 被用于防止移动过快的物体穿过其他物体而没有检测到碰撞。
- 离散(Discrete) 对场景中所有其他碰撞物使用离散碰撞检测。其他碰撞物会用离散碰撞检测测试与它的碰撞。用于正常碰撞(默认值)。
- 持续(Continuous) 对动态碰撞物(有 Rigidbody)使用离散碰撞检测,对静态碰撞物(没有 Rigidbody)使用基于扫描(sweep-based)的连续碰撞检测动态连续(Coutinuous Dynamic)设置的 Rigidbodies将会使用连续碰撞检测来对此 rigidbody进行碰撞检测。 其他 rigidbodies使用离散碰撞检测。 用于连续碰撞检测需要碰撞的物体。(这对物理性能有很大影响,如果对速度快的物体的碰撞没有问题,尽量设置为离散(Discrete))
- 动态连续(Continuous Dynamic) 对设置了连续和连续动态碰撞的 GameObject使用基于扫描的连续碰撞检测。它同样会对静态 Colliders使用连续碰撞检测。对其他碰撞物使用离散碰撞检测。用于移动速度快的物体。
- 推测连续(Continuous Speculative) 对 Rigidbodies 和 Colliders使用推测连续碰撞检测。这是你可以设置 kinematic bodies的唯一的 CCD模式。这个方法比基于扫描的连续碰撞检测的开销大。
Constraints 限制 Rigidbody的运动
- Freeze Position 停止 Rigidbody在 X, Y, Z(可选)轴上的运动。
- Freeze Rotation 停止 Rigidbody在 X,Y,Z(可选)轴上的旋转。

细节

Rigidbodies允许你的 GameObjects在物理引擎的控制下行动。通过为你的GameObjects添加力到Rigidbody能够产生不同的感觉,且看上去就像是在调整你的 Transform组件。一般来说,你不应该操作同一GameObject的Rigidbody和Transform。
操作Transform和Rigidbody的最大区别就是是否使用力。Rigidbodies能接受力和力矩,但是Transform不能。Transform能被平移和旋转,但是这跟使用物理不同。添加力/力矩到Rigidbody实际上将会改变物体的Transform组件的position和rotation。因此你只能使用两者之一。在使用物理的时候改变Transform会造成碰撞和其他计算问题。
Rigidbodies在被物理引擎影响之前,必须显式添加给你的GameObject。你可以在菜单 Components->Physics->Rigidbody为你选择的物体添加 Rigidbody。现在你的物体已经能在重力的影响下下落,且可以通过脚本添加力了。

脚本

你可以通过 AddForce()和 AddTorque在物体的 Rigidbody上添加力和力矩。

动画

对于大多数情景(主要是ragdoll效应),在动画和物理之间切换物体的控制权是必要的。为了达到这个目的,Rigidbodies能被标记为 isKinematic。当 Rigidbody被标记为 isKinematic,它将不再被碰撞,力,或物理系统的其他模块所影响。这意味着你必须通过直接操作Transform组件来控制物体。Kinematic Rigidbodies将会影响其他物体,但是它们自身不会被物理影响。

Colliders

为了允许撞击发生,Colliders 是必须要添加到 Rigidbody的另一种组件。如果两个 Rigidbodies相互碰撞,除非每个物体都有一个 Collider关联,否则物理引擎将不会计算碰撞。在物理仿真期间,无 Collider的Rigidbodies只是会简单地穿过彼此。

复合 Colliders(Compound Colliders)

复合 Colliders是基本 Colliders的组合,且像单 Rigidbody一样行动。当你有一个复杂模型,且想要使用简单的估算来模拟碰撞形状时,它就能够派上用场。为了创建一个复合 Collider,首先生成你的碰撞对象的子对象,然后为每个子对象添加 Collider组件。
unity学习(四) —— 物理系统之Rigidbody
上图中,枪模型有一个 Rigidbody相关联以及多个基本 Colliders作为子 GameObject。当母 Rigidbody受力移动时,子 Colliders也会一起移动。基本 Colliders将会与环境中的 Mesh Collider碰撞,且母 Rigidbody将会改变它的移动方式,这个移动方式是基于 力 以及 子Colliders是如何与场景中的其他Colliders相互影响的。
Mesh Colliders是不能正常相互碰撞的。如果 Mesh Collider被标记为凸(Convex),那么它就能与其他 Mesh Collider碰撞。典型的解决方法是为移动的物体使用基本 Colliders,为静态背景物体使用 Mesh Collider。

使用正确的大小

你的 GameObejct网格大小远比Rigidbody 的质量(mass)要重要。如果你发现你的 Rigidbody的行为并没有按照预期发生:移动慢,浮动,或错误地碰撞,就可以考虑下调整你的 mesh asset的规模。Unity默认单位规模是 1 unit = 1 meter,因此你的输入网格的规模是维持的,且被应用于物理计算。比如说,一个摇摇欲坠的摩天大楼崩塌方式与积木搭成的塔是不一样的,所以不同大小的物体应该以精确规模建模。
如果你要在 Unity中构建2米高的人物模型,记得检查你的对象有正确的尺寸。你可以使用 GameObject > 3D Object > Cube的方式创建一个立方体,它的高是精确的1米,所以你的人物应该是它的两倍。
如果你无法调整网格自身,可以在 Project视图中选中它,并在菜单栏选中 Asset->Import Setting,就可以改变一个特殊网格的统一规模了。

上一篇:Unity—物体基础移动方式


下一篇:【记录】使用 JavaScript(Typescript) 实现AStar 寻路算法