Unity學(xué)習(xí)筆記06物理系統(tǒng)
主要功能
各種力的支持:比如重力,摩擦力,動(dòng)力,浮力等。
基本的物理體:簡(jiǎn)單的幾何形體,比如長(zhǎng)方體,球,平面等。三維網(wǎng)格模型,可以使用簡(jiǎn)單的幾何體作為包圍體來(lái)
代替模型。
物體間的碰撞檢測(cè):可以使用包圍體的簡(jiǎn)單計(jì)算方式,也可以采用三維網(wǎng)格的精確碰撞(但對(duì)計(jì)算量消耗較大)。
CCD(連續(xù)碰撞檢測(cè))可以提供跟高精度的碰撞響應(yīng)。
碰撞反應(yīng):物理引擎能夠根據(jù)碰撞發(fā)送的具體情況,按照物理規(guī)律計(jì)算物體的碰撞反應(yīng)。
粒子系統(tǒng):粒子系統(tǒng)的計(jì)算過(guò)程就是物理仿真的過(guò)程。
其他功能:如使用剛體以及剛體鏈接關(guān)系實(shí)現(xiàn)布娃娃系統(tǒng)(Rag Doll)。布料,可變性物體以及可破壞物體等。
簡(jiǎn)單操作
Rigidbody
剛體,其中的Constraints:如果勾選其中的對(duì)應(yīng)方向,則物體將在該方向上被鎖定。Use gravity:是否使用重力。
有專(zhuān)門(mén)的物理材質(zhì)(Physic ?Material):其中的Bounciness代表的是彈性。
Plane自帶有Mesh Collider碰撞體。
Constant Force:一個(gè)恒力
典型物理效果模擬
四元數(shù)Quaternion
使用四元數(shù)(使用歐拉角會(huì)帶來(lái)萬(wàn)向節(jié)死鎖問(wèn)題)表示旋轉(zhuǎn)的一個(gè)最大好處就是可以實(shí)現(xiàn)SLERP插值(spherical
linear interpolation,球面線性插值)。
SLERP插值的原理
普通線性插值的計(jì)算方法
1.計(jì)算兩個(gè)值的差:△a=a1-a0;
2.取得差的一部分:t△a;
3.在初始值上加上2中的結(jié)果:lerp(a0,a1,t)=a0+t△a。
四元數(shù)中的插值
1.△a=a1/a0;
2.(△a)t ? ? 這里是t次方;
3.slerp(a0,a1,t)=a0(△a)t。
四元數(shù)在游戲中的應(yīng)用
用來(lái)替代歐拉角來(lái)參與旋轉(zhuǎn)計(jì)算,和歐拉角之間可以互相轉(zhuǎn)換。(游戲中表示旋轉(zhuǎn),一般還是以歐拉角為主),即
四元數(shù)僅僅參與中間的計(jì)算。
應(yīng)用
實(shí)現(xiàn)一個(gè)簡(jiǎn)單的子彈發(fā)射效果,在場(chǎng)景中制作好一個(gè)預(yù)制件,將下面的腳本賦給攝像機(jī),然后將預(yù)制件拖拽給腳本
開(kāi)放出來(lái)的參數(shù)。
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;
? ? ? ?}
? ?}
}
鏈接結(jié)構(gòu)(Joint)
用來(lái)模擬現(xiàn)實(shí)世界中的關(guān)節(jié)結(jié)構(gòu)(joint是一個(gè)寬泛的概念,泛指用來(lái)連接不同物體的一種結(jié)構(gòu))
Joint是“約束”的一種(約束相關(guān)物體的運(yùn)動(dòng))
常見(jiàn)類(lèi)型
Character Joint :常用來(lái)表示人體的一些骨骼鏈接
Hinge Joint:門(mén)扇類(lèi)型
Fixed Joint:相關(guān)的物理體無(wú)法發(fā)發(fā)生相對(duì)運(yùn)動(dòng),是固定的結(jié)構(gòu)
Spring Joint:彈簧類(lèi)型
Configurable Joint :一般類(lèi)型,可配置類(lèi)型,開(kāi)發(fā)人員可以根據(jù)需要來(lái)約束Joint的自由度,可以用在布娃娃系統(tǒng)
(Ragdoll)中。
可破壞鏈接
當(dāng)力或者力矩達(dá)到閾值的話,鏈接關(guān)系破壞??梢詫?shí)現(xiàn)一些游戲功能(當(dāng)破壞發(fā)生時(shí),使用觸發(fā)函數(shù))
Anchor表示物體的旋轉(zhuǎn)軸。
Rigidbody中的Is Kinematic如果勾選上表示該物體是運(yùn)動(dòng)學(xué)物體,不受力的影響(一般是空物體勾選)。
簡(jiǎn)單操作
新建一個(gè)空物體,為其添加約束類(lèi)型的組件。新建一個(gè)盒子,將其拖拽給空物體的約束組件的Connected Body
(一般要為盒子添加剛體組件之后才可以添加)。
Joint屬性面板中的Break Force和Break Torque表示外部受到的力大到一定程度的時(shí)候,鏈接會(huì)被破壞。(使用上
節(jié)的簡(jiǎn)單子彈效果進(jìn)行實(shí)踐,當(dāng)子彈打到這些物體時(shí),鏈接會(huì)被破壞)
碰撞事件
碰撞檢測(cè))作用:游戲很多機(jī)制依賴(lài)于碰撞事件(傷害判定,觸發(fā)對(duì)話,人工智能,特效等)
碰撞體
基礎(chǔ)碰撞體:規(guī)整的幾何體,比如球,長(zhǎng)方體,圓柱,膠囊等。可以通過(guò)基礎(chǔ)碰撞體組合出較精確的復(fù)合碰撞體。
網(wǎng)格碰撞體
靜態(tài)碰撞體(應(yīng)用于場(chǎng)景物體,不發(fā)生移動(dòng),利于做優(yōu)化,碰撞信息可以提前預(yù)計(jì)算)
碰撞類(lèi)型
1、碰撞體碰撞:碰撞物體空間不能沖突(就比如兩個(gè)拳頭碰撞)
2、觸發(fā)器碰撞:碰撞物體空間可沖突(就比如浮力)
碰撞產(chǎn)生的條件
兩個(gè)物體必須都有碰撞器,且至少其中一個(gè)有剛體組件
碰撞響應(yīng)消息
碰撞檢測(cè)消息:參與碰撞的物體,需要滿足什么條件時(shí),才能進(jìn)行碰撞檢測(cè)
觸發(fā)器響應(yīng)消息
觸發(fā)器消息:
實(shí)踐
每個(gè)物體都有一個(gè)Collider,表示這個(gè)物體可以發(fā)生碰撞,點(diǎn)擊edit collider可以調(diào)整碰撞體的大小。
浮力效果
實(shí)現(xiàn)原理
1.通過(guò)觸發(fā)器碰撞實(shí)現(xiàn)。
2.物體處于另外一個(gè)物體內(nèi)的時(shí)候,有響應(yīng)事件。
3.按照浮力公式對(duì)進(jìn)入力場(chǎng)的物體施加力。