找回密碼
 注冊帳號

掃一掃,訪問微社區

剛體(rigidbody)

2015-1-7 00:31| 發布者: 楊炎| 查看: 2192| 評論: 0|原作者: 蠻牛|來自: unity3d腳本manual

摘要: 剛體 (rigidbody)剛體 (rigidbody)使游戲對象 (gameobject)在物理控制之下行動。剛體 (rigidbody) 可以接收力和扭矩以使對象采用逼真方式移動。任何游戲對象 (gameobject) 必須包含剛體 (rigidbody) 才能受重力影響 ...

剛體 (rigidbody)

剛體 (rigidbody)使對象" target="_blank" class="relatedlink">游戲對象 (gameobject)物理控制之下行動。剛體 (rigidbody) 可以接收力和扭矩以使對象采用逼真方式移動。任何游戲對象 (gameobject) 必須包含剛體 (rigidbody) 才能受重力影響、在添加的力作用下行動(通過腳本)或是與其他對象交互(通過 nvidia physx 物理引擎)。

剛體 (rigidbody) 使游戲對象 (gameobject) 在物理影響下行動

屬性

屬性:

功能:

質量 (mass)

對象的質量(任意單位)。不應使質量比其他剛體 (rigidbody) 質量大或小 100 倍。

阻力 (drag)

在由于施加力而移動時空氣阻力對對象的影響程度。0 表示無空氣阻力,無窮大使對象立即停止移動。

角阻力 (angular drag)

在由于施加扭矩而旋轉時,空氣阻力對對象的影響程度。0 表示無空氣阻力。請注意:不能僅僅通過將其“角阻力”(angular drag) 設置為無窮大使對象停止旋轉。

