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