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