1. 物理引擎简介
1.1 游戏物理
定义:
- 通过物理公式的计算来模拟真实世界的物理现象(e.g.重力、刚体、柔体、碰撞、变形、流体、布料)。
优点:
- 增加游戏的真实性
- 减少美术工作量
- 减少逻辑代码的工作量
性能与真实性之间的取舍:
- 如何欺骗玩家
常见的物理模拟类型:
- 刚体物理
- 破碎物理
- 粒子物理
- 流体物理
1.2 游戏引擎
定义:
- 已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程式的核心组件。
- 为游戏设计者提供各种编写游戏所需的各种工具。
- 通常包含:渲染引擎、物理引擎、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理等。
举例:
- Unity:《王者荣耀》、《神庙逃亡》、《纪念碑谷》、《崩坏》
- Unreal(虚幻):《质量效应》、《战地之王》、《剑灵》、《绝地求生》
- Frostbite(寒霜):《战地》、《极品飞车》、《荣誉勋章》
- CryENGINE:《幽灵战士》、《孤岛危机》、《怪物猎人onile》
- 3DGame Studio
- RenderWare:《侠盗列车手》、《实况足球》、《轩辕剑》、《仙剑》
- Gamebryo:《上古卷轴》、《文明4》、《战锤》、《辐射3》
1.3 物理引擎
作用:
- 物理引擎计算物体位置、速度、加速度,而后通过绘图引擎渲染图像
定义:
- 通过为物体赋予真实的物理属性的方式来计算运动、旋转和碰撞反应等物理反应。
- 实际上通常是一个函数库。
在挑选时的考量:
- 功能、正确性、性能、支持的平台、是否开源、文件完整性、有无可视化工具等。
- Unity3D使用的物理引擎是:PhysX(3D)、Box2d(2D)
2. 二维物理引擎组件
2.1 刚体(Rigidbody 2D)
定义:
刚体是受物理引擎控制的元件,场景中运动的元件都应加上刚体。
属性:
2.2 碰撞器(Collider 2D)
类型:
Is Trigger属性:
- 通常用于可被穿透的物体。
相关函数:
//进入碰撞体时
void OnTriggerEnter2D(Collider2D other)
{
}
//结束碰撞时
void OnTriggerExit2D(Collider2D other)
{
}
3. 三维物理引擎组件
3.1 刚体(Regidbody)
属性:
相关函数:
//在物体的中心点位置新增一个Vector3的力,使物体朝该Vector3方向运动
Rigidbody.AddForce(Vector3);
//在物体中心新增一个力矩Vector3可以使物体旋转,刚体将顺着torque轴旋转
Rigidbody.AddTorque(Vector3);
//在某个位置新增一个大小为float,半径为range的爆炸力
//向爆炸范围内各个方向的物体施加一个力,用来模拟爆炸效果
//爆炸力随着刚体的距离线性衰减
Rigibody.AddExplosionForce(float forceStrength,Vector3 positon,float range);
3.2 碰撞器(Collider)
3.2.1 盒子碰撞器(Box Collider)
3.2.2 胶囊碰撞器(Capsule Collider)
3.2.3 网格碰撞器(Mesh Collider)
3.2.4 轮胎碰撞器(Wheel Collider)
3.2.5 地表碰撞器(Terrain Collider)
3.2.6 静态碰撞器(Static Colliders)
定义:
- 将包含碰撞器但不包含刚体的游戏物体中的碰撞器称为“静态碰撞器”,应当注意尽量不要移动带有静态碰撞器的物体,消耗资源较大。
3.3 刚体与碰撞器的比较
关系:
- 刚体能够给物体新增物理效果,碰撞器能够使物体之间发生碰撞。
- 碰撞体不一定要有刚体,但是刚体一定要有碰撞器才可以有碰撞效果。
- 两个碰撞体至少要有一个是刚体。
3.4 Joints
作用:
- 产生两个Rigidbody之间的约束力,以对其相对运动加以限制。
- 需要Rigidbody同时存在才有效果。
类型:
4. 碰撞算法
- AABB算法
- SAT算法