Unity3D Rigidbody詳解
剛體能(neng)讓(rang)你的游(you)戲(xi)對(dui)象(xiang)被物(wu)理(li)(li)引擎所(suo)控制,它能(neng)通過受到推力(li)和扭力(li)來實(shi)(shi)現(xian)真實(shi)(shi)的物(wu)理(li)(li)表現(xian)效(xiao)果。所(suo)有游(you)戲(xi)對(dui)象(xiang)必須(xu)包含剛體組件來實(shi)(shi)現(xian)重力(li)、通過腳本施加力(li)、或(huo)者(zhe)與其(qi)他對(dui)象(xiang)進行交互,這一切(qie)都通過NVIDIA的PhysX物(wu)理(li)(li)引擎來實(shi)(shi)現(xian)。
屬(shu)性
Mass 質量,單(dan)位(wei)為Kg,建議不要讓對(dui)象之間的質量差(cha)達到100倍以上
Drag 空氣阻力(li),為0表(biao)示(shi)沒有阻力(li),infinity表(biao)示(shi)立即停止移動
Angular Drag 扭力的阻力,數值意(yi)義同上
Use Gravity 是否受重力影響(xiang)
Is Kinematic 是否為Kinematic剛體,如果啟用(yong)該參數,則對象不會被物理所控制(zhi),只能通(tong)過直接設置位置、旋轉(zhuan)和縮放(fang)來操作它,一般(ban)用(yong)來實(shi)現移動(dong)平臺(tai),或者帶有HingeJoint的動(dong)畫(hua)剛體
Interpolate 如果(guo)你的(de)剛體運動時有(you)抖動,嘗試一下修改這個參數(shu),None表(biao)(biao)示沒有(you)插值,Interpolate表(biao)(biao)示根(gen)(gen)據上一楨(zhen)的(de)位置來(lai)(lai)做平(ping)滑插值,Extrapolate表(biao)(biao)示根(gen)(gen)據預測的(de)下一楨(zhen)的(de)位置來(lai)(lai)做平(ping)滑插值
Freeze Rotation 如果選中了該選項,那么剛體將不會因為外力(li)(li)或者扭力(li)(li)而發(fa)生旋轉,你只能通過腳本的旋轉函數來(lai)進行操作
Collision Detection 碰(peng)撞檢測算法,用于防止剛體因快速移(yi)動(dong)而(er)穿過(guo)其他(ta)對象
Constraints 剛體運動的約束,包(bao)括位置(zhi)約束和旋轉約束,勾選表示在該坐標上不允許進行此類(lei)操作
詳細描述剛體(ti)讓你(ni)的(de)(de)游戲(xi)對象(xiang)處于(yu)物理引擎(qing)的(de)(de)控(kong)制(zhi)之(zhi)下(xia),這打開了實(shi)(shi)現真實(shi)(shi)碰撞,各種連接類型,以(yi)及其(qi)(qi)他各種效(xiao)果的(de)(de)大(da)門。通(tong)過(guo)給剛體(ti)施加外力來移動(dong)它,與以(yi)前的(de)(de)通(tong)過(guo)設置其(qi)(qi)位置變換來移動(dong)它有比較(jiao)大(da)的(de)(de)不同。通(tong)常情(qing)況下(xia),你(ni)不會同時操作剛體(ti)和變換,你(ni)只會使用其(qi)(qi)中(zhong)之(zhi)一。
這兩者之(zhi)間(jian)*大(da)的(de)差異在于力(Forces)的(de)使(shi)用,剛體能(neng)接(jie)受推力和(he)扭力,變(bian)(bian)換(huan)(huan)(huan)不(bu)可以。變(bian)(bian)換(huan)(huan)(huan)同樣可以實現位置變(bian)(bian)化與(yu)旋轉,但這與(yu)通過物理引擎來實現是(shi)不(bu)一樣的(de)。給剛體施加力來移動他(ta)的(de)時(shi)(shi)(shi)候(hou)同時(shi)(shi)(shi)也(ye)會影響對(dui)象的(de)變(bian)(bian)換(huan)(huan)(huan)數(shu)值,這也(ye)是(shi)為(wei)什么(me)只能(neng)使(shi)用這兩者之(zhi)一的(de)原因,如果(guo)同時(shi)(shi)(shi)直(zhi)接(jie)操(cao)作了剛體的(de)變(bian)(bian)換(huan)(huan)(huan),那么(me)在執行(xing)碰撞和(he)其他(ta)操(cao)作的(de)時(shi)(shi)(shi)候(hou)會出問題。
你必須顯示的將剛體組件添加到你的游戲對象上,通過菜單項 Component -> Physics -> Rigidbody即可添加,之后對象就處于物理引擎控制之下了,他會受到重力的影響而下落,也能夠通過腳本來受力,不過你可能還需要添加一個Collider或者Joint來讓他表現的更像你所期望的。
Parenting當一個對(dui)(dui)象處于物理引擎控制(zhi)之下,他的運(yun)動(dong)將(jiang)會與其父(fu)對(dui)(dui)象的移動(dong)半獨(du)立開。如果你(ni)移動(dong)任意的父(fu)對(dui)(dui)象,他們將(jiang)會拉動(dong)剛體(ti)子(zi)對(dui)(dui)象,然而,剛體(ti)在重力及碰撞影響下還會下落。
Scripting控(kong)制剛體的方法(fa)(fa)主要是通(tong)過(guo)腳本來施加推力(li)和扭力(li),通(tong)過(guo)在(zai)剛體對象上調用AddForce()和AddTorque()方法(fa)(fa)。再次注意,當你使用物理引擎來控(kong)制剛體的時候(hou),不要直接操作對象的變換數(shu)值。
Animation在某(mou)些時候(hou),主(zhu)要是創(chuang)建(jian)紙娃娃效果的(de)時候(hou),你可能(neng)(neng)需(xu)要在動畫與物(wu)理控制之間(jian)進行切換(huan)。你可以將剛體(ti)(ti)設置為IsKinematic,當設置為Kinematic模式(shi),它將不再(zai)受到外力影響(xiang)。這時你只能(neng)(neng)通過變換(huan)方式(shi)來操作對象,但是Kinematic剛體(ti)(ti)還會影響(xiang)其他剛體(ti)(ti),但他自己(ji)不會再(zai)受物(wu)理引擎控制。比如,連在Kinematic剛體(ti)(ti)上的(de)Joints還會繼續(xu)影響(xiang)連接(jie)的(de)另一(yi)個非Kinematic剛體(ti)(ti),同時也能(neng)(neng)夠給(gei)其他剛體(ti)(ti)產生碰撞力。
Colliders碰(peng)撞(zhuang)(zhuang)體(ti)是(shi)另一(yi)類必(bi)須手動添(tian)加的(de)(de)(de)的(de)(de)(de)組(zu)件(jian),用(yong)來讓(rang)對象能夠發生碰(peng)撞(zhuang)(zhuang)。當兩個(ge)剛體(ti)接觸到一(yi)起的(de)(de)(de)時候(hou),除非兩個(ge)剛體(ti)都(dou)設置了(le)碰(peng)撞(zhuang)(zhuang)屬(shu)性,否(fou)則物理引擎是(shi)不會(hui)計(ji)算他們的(de)(de)(de)碰(peng)撞(zhuang)(zhuang)的(de)(de)(de)。沒有碰(peng)撞(zhuang)(zhuang)體(ti)的(de)(de)(de)剛體(ti)在進行物理模擬的(de)(de)(de)時候(hou)將會(hui)簡單的(de)(de)(de)穿過其他剛體(ti)。
Composed Colliders由多個基本的(de)碰撞體(ti)(ti)對(dui)象(xiang)組合而成,扮演一個獨(du)立的(de)碰撞體(ti)(ti)對(dui)象(xiang)。當你(ni)有一個復雜的(de)模型,而你(ni)又不能(neng)使用Mesh Collider的(de)時候就(jiu)可以使用組合碰撞體(ti)(ti)。
Continuous Collision DetectionCCD用來(lai)防(fang)止快速移動的物體穿過(guo)其他對象。
當使用默認的(de)離散式碰(peng)撞(zhuang)(zhuang)檢測(ce)時,如果前一楨(zhen)時對(dui)象在墻(qiang)這一面,下(xia)一楨(zhen)時對(dui)象已到到了(le)墻(qiang)另一面,那么碰(peng)撞(zhuang)(zhuang)檢測(ce)算法將(jiang)檢測(ce)不(bu)到碰(peng)撞(zhuang)(zhuang)的(de)發生,你可(ke)以(yi)將(jiang)該(gai)對(dui)象的(de)碰(peng)撞(zhuang)(zhuang)檢測(ce)屬(shu)性(xing)設置(zhi)為(wei)Continuous,這時碰(peng)撞(zhuang)(zhuang)檢測(ce)算法將(jiang)會(hui)防(fang)止(zhi)對(dui)象穿過所有的(de)靜態碰(peng)撞(zhuang)(zhuang)體(ti)(ti),設置(zhi)為(wei)Continuous Dynamic將(jiang)還會(hui)防(fang)止(zhi)穿過其他也設置(zhi)為(wei)Continuous或者Continuous Dynamic的(de)剛體(ti)(ti)。
CCD只支持Box,Sphere和Capsule的(de)碰撞體(ti)。
Use The Right Size當(dang)使用物理引擎的(de)(de)(de)(de)時候,游戲對象(xiang)的(de)(de)(de)(de)大(da)小比(bi)剛(gang)體的(de)(de)(de)(de)質量(liang)更重要。如果你(ni)發現剛(gang)體的(de)(de)(de)(de)行為不(bu)是(shi)你(ni)所期望的(de)(de)(de)(de),比(bi)如移動的(de)(de)(de)(de)太(tai)慢,漂浮(fu),或者不(bu)能正確(que)的(de)(de)(de)(de)進行碰撞,嘗試一(yi)(yi)(yi)下(xia)修改你(ni)的(de)(de)(de)(de)模型的(de)(de)(de)(de)縮放(fang)值。Unity的(de)(de)(de)(de)默(mo)認(ren)單(dan)位是(shi)1 unit = 1 米(mi),物理引擎的(de)(de)(de)(de)計算(suan)也是(shi)按(an)照(zhao)這個單(dan)位來的(de)(de)(de)(de)。比(bi)如,一(yi)(yi)(yi)個摩天大(da)樓的(de)(de)(de)(de)倒(dao)塌與一(yi)(yi)(yi)個由(you)積木搭成的(de)(de)(de)(de)玩具房(fang)子的(de)(de)(de)(de)倒(dao)塌是(shi)完全(quan)不(bu)一(yi)(yi)(yi)樣的(de)(de)(de)(de),所以,不(bu)同(tong)大(da)小的(de)(de)(de)(de)對象(xiang)在建模時都(dou)應該按(an)照(zhao)統(tong)一(yi)(yi)(yi)的(de)(de)(de)(de)比(bi)例。
對于一(yi)個(ge)人類角色(se)模型來(lai)(lai)說,他應(ying)該有2米高。可以創建一(yi)個(ge)Box來(lai)(lai)作(zuo)為參照(zhao)物(wu),默認(ren)的Box為1米,所以一(yi)個(ge)角色(se)應(ying)該是Box的兩倍高。
當(dang)然,你也可以通過修改導(dao)入(ru)模(mo)型的(de)縮(suo)放來調(diao)整(zheng)比例(li),如果你不(bu)能直接修改模(mo)型本身的(de)話。在Project面板(ban)中選中模(mo)型,調(diao)整(zheng)其Importer屬性,注意不(bu)是變換里的(de)縮(suo)放。
如(ru)果(guo)你的游戲需要你實(shi)例化具有不同縮(suo)放(fang)值(zhi)的對象(xiang),你也可(ke)以調整變(bian)換里的縮(suo)放(fang)值(zhi),但是物理引擎來創建這個對象(xiang)的時(shi)候會(hui)額(e)外(wai)多做一點工作,這可(ke)能會(hui)引起一點性能問(wen)題(ti)。
這個問(wen)題(ti)不(bu)會(hui)太嚴(yan)重(zhong),但性能(neng)顯然會(hui)比上面兩(liang)種方法低。
同樣(yang)要(yao)注意的是,non-uniform scales也會引起(qi)一(yi)些問題,如果這個對象具有父對象的話。基于以上原因,盡(jin)可能的在制作(zuo)模型的時候就(jiu)按照Unity的比例(li)來建模。
Hints兩個剛(gang)體的相對(dui)質量決(jue)定(ding)他們在(zai)碰撞(zhuang)的時(shi)候將會(hui)如(ru)何(he)反應(ying)。
給剛(gang)體設置更大的質量并不會(hui)讓它下(xia)降的更快,如果要實(shi)現這個目的,使用(yong)Drag參數。
低(di)的阻(zu)力值使得對象看(kan)起來更(geng)重,高的阻(zu)力值使對象看(kan)起來更(geng)輕(qing)。
典型的Drag值介于0.001(固體(ti)金屬(shu))到10(羽毛(mao))之(zhi)間(jian)。
如果你想(xiang)同時使用變換和物理來控制對(dui)象,那么(me)給他一個剛體組件并將其設(she)置為Kinematic
如果你通過(guo)變換來移動對象,同時又想收(shou)到(dao)對象的(de)碰撞消息,那么必須給他(ta)一個(ge)剛體組件(jian)。
Mass(質量):
學過物理的同學們都知道的吧,質量越大,慣性越大。這里的單位可以自己統一規定,但是官方給出的建議是場景中的物體質量*好不要相差100倍率以上。估計是防止兩個質量相差太大的物體碰撞后會產生過大的速度,從而影響游戲性能吧。Drag(阻力):這里指的是空氣阻力,當游戲物體收到某個作用力的時候,這個值越大越難移動。如果設置成無限的話,物體會立即停止移動。Angular Drag(角阻力):
同樣指的是空氣阻力,只不過是用來阻礙物體旋轉的。如果設置成無限的話,物體會立即停止旋轉。Use Gravity(使用重力):
勾選了這個項,游戲對象就會受到重力影響。Is Kinematic(是否動態):
勾選這個選項會使游戲對象不受物理引擎的影響,但這不等同于沒有剛體組件。這通常用于需要用動畫控制的剛體,這樣就不會因為慣性而影響動畫了。Interplate(差值類型):如果看到剛體移動的時候一直抽風或者運動的不是很平滑,可以選擇一種平滑方式:
None(無差值):不使用差值平滑。
Interpolate(差值):根據上一幀來平滑移動。
Extrapolate(推算):根據推算下一幀物體的位置來平滑移動。Collision Detection(碰撞檢測方式):
Discrete(離散):默認的碰撞檢測方式。但若當物體A運動很快的時候,有可能前一幀還在B物體的前面,后一幀就在B物體后面了,這種情況下不會觸發碰撞事件,所以如果需要檢測這種情況,那就必須使用后兩種檢測方式。
Continuous(連續):這種方式可以與有靜態網格碰撞器的游戲對象進行碰撞檢測。
Continuous Dynamic(動態連續):這種方式可以與所有設置了2或3方式的游戲對象進行碰撞檢測。Freeze Position/Rotation(凍結位置/旋轉):
可以對物體在X、Y、Z三個軸上的位置/旋轉進行鎖定,即使受到相應的力也不會改變,但可以通過腳本來修改。
*后順便再提一下恒力組件(Constant Force),由于比較容易理解我就不做詳細介紹了。一共有4個參數,分別是Force/Relative Force(世界/相對作用力)、Torque/Relative Torque(世界/相對扭力)。這些參數代表了附加在剛體上的XYZ軸方向恒力的大小,另外還要注意必須是剛體才可以添加恒力。
- 上一篇:研究人員推出 3D 人體解剖模型,醫學學生練打針不用互相扎了 2018/3/14
- 下一篇:unity的碰撞檢測詳細解釋 2018/3/5
