Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

碰撞形體

本指南解釋:

  • Godot 3D 中可用的碰撞形狀型別。

  • 使用凸形或凹形網格作為碰撞形狀.

  • 執行效能偵測

Godot提供多種碰撞形狀, 具有不同的性能和精度權衡.

您可以通過新增一個或多個 class_PhysicsBody 作為子節點來定義 CollisionShapes 的形狀。請注意,你必須在屬性面板面板中為碰撞形狀節點新增一個 class_Shape 資源

備註

當你將多個碰撞形狀新增到一個PhysicsBody中時, 你不必擔心它們會重疊, 它們不會相互 "碰撞".

顯示碰撞區域

Godot 可匯入下列圖片格式:

您可以使用一個或多個原始形狀來表示大多數較小物體的碰撞. 然而, 對於更複雜的物體, 如大型船舶或整個水平面, 你可能需要凸形或凹形來代替. 下面會有更多的介紹.

We recommend favoring primitive shapes for dynamic objects such as RigidBodies and CharacterBodies as their behavior is the most reliable. They often provide better performance as well.

碰撞形體

凸形碰撞形狀 是基礎碰撞形狀和凹形碰撞形狀之間的折衷, 可以表示任何複雜的形狀, 但要警告的是, 正如名稱所示, 一個單獨的形狀只能表示一個 的形狀. 要用單個碰撞形狀定義一個凹形物件, 需要使用一個凹形碰撞形狀. 例如, 一個金字塔是 的, 但一個空心盒子是 的.

根據物件的複雜程度, 可能要通過使用多個凸形而不是一個凹形碰撞形狀來獲得更好的性能.Godot可以使用 凸分解 來生成與空心物體大致配對的凸形. 請注意, 在一定數量的凸形之後, 就沒有了這種性能優勢, 對於大而複雜的物件, 如整個關卡, 建議使用凹形代替.

您可以通過選擇一個網格實例, 並使用3D視圖頂部的 網格 功能表從編輯器中生成一個或多個凸形碰撞形狀. 編輯器有兩種生成模式:

  • 建立單凸碰撞同級 使用Quickhull演算法, 建立一個CollisionShape碰撞形狀節點, 並自動生成一個凸碰撞形狀, 由於只生成單個形狀, 因此提供了良好的性能, 非常適合小物件.

  • 建立多個凸形碰撞同級 使用V-HACD演算法. 建立多個CollisionShape碰撞形狀節點, 每個節點都有一個凸形, 由於它能生成多個形狀, 所以對於凹形物體來說, 精度更高, 但性能不佳. 對於中等複雜度的物件, 可能會比使用單個凹形碰撞形狀更快.

碰撞形體

Concave collision shapes, also called trimesh collision shapes, can take any form, from a few triangles to thousands of triangles. Concave shapes are the slowest option but are also the most accurate in Godot. You can only use concave shapes within StaticBodies. They will not work with CharacterBodies or RigidBodies unless the RigidBody's mode is Static.

備註

即使凹形提供了最準確的 碰撞, 但觸碰資訊的精度可能不如基礎形狀.

當不使用網路地圖進行關卡設計時, 凹形是關卡碰撞的最佳方法, 也就是說, 如果關卡有一些小細節, 可能希望將這些細節排除碰撞之外, 以保證性能和遊戲體驗, 要做到這一點, 可以在3D建模中建立一個簡化的碰撞網格, 並讓Godot為其自動生成一個碰撞形狀. 下面會有更多的介紹

請注意, 與基礎形狀和凸形狀不同, 凹形碰撞形狀沒有實際的 "體積", 既可以將物件放置在形狀的 外側, 也可以放置在 內側.

選中一個網格實例,然後使用 3D 視口頂部的**網格**功能表就可以在編輯器中生成一個凹形碰撞形狀。編輯器提供了兩個選項:

  • 建立三網格靜態體是個方便的選擇. 它建立一個包含與網格幾何學配對的凹形的靜態體.

  • 建立Trimesh(三角面)碰撞同級 建立具有與網格幾何體配對的凹面形狀的CollisionShape(碰撞形狀)節點.

也參考

有關如何匯出 Godot 模型並在匯入時自動產生碰撞形狀的信息,請參閱 doc_importing_3d_scenes`。

效能

You aren't limited to a single collision shape per PhysicsBody. Still, we recommend keeping the number of shapes as low as possible to improve performance, especially for dynamic objects like RigidBodies and CharacterBodies. On top of that, avoid translating, rotating, or scaling CollisionShapes to benefit from the physics engine's internal optimizations.

在靜態體中使用單個非轉換碰撞形狀時, 引擎的寬相位演算法可以丟棄不活躍的物理體. 這個窄相只需考慮到活躍物體的形狀. 如果一個StaticBody有許多碰撞形狀, 那麼寬相位就會失敗. 較慢的窄相位必須對每個形狀執行碰撞檢查.

如果遇到性能問題, 您可能需要在準確性方面進行權衡. 大多數遊戲都沒有100%的精確碰撞. 他們找到了一些創造性的方法來隱藏它, 或者在正常的遊戲中讓它變得不讓人注意.