physics_introduction.rst 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. .. _doc_physics_introduction:
  2. Physics introduction
  3. ====================
  4. In game development you often need to know when two objects in the game
  5. intersect or come into contact. This is known as **collision detection**.
  6. When a collision is detected, you typically want something to happen. This
  7. is known as **collision response**.
  8. Godot offers a number of collision objects in 2D and 3D to provide both collision detection
  9. and response. Trying to decide which one to use for your project can be confusing.
  10. You can avoid problems and simplify development if you understand how each works
  11. and what their pros and cons are.
  12. In this guide you will learn:
  13. - Godot's four collision object types
  14. - How each collision object works
  15. - When and why to choose one type over another
  16. .. note:: This document's examples will use 2D objects. Every 2D physics object
  17. and collision shape has a direct equivalent in 3D and in most cases
  18. they work in much the same way.
  19. Collision Objects
  20. -----------------
  21. Godot offers four kinds of physics bodies, extending :ref:`CollisionObject2D <class_CollisionObject2D>`:
  22. - :ref:`Area2D <class_Area2D>`
  23. ``Area2D`` nodes provide **detection** and **influence**. They can detect when
  24. objects overlap and can emit signals when bodies enter or exit. An ``Area2D``
  25. can also be used to override physics properties such as gravity or damping
  26. in a defined area.
  27. The other three bodies extend from :ref:`PhysicsBody2D <class_PhysicsBody2D>`:
  28. - :ref:`StaticBody2D <class_StaticBody2D>`
  29. A static body is one that is not moved by the physics engine. It participates
  30. in collision detection, but does not move in response to the collision. They
  31. are most often used for objects that are part of the environment or that do
  32. not need to have any dynamic behavior.
  33. - :ref:`RigidBody2D <class_RigidBody2D>`
  34. This is the node that implements simulated 2D physics. You do not control a
  35. ``RigidBody2D`` directly, but instead you apply forces to it (gravity, impulses,
  36. etc.) and the physics engine calculates the resulting movement. :ref:`Read more about using rigid bodies. <_doc_rigid_body>`
  37. - :ref:`KinematicBody2D <class_KinematicBody2D>`
  38. A body that provides collision detection, but no physics. All movement and
  39. collision response must be implemented in code.
  40. Collision Shapes
  41. ~~~~~~~~~~~~~~~~
  42. A physics body can hold any number of :ref:`Shape2D <class_Shape2D>` objects
  43. as children. These shapes are used to define the object's collision bounds
  44. and to detect contact with other objects.
  45. .. note:: In order to detect collisions, at least one ``Shape2D`` must be
  46. assigned to the object.
  47. The most common way to assign a shape is by adding a :ref:`CollisionShape2D <class_CollisionShape2D>`
  48. or :ref:`CollisionPolygon2D <class_CollisionPolygon2D>` as a child of the object.
  49. These nodes allow you to draw the shape directly in the editor workspace.
  50. .. important:: Be careful to never scale your collision shapes in the editor.
  51. The "Scale" property in the Inspector should remain ``(1, 1)``. When changing
  52. sizing the collision shape, you should always use the size handles, **not**
  53. the ``Node2D`` scale handles. Scaling a shape can result in unexpected
  54. collision behavior.
  55. .. image:: img/player_coll_shape.png
  56. Physics process callback
  57. ~~~~~~~~~~~~~~~~~~~~~~~~
  58. The physics engine may spawn multiple threads to improve performance, so
  59. it can use up to a full frame to process physics. Because of this, the value
  60. of a body's state variables such as ``position`` or ``linear velocity``
  61. may not be accurate for the current frame.
  62. In order to avoid this inaccuracy, any code that needs to access a body's properties should
  63. be run in the :ref:`Node._physics_process() <class_Node__physics_process>`
  64. callback, which is called before each physics step at a constant frame rate
  65. (60 times per second by default).
  66. Collision Layers and Masks
  67. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  68. One of the most powerful but frequently misunderstood collision features
  69. is the collision layer system. This system allows you to build up very complex
  70. interactions between a variety of objects. The key concepts are **layers**
  71. and **masks**. Each ``CollisionObject2D`` has 20 different physics layers
  72. it can interact with.
  73. Let's look at each of the properties in turn:
  74. - collision_layer
  75. This describes the layers that the object appears **in**. By default, all
  76. bodies are on layer ``1``.
  77. - collision_mask
  78. This describes what layers the body will **scan** for collisions. If an
  79. object isn't in one of the mask layers, the body will ignore it. By default,
  80. all bodies scan layer ``1``.
  81. These properties can be configured via code, or by editing them in the Inspector.
  82. Keeping track of what you're using each layer for can be difficult, so you
  83. may find it useful to assign names to the layers you're using. Names can
  84. be assigned in Project Settings -> Layer Names.
  85. .. image:: img/physics_layer_names.png
  86. **Example:**
  87. You have four node types in your game: Walls, Player, Enemy, and Coin. Both
  88. Player and Enemy should collide with Walls. The Player node should detect
  89. collisions with both Enemy and Coin, but Enemy and Coin should ignore each
  90. other.
  91. Start by naming layers 1-4 "walls", "player", "enemies", and "coins" and
  92. place each node type in its respective layer using the "Layer" property.
  93. Then set each node's "Mask" property by selecting the layers it should
  94. interact with. For example, the Player's settings would look like this:
  95. .. image:: img/player_collision_layers.png
  96. .. image:: img/player_collision_mask.png
  97. Area2D
  98. ------
  99. Area nodes provide **detection** and **influence**. They can detect when
  100. objects overlap and emit signals when bodies enter or exit. Areas can also
  101. be used to override physics properties such as gravity or damping in a
  102. defined area.
  103. There are three main uses for :ref:`Area2D <class_Area2D>`:
  104. - Overriding physics parameters such as gravity in a given region.
  105. - Detecting when other bodies enter or exit a region or what bodies are currently in a region.
  106. - Checking other areas for overlap.
  107. By default, areas also receive mouse and touchscreen input.
  108. StaticBody2D
  109. ------------
  110. A static body is one that is not moved by the physics engine. It participates
  111. in collision detection, but does not move in response to the collision. However,
  112. it can impart motion or rotation to a colliding body **as if** it were moving,
  113. using its ``constant_linear_velocity`` and ``constant_angular_velocity`` properties.
  114. ``StaticBody2D`` nodes are most often used for objects that are part of the environment
  115. or that do not need to have any dynamic behavior.
  116. Example uses for ``StaticBody2D``:
  117. - Platforms (including moving platforms)
  118. - Conveyor belts
  119. - Walls and other obstacles
  120. RigidBody2D
  121. -----------
  122. This is the node that implements simulated 2D physics. You do not control a
  123. :ref:`RigidBody2D <class_RigidBody2D>` directly. Instead you apply forces
  124. to it and the physics engine calculates the resulting movement, including
  125. collisions with other bodies, and collision responses such as bouncing,
  126. rotating, etc.
  127. You can modify a rigid body's behavior via properties such as "Mass",
  128. "Friction", or "Bounce", which can be set in the Inspector.
  129. The body's behavior is also affected by the world's properties, as set in
  130. `Project Settings -> Physics`, or by entering an :ref:`Area2D <class_Area2D>`
  131. that is overriding the global physics properties.
  132. When a rigid body is at rest and hasn't moved for a time, it goes to sleep.
  133. A sleeping body acts like a static body, and its forces are not calculated by
  134. the physics engine. The body will wake up when forces are applied, either by
  135. a collision or via code.
  136. Rigid body modes
  137. ~~~~~~~~~~~~~~~~
  138. A rigid body can be set to one of four modes:
  139. - **Rigid** - The body behaves as a physical object. It collides with other bodies and responds to forces applied to it. This is the default mode.
  140. - **Static** - The body behaves like a :ref:`StaticBody2D <class_StaticBody2D>` and does not move.
  141. - **Character** - Similar to "Rigid" mode, but the body can not rotate.
  142. - **Kinematic** - The body behaves like a :ref:`KinematicBody2D <class_KinematicBody2D>` and must be moved by code.
  143. Using RigidBody2D
  144. ~~~~~~~~~~~~~~~~~
  145. One of the benefits of using a rigid body is that a lot of behavior can be had
  146. "for free" without writing any code. For example, if you were making an
  147. "Angry Birds"-style game with falling blocks, you would only need to create
  148. RigidBody2Ds and adjust their properties. Stacking, falling, and bouncing would
  149. automatically be calculated by the physics engine.
  150. However, if you do wish to have some control over the body, you should take
  151. care - altering the ``position``, ``linear_velocity``, or other physics properties
  152. of a rigid body can result in unexpected behavior. If you need to alter any
  153. of the physics-related properties, you should use the :ref:`_integrate_forces() <class_RigidBody2D__integrate_forces>`
  154. callback instead of ``_physics_process()``. In this callback, you have access
  155. to the body's :ref:`Physics2DDirectBodyState <class_Physics2DDirectBodyState>`,
  156. which allows for safely changing properties and synchronizing them with
  157. the physics engine.
  158. For example, here is the code for an "Asteroids" style spaceship:
  159. ::
  160. extends RigidBody2D
  161. var thrust = Vector2(0, 250)
  162. var torque = 20000
  163. func _integrate_forces(state):
  164. if Input.is_action_pressed("ui_up"):
  165. set_applied_force(thrust.rotated(rotation))
  166. else:
  167. set_applied_force(Vector2())
  168. var rotation_dir = 0
  169. if Input.is_action_pressed("ui_right"):
  170. rotation_dir += 1
  171. if Input.is_action_pressed("ui_left"):
  172. rotation_dir -= 1
  173. set_applied_torque(rotation_dir * torque)
  174. Note that we are not setting the ``linear_velocity`` or ``angular_velocity``
  175. properties directly, but rather applying forces (``thrust`` and ``torque``) to
  176. the body and letting the physics engine calculate the resulting movement.
  177. .. note:: When a rigid body goes to sleep the ``_integrate_forces()``
  178. function will not be called. To override this behavior you will
  179. need to keep the body awake by creating a collision, applying a
  180. force to it, or by disabling the :ref:`can_sleep <class_RigidBody2D_can_sleep>`
  181. property. Be aware that this can have a negative effect on performance.
  182. Contact reporting
  183. ~~~~~~~~~~~~~~~~~
  184. By default, rigid bodies do not keep track of contacts, because this can
  185. require a huge amount of memory if many bodies are in the scene. To enable
  186. contact reporting, set the :ref:`contacts_reported <class_RigidBody2D_contacts_reported>`
  187. property to a non-zero value. The contacts can then be obtained via
  188. :ref:`Physics2DDirectBodyState.get_contact_count() <class_Physics2DDirectBodyState_get_contact_count>`
  189. and related functions.
  190. Contact monitoring via signals can be enabled via the :ref:`contact_monitor <class_RigidBody2D_contact_monitor>`
  191. property. See :ref:`RigidBody2D <class_RigidBody2D>` for the list of available
  192. signals.
  193. KinematicBody2D
  194. ---------------
  195. :ref:`KinematicBody2D <class_KinematicBody2D>` bodies detect collisions with
  196. other bodies, but are not affected by physics properties like gravity or friction.
  197. Instead, they must be controlled by the user via code. The physics engine will
  198. not move a kinematic body.
  199. When moving a kinematic body, you should not set its ``position`` directly.
  200. Instead, you use the ``move_and_collide()`` or ``move_and_slide()`` methods.
  201. These methods move the body along a given vector, and it will instantly stop
  202. if a collision is detected with another body. After the body has collided,
  203. any collision response must be coded manually.
  204. Kinematic collision response
  205. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  206. After a collision, you may want the body to bounce, to slide along a wall,
  207. or to alter the properties of the object it hit. The way you handle collision
  208. response depends on which method you used to move the KinematicBody2D.
  209. :ref:`move_and_collide <class_KinematicBody2D_move_and_collide>`
  210. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  211. When using ``move_and_collide()``, the function returns a
  212. :ref:`KinematicCollision2D <class_KinematicCollision2D>` object, which contains
  213. information about the collision and the colliding body. You can use this
  214. information to determine the response.
  215. For example, if you want to find the point in space where the collision
  216. occurred:
  217. ::
  218. extends KinematicBody2D
  219. var velocity = Vector2(250, 250)
  220. func _physics_process(delta):
  221. var collision_info = move_and_collide(velocity * delta)
  222. if collision_info:
  223. var collision_point = collision_info.position
  224. Or to bounce off of the colliding object:
  225. ::
  226. extends KinematicBody2D
  227. var velocity = Vector2(250, 250)
  228. func _physics_process(delta):
  229. var collide = move_and_collide(velocity * delta)
  230. if collide:
  231. velocity = velocity.bounce(collide.normal)
  232. :ref:`move_and_slide <class_KinematicBody2D_move_and_slide>`
  233. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  234. Sliding is a very common collision response; imagine a player moving along walls
  235. in a top-down game or running up and down slopes in a platformer. While it's
  236. possible to code this response yourself after using ``move_and_collide()``,
  237. ``move_and_slide()`` provides a convenient way to implement sliding movement
  238. without writing very much code.
  239. .. warning:: ``move_and_slide()`` automatically includes the timestep in its
  240. calculation, so you should **not** multiply the velocity vector
  241. by ``delta``.
  242. For example, use the following code to make a character that can walk along
  243. the ground (including slopes) and jump when standing on the ground:
  244. ::
  245. extends KinematicBody2D
  246. var run_speed = 350
  247. var jump_speed = -1000
  248. var gravity = 2500
  249. var velocity = Vector2()
  250. func get_input():
  251. velocity.x = 0
  252. var right = Input.is_action_pressed('ui_right')
  253. var left = Input.is_action_pressed('ui_left')
  254. var jump = Input.is_action_just_pressed('ui_select')
  255. if is_on_floor() and jump:
  256. velocity.y = jump_speed
  257. if right:
  258. velocity.x += run_speed
  259. if left:
  260. velocity.x -= run_speed
  261. func _physics_process(delta):
  262. velocity.y += gravity * delta
  263. get_input()
  264. velocity = move_and_slide(velocity, Vector2(0, -1))
  265. See :ref:`doc_kinematic_character_2d` for more details on using ``move_and_slide()``,
  266. including a demo project with detailed code.