mirror of
https://github.com/godotengine/godot-docs.git
synced 2026-01-04 14:11:02 +03:00
Edit 3D collision shapes
- Passive -> direct voice - Remove parens in sentences - Tweak some sentences' wording - Fix typos - Add missing Oxford commas
This commit is contained in:
@@ -3,19 +3,24 @@
|
||||
Collision shapes (3D)
|
||||
=====================
|
||||
|
||||
This guide explains:
|
||||
|
||||
- The types of collision shapes available in 3D in Godot.
|
||||
- Using a convex or a concave mesh as a collision shape.
|
||||
- Performance considerations regarding 3D collisions.
|
||||
|
||||
Godot provides many kinds of collision shapes, with different performance and
|
||||
accuracy tradeoffs.
|
||||
|
||||
You can define the body form of a :ref:`class_PhysicsBody` by adding one or more
|
||||
:ref:`CollisionShapes <class_CollisionShape>` as child nodes. These nodes act as
|
||||
shape holders. In these child nodes, you must add a :ref:`class_Shape`
|
||||
*resource* that will define the actual shape of the collision.
|
||||
You can define the shape of a :ref:`class_PhysicsBody` by adding one or more
|
||||
:ref:`CollisionShapes <class_CollisionShape>` as child nodes. Note that you must
|
||||
add a :ref:`class_Shape` *resource* to collision shape nodes in the Inspector
|
||||
dock.
|
||||
|
||||
.. note::
|
||||
|
||||
When you add multiple collision shapes to a single PhysicsBody, you don't
|
||||
have to worry about overlapping shapes since these won't "collide" with each
|
||||
other.
|
||||
have to worry about them overlapping. They won't "collide" with each other.
|
||||
|
||||
Primitive collision shapes
|
||||
--------------------------
|
||||
@@ -25,16 +30,16 @@ Godot provides the following primitive collision shape types:
|
||||
- :ref:`class_BoxShape`
|
||||
- :ref:`class_SphereShape`
|
||||
- :ref:`class_CapsuleShape`
|
||||
- :ref:`class_CylinderShape` (only when using the Bullet physics engine)
|
||||
- :ref:`class_CylinderShape`. It is only available when using the Bullet physics
|
||||
engine.
|
||||
|
||||
Using one or several primitive collision shapes, you can represent the collision
|
||||
of most smaller objects well. However, for more complex objects such as a large
|
||||
ship or a whole level, you may want to use convex shapes or concave shapes
|
||||
instead (see below).
|
||||
You can represent the collision of most smaller objects using one or more
|
||||
primitive shapes. However, for more complex objects, such as a large ship or a
|
||||
whole level, you may need convex or concave shapes instead. More on that below.
|
||||
|
||||
Primitive shapes are recommended for dynamic objects such as RigidBodies and
|
||||
KinematicBodies, as their behavior usually is the most reliable and predictable.
|
||||
On top of that, they often provide better performance as well.
|
||||
We recommend favoring primitive shapes for dynamic objects such as RigidBodies
|
||||
and KinematicBodies as their behavior is the most reliable. They often provide
|
||||
better performance as well.
|
||||
|
||||
Convex collision shapes
|
||||
-----------------------
|
||||
@@ -43,78 +48,74 @@ Convex collision shapes
|
||||
between primitive collision shapes and concave collision shapes. They can
|
||||
represent shapes of any complexity, but with an important caveat. As their name
|
||||
implies, an individual shape can only represent a *convex* shape. For instance,
|
||||
a pyramid is *convex* but a hollow box is *concave*. To represent a concave
|
||||
object with a single collision shape, you need to use a concave collision shape
|
||||
(see below).
|
||||
a pyramid is *convex*, but a hollow box is *concave*. To define a concave object
|
||||
with a single collision shape, you need to use a concave collision shape.
|
||||
|
||||
However, depending on the object's complexity, you may get better performance by
|
||||
using multiple convex shapes instead of a concave collision shape. This is why
|
||||
Godot lets you make use of *convex decomposition* to generate convex shapes that
|
||||
roughly match a concave object. That said, this performance advantage no longer
|
||||
applies after a certain amount of convex shapes. Due to this, for large and
|
||||
complex objects such as a whole level, it's recommended to use concave shapes
|
||||
instead.
|
||||
Depending on the object's complexity, you may get better performance by using
|
||||
multiple convex shapes instead of a concave collision shape. Godot lets you use
|
||||
*convex decomposition* to generate convex shapes that roughly match a hollow
|
||||
object. Note this performance advantage no longer applies after a certain amount
|
||||
of convex shapes. For large and complex objects such as a whole level, we
|
||||
recommend using concave shapes instead.
|
||||
|
||||
You can generate one or several convex collision shapes from the editor by
|
||||
selecting a MeshInstance and using the **Mesh** menu at the top of the 3D
|
||||
viewport. The editor exposes two generation modes:
|
||||
|
||||
- **Create Single Convex Collision Sibling** uses the Quickhull algorithm.
|
||||
It creates one CollisionShape node with an automatically generated convex
|
||||
collision shape. Since it only generates a single shape, it provides better
|
||||
performance and is recommended for small objects.
|
||||
- **Create Single Convex Collision Sibling** uses the Quickhull algorithm. It
|
||||
creates one CollisionShape node with an automatically generated convex
|
||||
collision shape. Since it only generates a single shape, it provides good
|
||||
performance and is ideal for small objects.
|
||||
|
||||
- **Create Multiple Convex Collision Siblings** uses the V-HACD algorithm.
|
||||
It creates several CollisionShape nodes, each with their own convex collision
|
||||
shape. Since it generates multiple shapes, it is more accurate for concave
|
||||
objects at the cost of performance. For objects with medium complexity, it
|
||||
will likely be faster than using a single concave collision shape.
|
||||
- **Create Multiple Convex Collision Siblings** uses the V-HACD algorithm. It
|
||||
creates several CollisionShape nodes, each with a convex shape. Since it
|
||||
generates multiple shapes, it is more accurate for concave objects at the cost
|
||||
of performance. For objects with medium complexity, it will likely be faster
|
||||
than using a single concave collision shape.
|
||||
|
||||
Concave (trimesh) collision shapes
|
||||
----------------------------------
|
||||
Concave or trimesh collision shapes
|
||||
-----------------------------------
|
||||
|
||||
:ref:`Concave collision shapes <class_ConcavePolygonShape>` (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
|
||||
collision shapes available in Godot. **Concave shapes can only be used within
|
||||
StaticBodies.** They will not work with KinematicBodies or RigidBodies unless
|
||||
the RigidBody's mode is set to Static.
|
||||
:ref:`Concave collision shapes <class_ConcavePolygonShape>`, 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 KinematicBodies or RigidBodies unless the RigidBody's mode is Static.
|
||||
|
||||
.. note::
|
||||
|
||||
Even though concave shapes offer the most accurate *collision*, contact
|
||||
reporting can be less accurate compared to primitive shapes.
|
||||
reporting can be less precise than primitive shapes.
|
||||
|
||||
When not using GridMaps for level design, concave collision shapes are usually
|
||||
the best approach for level collision. That said, if your level has small
|
||||
details, you will probably want to exclude those from collision for better
|
||||
performance and reliability. To do so, you can build a simplified collision mesh
|
||||
in a 3D modeler and have Godot generate a collision shape for it automatically
|
||||
(see below).
|
||||
When not using GridMaps for level design, concave shapes are the best approach
|
||||
for a level's collision. That said, if your level has small details, you may
|
||||
want to exclude those from collision for performance and game feel. To do so,
|
||||
you can build a simplified collision mesh in a 3D modeler and have Godot
|
||||
generate a collision shape for it automatically. More on that below
|
||||
|
||||
Note that unlike primitive and convex shapes, a concave collision shape doesn't
|
||||
have an actual "volume". Objects can be placed both *outside* of the shape as
|
||||
have an actual "volume". You can place objects both *outside* of the shape as
|
||||
well as *inside*.
|
||||
|
||||
You can generate a concave collision shape from the editor by selecting a
|
||||
MeshInstance and using the **Mesh** menu at the top of the 3D viewport.
|
||||
The editor exposes two generation options:
|
||||
MeshInstance and using the **Mesh** menu at the top of the 3D viewport. The
|
||||
editor exposes two options:
|
||||
|
||||
- **Create Trimesh Static Body** is a convenience option. It will create a
|
||||
StaticBody containing a concave shape matching the mesh's geometry.
|
||||
- **Create Trimesh Static Body** is a convenient option. It creates a StaticBody
|
||||
containing a concave shape matching the mesh's geometry.
|
||||
|
||||
- **Create Trimesh Collision Sibling** will create a CollisionShape node
|
||||
containing the a concave shape matching the mesh's geometry.
|
||||
- **Create Trimesh Collision Sibling** creates a CollisionShape node with a
|
||||
concave shape matching the mesh's geometry.
|
||||
|
||||
.. note::
|
||||
|
||||
If you need to make a RigidBody *slide* on a concave collision shape, you
|
||||
may notice that sometimes, the RigidBody will bump upwards. To solve this,
|
||||
open **Project > Project Settings** and enable
|
||||
Suppose you need to make a RigidBody *slide* on a concave collision shape.
|
||||
In that case, you may notice that sometimes, the RigidBody will bump
|
||||
upwards. To solve this, open **Project > Project Settings** and enable
|
||||
**Physics > 3d > Smooth Trimesh Collision**.
|
||||
|
||||
Once you've enabled smooth trimesh collision, make sure the concave shape is
|
||||
the only shape of your StaticBody and that it's at located at its origin
|
||||
the only shape of your StaticBody and that it's located at its origin
|
||||
without any rotation. This way, the RigidBody should slide perfectly on the
|
||||
StaticBody.
|
||||
|
||||
@@ -127,19 +128,19 @@ The editor exposes two generation options:
|
||||
Performance caveats
|
||||
-------------------
|
||||
|
||||
While you aren't limited to a single collision shape per PhysicsBody, it's
|
||||
recommended to keep the number of shapes as low as possible to improve
|
||||
performance. This is especially true for dynamic objects such as RigidBodies and
|
||||
KinematicBodies. On top of that, avoid translating, rotating or scaling
|
||||
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
|
||||
KinematicBodies. On top of that, avoid translating, rotating, or scaling
|
||||
CollisionShapes to benefit from the physics engine's internal optimizations.
|
||||
|
||||
When a single non-transformed collision shape is used in a StaticBody, the
|
||||
When using a single non-transformed collision shape in a StaticBody, the
|
||||
engine's *broad phase* algorithm can discard inactive PhysicsBodies. The *narrow
|
||||
phase* will then only have to take into account the active bodies's shapes. If a
|
||||
StaticBody has many collision shapes, the broad phase would fail and the narrow
|
||||
phase (which is slower) must perform a collision check against each shape.
|
||||
phase* will then only have to take into account the active bodies' shapes. If a
|
||||
StaticBody has many collision shapes, the broad phase will fail. The narrow
|
||||
phase, which is slower, must then perform a collision check against each shape.
|
||||
|
||||
If you run into performance issues, you may have to make tradeoffs in terms of
|
||||
accuracy. Most games out there don't actually have 100% accurate collision. They
|
||||
just find creative ways to hide it or otherwise make it unnoticeable during
|
||||
normal gameplay :)
|
||||
accuracy. Most games out there don't have a 100% accurate collision. They find
|
||||
creative ways to hide it or otherwise make it unnoticeable during normal
|
||||
gameplay.
|
||||
|
||||
Reference in New Issue
Block a user