Unity3D Rigidbody詳解
剛體能讓你的遊戲對(duì)象被物理引擎(qíng)所控製,它能通過受到推力和扭力來實現真實的物理表現效果。所有遊戲(xì)對象必須包含剛體組件(jiàn)來實現重力(lì)、通(tōng)過腳本施加力(lì)、或者與其他對象進行交互,這一切都通過NVIDIA的PhysX物理(lǐ)引擎來(lái)實現。
屬性
Mass 質(zhì)量,單位為Kg,建議不要讓對象之間的質(zhì)量差達到100倍以上
Drag 空氣阻力,為0表示沒(méi)有阻力(lì),infinity表示立即停止移動
Angular Drag 扭力的阻(zǔ)力,數值意義同上
Use Gravity 是否受重力影響
Is Kinematic 是否為Kinematic剛體,如果啟用該參數(shù),則對象不會(huì)被物理(lǐ)所(suǒ)控(kòng)製,隻能通過直接設置位置、旋轉和縮放來操作它,一般用來實現(xiàn)移動平(píng)台,或者帶有HingeJoint的動畫剛體
Interpolate 如果你的剛體運動時有抖動,嚐試一下修(xiū)改這(zhè)個參數(shù),None表示沒有插值,Interpolate表(biǎo)示根據上一楨的位(wèi)置來做平滑插值(zhí),Extrapolate表示根據預測的下一楨的位置(zhì)來(lái)做平滑插(chā)值
Freeze Rotation 如果選中了該(gāi)選項,那麽剛體將不會因為(wéi)外力或者扭力而發生旋轉,你隻能通過腳本的旋轉函數來進行操作
Collision Detection 碰撞檢測算(suàn)法,用於防止剛體因(yīn)快速移動(dòng)而穿過其他(tā)對象
Constraints 剛體運動的約(yuē)束,包括位置約束和旋轉約束,勾選表示在該(gāi)坐標上不允許進行此類操作
詳細描述剛體讓你的遊戲對象處於物理引擎的控製之下,這(zhè)打開了實現(xiàn)真實碰撞,各種連接(jiē)類型,以及其他各種效果的大門(mén)。通過給剛體施加外力來移動它,與(yǔ)以前的(de)通過設置其位置變換來移動它有比較大的不同。通常情況下,你不會同時操(cāo)作剛體和變換,你隻會使用其中之一。
這兩者之間*大的差異在於力(Forces)的使(shǐ)用,剛體能接(jiē)受推力和扭力(lì),變換不可以。變換同樣可以實現位置變化(huà)與旋轉,但(dàn)這與通過物理引擎來實現是不一樣的。給剛體施加力(lì)來移動他的時候同時也會影響對象的變換數值,這(zhè)也是為什麽隻能使用這兩者之一(yī)的原因,如果同時直接操作了剛體的變換,那麽在執行碰撞和其他操作的時候會(huì)出問題(tí)。
你必須顯(xiǎn)示的將剛體組件添加到你的遊戲對象上,通過菜單項 Component -> Physics -> Rigidbody即可添加,之後對象就處於物理引擎控製之下了,他會受到重力的影響而下落,也能夠通(tōng)過腳本來(lái)受力,不過你可能還需要添加一個Collider或者Joint來讓他表現的(de)更像你所期望的。
Parenting當一個(gè)對象處於物理引擎(qíng)控製之下,他的(de)運動將會與其(qí)父對象的移動(dòng)半獨立開。如果你移(yí)動任意的父對象,他(tā)們將會拉動剛(gāng)體子對象,然而,剛體在(zài)重力及碰撞影響(xiǎng)下還會下落。
Scripting控製剛體(tǐ)的(de)方法主要是通過腳本來施加(jiā)推力和扭力,通過在剛(gāng)體對象上調用AddForce()和AddTorque()方法(fǎ)。再次注意,當你使用物理引擎來控製剛體的時候,不要直接操作對象的變換數值。
Animation在某些(xiē)時候,主要是創建紙娃娃效果的時候,你可能需要在動畫與物理控製之間進行切換。你可以將(jiāng)剛體設置為IsKinematic,當設置(zhì)為Kinematic模式,它將不再受到外力(lì)影響。這時你隻能通過變換方式來操作對(duì)象(xiàng),但是Kinematic剛體還(hái)會影(yǐng)響其他剛(gāng)體,但他自己不會再受物理引擎控製。比如,連在Kinematic剛體上的Joints還會繼續影響連接的另一個非Kinematic剛體,同時(shí)也能夠給其他剛體產生碰撞力。
Colliders碰撞體是另一類必須手動添加的的組件,用來讓對象能夠發生碰撞。當(dāng)兩個剛體接觸到一起(qǐ)的時候,除非兩個剛體都設置了碰撞屬性,否則物(wù)理引擎是不會計算他們的(de)碰(pèng)撞的。沒有碰撞體的剛體在進(jìn)行物理模擬的(de)時候將會簡單的穿過其他剛體(tǐ)。
Composed Colliders由多個基本的碰撞體對象組合(hé)而成,扮(bàn)演一個獨立(lì)的碰撞體對象。當你有一(yī)個複(fù)雜(zá)的模型,而你又不能(néng)使用Mesh Collider的時候就可以使用組合碰撞體。
Continuous Collision DetectionCCD用來防止快速移動(dòng)的物體穿過(guò)其他對象(xiàng)。
當使用默(mò)認的離散式碰撞檢測時,如果前一楨時對(duì)象在牆這一(yī)麵,下一楨(zhēn)時對象已到到了牆(qiáng)另一麵,那麽碰撞檢測算法將(jiāng)檢(jiǎn)測不到碰撞的發生(shēng),你可以將該對象的碰撞檢(jiǎn)測屬性設置為Continuous,這時碰撞檢(jiǎn)測算法將會防止對象穿過所有(yǒu)的靜態碰撞體,設置為Continuous Dynamic將(jiāng)還會(huì)防(fáng)止穿過其他也(yě)設置為Continuous或者Continuous Dynamic的剛體。
CCD隻支持(chí)Box,Sphere和Capsule的碰撞體。
Use The Right Size當使用物(wù)理引擎的時候(hòu),遊(yóu)戲對象的大小比剛體的(de)質量更重要(yào)。如果你發現剛體(tǐ)的行為不是你所期望的,比如移動的太慢,漂浮,或者不能(néng)正確的進行碰撞,嚐試一(yī)下修改你的(de)模型的縮放值。Unity的默認單位是1 unit = 1 米,物理引擎的計(jì)算也是按照這個單位來(lái)的。比如,一個(gè)摩天大樓(lóu)的倒塌與一個由積木搭成的玩具(jù)房子的倒塌是完(wán)全不一(yī)樣的,所以,不同(tóng)大小的對象(xiàng)在建模時都應該按照統一(yī)的比例。
對於(yú)一個人類角色模型來說,他應該有2米高(gāo)。可以創建一(yī)個Box來作為參照物,默認的Box為1米,所以一個角色(sè)應該是Box的兩倍高。
當然,你也可以通過修改導入模型的縮(suō)放來調整比例,如果你不能直接修改模型本(běn)身的話。在Project麵板中選中模型,調整其Importer屬性,注意不是變換裏的縮放。
如(rú)果你的遊戲需要你實例化具有不同縮放值的對象,你(nǐ)也可以調整變換裏的縮(suō)放值,但是物理引擎來創建這個對象(xiàng)的時候會額外多做一點工作,這可能會引起一點性能問題。
這個問題不會太嚴重,但性能顯(xiǎn)然會比上麵兩種方法低。
同樣要注意的(de)是,non-uniform scales也會引(yǐn)起一(yī)些(xiē)問題,如果這個對象具有父對象的話。基於以上原因,盡可能的在製作模型的時候(hòu)就按照Unity的比例來建模。
Hints兩個剛體的相對質(zhì)量決定他們在碰撞的時(shí)候將會(huì)如何反應。
給剛(gāng)體設置更大的質量並不會讓它下降(jiàng)的更快,如果要實現這個目的,使用Drag參(cān)數。
低的阻力值使得對象看起來更重,高的阻力值使(shǐ)對象看起(qǐ)來更輕。
典型的Drag值(zhí)介於0.001(固體金屬)到10(羽(yǔ)毛(máo))之間。
如果你想同時使(shǐ)用變換和物理來控製對象,那麽給(gěi)他一個(gè)剛體組件並將其設置為Kinematic
如果你(nǐ)通過變換來移動對象,同時又(yòu)想收到對象的碰撞消息,那(nà)麽必須給他一個剛體組件。
Mass(質量):
學過物理的同學們(men)都知道的吧,質量越大,慣性越大。這裏(lǐ)的單位可以自己統一規(guī)定,但是官方給出(chū)的建議是場(chǎng)景中的物(wù)體質量*好不(bú)要相差100倍率以上。估計是防止(zhǐ)兩個質量相差太大的物體碰撞後會產生過大的速度(dù),從而影響遊戲性能吧(ba)。Drag(阻力):這裏指的是空氣阻力,當(dāng)遊戲物體收到某個作用力的時(shí)候,這個值越大越難移動(dòng)。如果設置成無限的話,物體會立即停止移動。Angular Drag(角阻力):
同(tóng)樣指的是空氣(qì)阻力,隻(zhī)不過是用來阻礙物體旋轉的。如果設置成(chéng)無限的話,物體會立即停止旋轉。Use Gravity(使用重力):
勾選了(le)這個項,遊(yóu)戲對象就(jiù)會受到重(chóng)力影響。Is Kinematic(是否動態):
勾選這個選項會使遊(yóu)戲(xì)對象不受物理引擎的影響,但(dàn)這不等同於沒有剛體組件。這通常用於(yú)需要用動畫控製的剛體,這樣就不會因為慣性而影響動畫(huà)了。Interplate(差值(zhí)類(lèi)型):如果看到剛體移動的時候一直抽風(fēng)或者運動的不是很平(píng)滑,可以選擇一種平滑方式:
None(無差值):不使用差值平滑。
Interpolate(差值):根據上一幀來平滑移動。
Extrapolate(推算):根據推算下一幀(zhēn)物體的位置(zhì)來平滑移動。Collision Detection(碰撞檢測方式):
Discrete(離散):默認的碰撞檢測方(fāng)式(shì)。但若當物體A運動很快的(de)時候,有可能前一幀還在B物(wù)體的前麵,後一幀就在B物體後麵了,這種情況下不會觸發碰撞事件,所以如果需要(yào)檢測這種(zhǒng)情況,那就必須使(shǐ)用後兩種檢測方式。
Continuous(連續):這種方式可以與有靜(jìng)態網格碰撞(zhuàng)器的遊戲(xì)對象進行碰撞檢測。
Continuous Dynamic(動態(tài)連(lián)續):這種方式可(kě)以與所有設置了2或3方(fāng)式的遊戲對象進行碰撞檢測。Freeze Position/Rotation(凍結位置(zhì)/旋轉):
可以對物體在X、Y、Z三個軸上的位置/旋轉進行鎖定,即(jí)使受(shòu)到相應的力也不會改變,但可(kě)以通過腳(jiǎo)本來修(xiū)改。
*後順便再提一下恒力組件(Constant Force),由於比較容易理解我就不做詳(xiáng)細介紹了。一共有4個參數(shù),分別是Force/Relative Force(世(shì)界/相對作用力(lì))、Torque/Relative Torque(世界/相對(duì)扭力)。這些參數代表了附加在剛體上的XYZ軸方向恒力(lì)的大小,另(lìng)外還要注意必須是剛體才可以添加恒力。
- 上一篇:研究人員推出 3D 人體解剖模(mó)型,醫學學生練打針不用互相紮了 2018/3/14
- 下一(yī)篇:unity的碰撞檢測(cè)詳(xiáng)細解釋 2018/3/5