Unity学习笔记06物理系统
主要功能
各种力的支持:比如重力,摩擦力,动力,浮力等。
基本的物理体:简单的几何形体,比如长方体,球,平面等。三维网格模型,可以使用简单的几何体作为包围体来
代替模型。
物体间的碰撞检测:可以使用包围体的简单计算方式,也可以采用三维网格的精确碰撞(但对计算量消耗较大)。
CCD(连续碰撞检测)可以提供跟高精度的碰撞响应。
碰撞反应:物理引擎能够根据碰撞发送的具体情况,按照物理规律计算物体的碰撞反应。
粒子系统:粒子系统的计算过程就是物理仿真的过程。
其他功能:如使用刚体以及刚体链接关系实现布娃娃系统(Rag Doll)。布料,可变性物体以及可破坏物体等。
简单操作
Rigidbody
刚体,其中的Constraints:如果勾选其中的对应方向,则物体将在该方向上被锁定。Use gravity:是否使用重力。
有专门的物理材质(Physic Material):其中的Bounciness代表的是弹性。
Plane自带有Mesh Collider碰撞体。
Constant Force:一个恒力
典型物理效果模拟
四元数Quaternion
使用四元数(使用欧拉角会带来万向节死锁问题)表示旋转的一个最大好处就是可以实现SLERP插值(spherical
linear interpolation,球面线性插值)。
SLERP插值的原理
普通线性插值的计算方法
1.计算两个值的差:△a=a1-a0;
2.取得差的一部分:t△a;
3.在初始值上加上2中的结果:lerp(a0,a1,t)=a0+t△a。
四元数中的插值
1.△a=a1/a0;
2.(△a)t 这里是t次方;
3.slerp(a0,a1,t)=a0(△a)t。
四元数在游戏中的应用
用来替代欧拉角来参与旋转计算,和欧拉角之间可以互相转换。(游戏中表示旋转,一般还是以欧拉角为主),即
四元数仅仅参与中间的计算。
应用
实现一个简单的子弹发射效果,在场景中制作好一个预制件,将下面的脚本赋给摄像机,然后将预制件拖拽给脚本
开放出来的参数。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BallFire : MonoBehaviour
{
public GameObject bullet;
static float pressTime = 0f;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if(Input.GetButton("Fire1"))
{
pressTime += Time.deltaTime;
}
if(Input.GetButtonUp("Fire1"))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
GameObject b = Instantiate(bullet, ray.origin, Quaternion.LookRotation(ray.direction)) as GameObject;
var cf = b.GetComponent<ConstantForce>().relativeForce = new Vector3(0, 0,pressTime * 10);
pressTime = 0;
}
}
}
链接结构(Joint)
用来模拟现实世界中的关节结构(joint是一个宽泛的概念,泛指用来连接不同物体的一种结构)
Joint是“约束”的一种(约束相关物体的运动)
常见类型
Character Joint :常用来表示人体的一些骨骼链接
Hinge Joint:门扇类型
Fixed Joint:相关的物理体无法发发生相对运动,是固定的结构
Spring Joint:弹簧类型
Configurable Joint :一般类型,可配置类型,开发人员可以根据需要来约束Joint的自由度,可以用在布娃娃系统
(Ragdoll)中。
可破坏链接
当力或者力矩达到阈值的话,链接关系破坏。可以实现一些游戏功能(当破坏发生时,使用触发函数)
Anchor表示物体的旋转轴。
Rigidbody中的Is Kinematic如果勾选上表示该物体是运动学物体,不受力的影响(一般是空物体勾选)。
简单操作
新建一个空物体,为其添加约束类型的组件。新建一个盒子,将其拖拽给空物体的约束组件的Connected Body
(一般要为盒子添加刚体组件之后才可以添加)。
Joint属性面板中的Break Force和Break Torque表示外部受到的力大到一定程度的时候,链接会被破坏。(使用上
节的简单子弹效果进行实践,当子弹打到这些物体时,链接会被破坏)
碰撞事件
碰撞检测)作用:游戏很多机制依赖于碰撞事件(伤害判定,触发对话,人工智能,特效等)
碰撞体
基础碰撞体:规整的几何体,比如球,长方体,圆柱,胶囊等。可以通过基础碰撞体组合出较精确的复合碰撞体。
网格碰撞体
静态碰撞体(应用于场景物体,不发生移动,利于做优化,碰撞信息可以提前预计算)
碰撞类型
1、碰撞体碰撞:碰撞物体空间不能冲突(就比如两个拳头碰撞)
2、触发器碰撞:碰撞物体空间可冲突(就比如浮力)
碰撞产生的条件
两个物体必须都有碰撞器,且至少其中一个有刚体组件
碰撞响应消息
碰撞检测消息:参与碰撞的物体,需要满足什么条件时,才能进行碰撞检测
触发器响应消息
触发器消息:
实践
每个物体都有一个Collider,表示这个物体可以发生碰撞,点击edit collider可以调整碰撞体的大小。
浮力效果
实现原理
1.通过触发器碰撞实现。
2.物体处于另外一个物体内的时候,有响应事件。
3.按照浮力公式对进入力场的物体施加力。