Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
碰撞形狀 (3D)
本教學將說明:
Godot 3D 可用的碰撞形狀類型。
如何使用凸形或凹形網格作為碰撞形狀。
有關 3D 碰撞的效能注意事項。
Godot 提供多種碰撞形狀,各有不同的效能與精確度權衡。
你可以為 PhysicsBody3D 加入一個或多個 作為*直接*子節點的 CollisionShape3D 來定義其碰撞形狀。間接子節點(例如子節點的子節點)將會被忽略,且不會用於碰撞計算。另外,請注意必須在屬性面板(Inspector)為碰撞形狀節點指定 Shape3D 資源。
備註
當你將多個碰撞形狀加入同一個 PhysicsBody 時,不需要擔心它們會互相重疊,這些形狀彼此之間不會「碰撞」。
基本碰撞形狀
Godot 提供下列基本碰撞形狀型別:
多數小型物件的碰撞可以使用一個或多個基本碰撞形狀來表示。但對於較複雜的物件,如大型船艦或整個關卡,則可能需要使用凸形或凹形碰撞形狀。詳細內容請見下文。
建議對於動態物件(如 RigidBody 與 CharacterBody)優先使用基本碰撞形狀,這樣行為最穩定可靠,且通常能提供更佳效能。
凸形碰撞形狀
凸形碰撞形狀 是基本碰撞形狀與凹形碰撞形狀之間的折衷方案。它們可以表示任何複雜度的形狀,但要注意,每一個凸形碰撞形狀只能表示*凸*的形狀。例如,金字塔是*凸*的,但空心盒子則屬於*凹*形。若要用單一碰撞形狀來描述凹形物件,必須用凹形碰撞形狀。
根據物件的複雜度,使用多個凸形碰撞形狀來取代單一凹形碰撞形狀,通常能獲得更好的效能。Godot 可透過*凸分解*自動產生多個大致符合物件外型的凸形狀。但若凸形狀數量過多,這種效能優勢就會消失。對於大型或複雜物件(如整個關卡),建議仍直接使用凹形碰撞形狀。
你可以在編輯器中選取 MeshInstance3D,並在 3D 視窗頂部的 網格 功能表,產生一個或多個凸形碰撞形狀。編輯器提供兩種產生模式:
建立單一凸形碰撞同級 使用 Quickhull 演算法,會建立一個帶有自動產生凸形狀的 CollisionShape 節點。由於只產生單一形狀,效能極佳,非常適合小型物件。
建立多個凸形碰撞同級 使用 V-HACD 演算法,會建立多個各自帶有凸形狀的 CollisionShape 節點。由於產生多個形狀,對於凹形物件來說精度較高,但效能較差。對於中等複雜度的物件,這種方式通常比用單一凹形碰撞形狀效能更好。
凹形或三角網格碰撞形狀
凹形碰撞形狀,又稱為三角網格碰撞形狀,可以由少數到數千個三角形組成,能呈現任何形態。凹形碰撞形狀在 Godot 中雖然效能最慢,但精度最高。凹形碰撞形狀僅能用於 StaticBody。 除非 RigidBody 的模式設為靜態,否則無法用於 CharacterBody 或 RigidBody。
備註
即使凹形碰撞形狀提供最精確的*碰撞*檢測,接觸點回報的精度仍可能比基本形狀差。
如果你不採用 GridMap 來設計關卡,凹形碰撞形狀通常是關卡碰撞的最佳選擇。不過,若關卡中有細小細節,為了效能與遊戲手感,建議排除這些細節的碰撞。你可以在 3D 建模軟體內建立簡化的碰撞網格,然後讓 Godot 自動為其產生碰撞形狀。詳情請見下文
請注意,和基本形狀、凸形狀不同,凹形碰撞形狀沒有真正的「體積」。你可以將物件放在其*外部*,也可以放在*內部*。
你可以在編輯器中選取 MeshInstance3D,並從 3D 視窗頂部的 網格 功能表,產生凹形碰撞形狀。編輯器提供兩個選項:
建立三角網格靜態剛體 是一個方便的選項,會建立一個帶有與網格幾何一致凹形的 StaticBody。
建立三角網格碰撞同級 則會建立一個帶有與網格幾何一致凹形的 CollisionShape 節點。
也參考
有關如何將模型匯出到 Godot 並在匯入時自動產生碰撞形狀的資訊,請參閱 匯入 3D 場景。
效能注意事項
每個 PhysicsBody 並不限於只能有一個碰撞形狀,但建議盡量減少碰撞形狀的數量,特別是動態物件(如 RigidBody 與 CharacterBody),以提升效能。此外,請避免在執行時對碰撞形狀進行移動、旋轉或縮放,這樣才能讓物理引擎充分發揮內部最佳化。
若 StaticBody 僅有單一且未經縮放或旋轉的碰撞形狀時,引擎的 廣義階段 演算法能有效忽略不活躍的物理物件, 狹義階段 只需檢查活躍物件。但如果一個 StaticBody 擁有多個碰撞形狀,廣義階段會失效,狹義階段(速度較慢)則必須對每個形狀進行碰撞檢查。
如果遇到效能問題,你可能需要在精度與效能間做出取捨。多數遊戲的碰撞判斷並非 100% 精確,通常會用一些技巧將誤差隱藏,讓玩家在遊玩過程中察覺不到。