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