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.

碰撞形狀 (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% 精確,通常會用一些技巧將誤差隱藏,讓玩家在遊玩過程中察覺不到。