这里的世界是一个游戏引擎中的虚拟世界,是一个基于牛顿物理定律模拟各个碰撞对象运行碰撞时的物理世界。主要由以下几个部分组成:
- 碰撞对象:是在物理世界中可发生碰撞的,有物理属性(质量、摩擦系数、弹力等)的对象。碰撞对象也是让Game Object具有碰撞效果的组件。
- 碰撞形状:一个碰撞对象可由一个或多个简单或复杂的形状构成。
- 碰撞组:对碰撞对象进行分组,通过组在处理碰撞对象之间的碰撞关系。
- 碰撞消息:当两个碰撞对象发生接触时,引擎会自动向两个对象发送的消息。
- 关节:用于对碰撞对象进行物理约束或施加力。
- 射线:通过发出射线,检测碰撞对象在世界中的位置。
两个不同的物理世界不可能发生物理关联。就像两个人在不同的时间经过同一个点,这两个人是绝对不会产生物理上的碰撞。在游戏引擎也是一样的,可以把不同的Collection Proxy代理的对象看着是两个不同时间点世界,就算是基于同一个prototype对象也不可能产生碰撞。
本文只讲 碰撞对象 相关的内容,关于 碰撞消息、关节、射线再专门写文章进行讲解。
碰撞对象
碰撞对象组件为Game Object提供了可碰撞的物理效果,但是碰撞对象也分为不同的类型,如下表所示:
| 类型 | 说明 |
|---|---|
| Static | 静态对象,位置不可移动的,可以其他非静态对象发生碰撞,不可以运行时修改,多用于游戏中的地板或墙壁等固定场景的元素。 |
| Dynamic | 动态对象,具有完整的物理属性,被物理引擎管理。用户只能向它施加力,影响它的位置与运动状态,但是不是直接控制它的物理状态,会依据设置的质量、摩擦系数、弹力系数、阻尼系数等,受到物理引擎的控制。 |
| kinematic | 动画对象,具有完整的物理属性,但是不受物理引擎管理,可碰撞,适合用于脚本控制的游戏对象。 |
| Trigger | 触发器,用于做碰撞检测,性能非常好。 |
可以一个碰撞对象中添加多个碰撞形状,比如对于一个人形的游戏角色,给四肢、躯干、头添加不同的碰撞形状,也可以比较粗放的给整个角色加一个凸多边形做为碰撞形状。这主要看我们的游戏控制精度。
碰撞对象的属性
碰撞对象具有的属性示例如下所示:
- Friction:表示摩擦系数,在0~1之间的值,0表示极度光滑,1表示极度粗糙。
- Mass:表示物体的质量。
- Restitution:表示物体的弹力系数,在0~1之间的值。
- Linear Damping:表示物体运动时的线性阻尼系数,在0~1之间的值,影响物体运动的线性速度,让线性速度越来越小。
- Angular Damping:表示物体运动时的角阻尼系数,在0~1之间的值,影响物体的旋转速度,让旋转速度越来越慢。
- Group:表示当前碰撞对象的分组名。
- Mask:表示能与当前分组碰撞的其他分组名,如果有多个分组名使用英文逗号间隔。