欢迎光临散文网 会员登陆 & 注册

Unity学习笔记06物理系统

2021-11-30 08:13 作者:挽秋_z  | 我要投稿

物理引擎基础

主要功能

各种力的支持:比如重力,摩擦力,动力,浮力等。

基本的物理体:简单的几何形体,比如长方体,球,平面等。三维网格模型,可以使用简单的几何体作为包围体来

代替模型。

物体间的碰撞检测:可以使用包围体的简单计算方式,也可以采用三维网格的精确碰撞(但对计算量消耗较大)。

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.按照浮力公式对进入力场的物体施加力。













Unity学习笔记06物理系统的评论 (共 条)

分享到微博请遵守国家法律