使用重力 (use gravity

如果啟用,則對象受重力影響。

為運動學 (is kinematic)

如果啟用,則對象不會由物理引擎驅動,而是只能通過其變換 (transform)進行處理。對于移動平臺,或是如果要對附加了鉸鏈關節 (hingejoint)的剛體 (rigidbody) 進行動畫處理,這十分有用。

插值 (interpolate)

僅當在剛體 (rigidbody) 移動中發現不平穩時,才嘗試這些選項之一。

無 (none)

不應用插值。

內插 (interpolate

變換 (transform) 基于上一幀的變換 (transform) 進行平滑處理。

外插 (extrapolate)

變換 (transform) 基于下一幀的估計變換 (transform) 進行平滑處理。

碰撞檢測 (collision detection)

用于防止快速移動的對象在不檢測碰撞的情況下穿過其他對象。

離散 (discrete)

對場景中的所有其他碰撞體 (collider) 使用離散 (discreet) 碰撞檢測。其他碰撞體 (collider) 將在對其測試碰撞時使用離散 (discreet) 碰撞檢測。用于普通碰撞(這是默認值)。

連續 (continuous)

對動態碰撞體 (collider)(帶有剛體 (rigidbody))使用離散 (discreet) 碰撞檢測,對靜態網格碰撞體 (meshcollider)(不帶剛體 (rigidbody))使用連續 (continuous) 碰撞檢測。在對剛體 (rigidbody) 進行測試碰撞時,設置為“連續動態”(continuous dynamic) 的剛體 (rigidbody) 將使用連續 (continuous) 碰撞檢測。其他剛體 (rigidbody) 會使用離散 (discreet) 碰撞檢測。用于連續動態(continuous dynamic) 檢測需要與之碰撞的對象。(這對物理性能具有較大影響,如果對快速對象的碰撞沒有問題,請將其設置為“離散”(discreet))

連續動態 (continuous dynamic)

對設置為“連續”(continuous) 和“連續動態”(continuous dynamic) 碰撞的對象使用連續 (continuous) 碰撞檢測。它也會對靜態網格碰撞體 (meshcollider)(不帶剛體 (rigidbody))也將使用連續 (continuous) 碰撞檢測。對于所有其他碰撞體 (collider),它使用離散 (discreet) 碰撞檢測。用于快速移動的對象。

約束 (constraints)

對剛體 (rigidbody) 運動的限制:

凍結位置 (freeze position

選擇性地在世界坐標 x、y 和 z 軸上停止剛體 (rigidbody) 移動。

凍結旋轉 (freeze rotation)

選擇性地停止剛體 (rigidbody) 圍繞世界坐標 x、y 和 z 軸的旋轉。

詳細信息

剛體 (rigidbody) 使游戲對象 (gameobject) 在物理控制之下行動。這樣可實現逼真的碰撞、各種類型的關節 (joint) 和其他非常棒的行為。與直接調整變換 (transform)組件 (component)相比,通過向剛體 (rigidbody) 添加力來處理游戲對象 (gameobject) 可創造非常不同的感觀。一般而言,不應處理相同游戲對象 (gameobject) 的剛體 (rigidbody) 和變換 (transform) - 只應處理兩者之一。

處理變換 (transform) 與剛體 (rigidbody) 之間的最大差異是力的使用。剛體 (rigidbody) 可以接收力和扭矩,但是變換 (transform) 不能。變換 (transform) 可以進行平移和旋轉,但是這與使用物理不同。您在自己進行嘗試時將注意到明顯差異。向剛體 (rigidbody) 添加力/扭矩實際上會更改對象的變換 (transform) 組件 (component) 位置和旋轉。這便是為何只應使用兩者之一。使用物理時更改變換 (transform) 可能會導致與碰撞和其他計算有關的問題。

剛體 (rigidbody) 必須先明確添加到游戲對象 (gameobject),然后才會受物理引擎影響。可以通過菜單欄中的組件 (components) -> 物理 (physics) -> 剛體 (rigidbody)向所選對象添加剛體 (rigidbody)。現在對象在物理方面準備就緒;它會因重力作用而下落,并且可以通過腳本接收力,但是您可能需要添加碰撞體 (collider)或關節 (joint) 以使其行為與預期方式完全相同。

父子化 (parenting)

當對象處于物理控制下時,其移動方式與其變換父級的移動方式半獨立。如果移動任何父級,則會隨它們一起拉動剛體 (rigidbody) 子級。但是,剛體 (rigidbody) 仍會由于重力作用而下落并對碰撞事件作出反應。

腳本處理

要控制剛體 (rigidbody),主要使用腳本添加力或扭矩。可通過對對象的剛體 (rigidbody) 調用addforce()addtorque()來實現此目的。請記住,不應在使用物理時直接改變對象的變換 (transform)。

動畫

對于某些情況(主要是創建布娃娃效果),需要在動畫與物理之間切換對象控制。為此,剛體 (rigidbody) 可以標記為為運動學 (iskinematic)。當剛體 (rigidbody) 標記為為運動學 (iskinematic)時,它不會受碰撞、力或 physx 的任何其他部分影響。這表示您必須通過直接處理變換 (transform)組件 (component) 來控制對象。運動學剛體 (kinematic rigidbody) 會影響其他對象,但是它們自己不會受物理影響。例如,附加到運動學 (kinematic) 對象的關節 (joint) 會約束附加到它們的任何其他剛體 (rigidbody),運動學剛體 (kinematic rigidbody) 會通過碰撞影響其他剛體 (rigidbody)。

碰撞組件(collider)

碰撞組件(collider) 是另一種必須隨剛體 (rigidbody) 添加以便允許碰撞發生的組件 (component)。如果兩個剛體 (rigidbody) 相互碰撞,則物理引擎不會計算碰撞,除非這兩個對象都附加了碰撞組件 (collider)。無碰撞組件 (collider) 的剛體 (rigidbody) 在物理模擬過程中只會穿過彼此。

碰撞組件 (collider) 定義剛體 (rigidbody) 的物理邊界

使用組件 (component) -> 物理 (physics)菜單添加碰撞體 (collider)。有關更多特定信息,請查看任何個別碰撞體 (collider) 的“組件參考”頁面:

箱體碰撞組件 (box collider)- 立方體的基元形狀

球體碰撞體 (sphere collider)- 球體的基元形狀

膠囊碰撞體 (capsule collider)- 膠囊的基元形狀

網格碰撞體 (mesh collider)- 通過對象的網格創建碰撞體 (collider),不能與其他網格碰撞體 (mesh collider) 碰撞

車輪碰撞體 (wheel collider)- 專門用于創建汽車或其他移動交通工具

復合碰撞體 (compound collider)

復合碰撞體 (compound collider) 是基元碰撞體 (collider)(共同充當單個碰撞體 (collider))的組合。當您要在碰撞中使用復雜網格但是無法使用網格碰撞體 (mesh collider)時,它們可派上用場。要創建復合碰撞體 (compound collider),請創建碰撞對象的子對象,然后向每個子對象添加基元碰撞體 (collider)。這使您可以方便且相互獨立地定位、旋轉和縮放每個碰撞體 (collider)。

實際的復合碰撞體 (compound collider) 設置

在上圖中,槍模型 (gun model)游戲對象 (gameobject) 附加了剛體 (rigidbody),并且將多個基元碰撞體 (collider) 作為子游戲對象 (gameobject)。當父剛體 (rigidbody) 受力四處移動時,子碰撞體 (collider) 會隨其一起移動。基元碰撞體 (collider) 會與環境的網格碰撞體 (mesh collider) 碰撞,而父剛體 (rigidbody) 會基于向其應用的力以及其子碰撞體 (collider) 與場景中其他碰撞體 (collider) 交互的方式而改變其移動方式。

網格碰撞體 (mesh collider) 通常不能相互碰撞。如果某個網格碰撞體 (mesh collider) 標記為凸體 (convex),則它可以與其他網格碰撞體 (mesh collider) 碰撞。典型解決方案是將基元碰撞體 (collider) 用于任何移動對象,而將網格碰撞體 (mesh collider) 用于靜態背景對象。

連續 (continuous) 碰撞檢測

連續 (continuous) 碰撞檢測是一種防止快速移動的碰撞體 (collider) 穿過彼此的功能。如果一個對象在一個幀中處于碰撞體 (collider) 的一端,并且在下一幀中已穿過碰撞體 (collider),則使用普通(離散 (discrete)))碰撞檢測時可能會發生這種情況。要解決此問題,可以對快速移動對象的剛體 (rigidbody) 啟用連續 (continuous) 碰撞檢測。將碰撞檢測模式設置為連續 (continuous)可防止剛體 (rigidbody) 穿過任何靜止(即非剛體 (rigidbody))靜態網格碰撞體 (meshcollider)。將其設置為連續動態 (continuous dynamic)還可防止剛體 (rigidbody) 穿過任何其他在碰撞檢測模式設置為連續 (continuous)連續動態 (continuous dynamic)。將其設置為連續動態 (continuous dynamic) 還可防止剛體 (rigidbody) 穿過任何其他在碰撞檢測模式設置為連續 (continuous) 或連續動態 (continuous dynamic) 時支持的剛體 (rigidbody)。對于箱體碰撞體 (boxcollider)、球體碰撞體 (sphere collider) 和膠囊碰撞體 (capsule collider) 支持連續 (continuous) 碰撞檢測。請注意,連續 (continuous) 碰撞檢測旨在用作在對象否則會穿過彼此的情況下捕獲碰撞的安全網,但是不會提供物理上準確的碰撞結果,因此如果遇到與快速移動對象有關的問題,則可能仍要考慮在時間管理器 (timemanager) 檢視視圖 (inspector) 中減小固定時間步長 (time step) 值以使模擬更加精確。

使用合適大小

游戲對象 (gameobject) 的網格大小比剛體 (rigidbody) 的質量要重要得多。如果發現剛體 (rigidbody) 的行為與預期方式不完全相同 - 它緩慢移動、漂浮或是未正確碰撞 - 請考慮調整網格資源的比例。unity 的默認單位比例為 1 單位 = 1 米,因此導入的網格的比例可保持下來并應用于物理計算。例如,搖搖欲墜的摩天大樓崩塌的方式與積木搭成的塔非常不同,因此不同大小的對象應按準確比例進行建模。

如果對人體進行建模,請確保他在 unity 中大約 2 米高。要檢查對象是否具有合適大小,請將其與默認立方體進行比較。可以使用游戲對象 (gameobject) -> 創建其他 (create other) -> 立方體 (cube)創建立方體。立方體的高度恰好是 1 米,因此人體應是兩倍高。

如果無法調整網格自身,則可以更改特定網格資源的均勻比例,具體方法是在工程視圖 (project view)中選擇它并從菜單欄中選擇資源 (assets) -> 導入設置 (import settings)...。在此處可以更改比例并重新導入網格。

如果游戲要求游戲對象 (gameobject) 按不同比例進行實例化,則可以調整變換 (transform) 比例軸的值。缺點是物理模擬程序在實例化對象時必須進行更多工作,并且可能會導致游戲性能下降。這不是很嚴重的損失,但是不如使用其他兩個選項完成比例高效。另請記住,不均勻比例可能會在使用父子化 (parenting) 時形成不需要的行為。出于這些理由,在建模應用程序中按正確比例創建對象始終是最佳選擇。

提示

兩個剛體 (rigidbody) 的相對質量 (mass)確定它們在互相碰撞時的反應方式。

使一個剛體 (rigidbody) 的質量 (mass)大于另一個剛體 (rigidbody) 不會使其在自由落體過程中下落得更快。請使用阻力 (drag)實現此目的。

較小阻力 (drag)值會使對象看起來較重。較高值會使對象看起來較輕。阻力 (drag)的典型值介于 0.001(實心金屬塊)與 10(羽毛)之間。

如果直接處理對象的變換 (transform) 組件 (component) ,但是仍需要物理,請附加剛體 (rigidbody) 并將其設為運動學 (kinematic)。

如果通過其變換 (transform) 組件 (component) 移動某個游戲對象 (gameobject),但是希望接收碰撞體 (collider)/觸發器 (trigger) 消息,則必須將剛體 (rigidbody) 附加到移動的對象。

不能僅僅通過將其“角阻力”(angular drag) 設置為無窮大使對象停止旋轉。

相關閱讀

文章點評
相關文章
女校游泳队彩金