Up to date

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

Verwenden von RigidBody

Was ist ein Rigid Body?

Ein Rigid Body ist ein Körper, der direkt von der Physik-Engine gesteuert wird, um das Verhalten von physikalischen Objekten zu simulieren. Um die Form des Bodys zu definieren, müssen ihm ein oder mehrere Shape3D-Objekte zugewiesen werden. Beachten Sie, dass das Setzen der Position dieser Shapes den Massenschwerpunkt des Körpers beeinflusst.

Wie man einen Rigid Body kontrolliert

Das Verhalten eines Rigid Bodys kann durch die Einstellung seiner Eigenschaften, wie Masse und Gewicht, verändert werden. Ein physikalisches Material muss dem Rigid Body hinzugefügt werden, um seine Reibung und Elastizität einzustellen und festzulegen, ob er absorbierend und/oder rau ist. Diese Propertys können im Inspector oder per Code eingestellt werden. Siehe RigidBody3D und PhysicsMaterial für die vollständige Liste der Propertys und ihre Auswirkungen.

Abhängig von Ihrer gewünschten Anwendung gibt es verschiedene Möglichkeiten, die Bewegung eines Rigid Bodys zu steuern.

Wenn Sie einen Rigid Body nur einmal platzieren müssen, z.B. um seine anfängliche Position zu bestimmen, können Sie die Methoden verwenden, die vom Node3D-Node bereitgestellt werden, wie set_global_transform() oder look_at(). Diese Methoden können jedoch nicht in jedem Frame aufgerufen werden, da die Physik-Engine sonst nicht in der Lage ist, den Zustand des Bodys korrekt zu simulieren. Nehmen wir als Beispiel einen Rigid Body, der so gedreht werden soll, dass er auf ein anderes Objekt zeigt. Ein häufiger Fehler bei der Implementierung dieser Art von Verhalten ist die Verwendung von look_at() in jedem Frame, was die Physiksimulation unterbricht. Im Folgenden werden wir zeigen, wie man dies korrekt implementiert.

Die Tatsache, dass Sie die Methoden set_global_transform() oder look_at() nicht verwenden können, bedeutet nicht, dass Sie nicht die vollständige Kontrolle über einen Rigid Body haben können, stattdessen können Sie hierfür _integrate_forces() nutzen. Bei dieser Methode können Sie Kräfte hinzufügen, Impulse anwenden oder die Geschwindigkeit einstellen, um jede gewünschte Bewegung zu erzielen.

Die "look at" -Methode

Wie oben beschrieben, kann die look_at()-Methode von Node3D nicht in jedem Frame verwendet werden, um ein Ziel zu verfolgen. Hier ist eine eigene look_at()-Methode namens look_follow(), die mit Rigid Bodys funktioniert:

extends RigidBody3D

var speed: float = 0.1

func look_follow(state: PhysicsDirectBodyState3D, current_transform: Transform3D, target_position: Vector3) -> void:
    var forward_local_axis: Vector3 = Vector3(1, 0, 0)
    var forward_dir: Vector3 = (current_transform.basis * forward_local_axis).normalized()
    var target_dir: Vector3 = (target_position - current_transform.origin).normalized()
    var local_speed: float = clampf(speed, 0, acos(forward_dir.dot(target_dir)))
    if forward_dir.dot(target_dir) > 1e-4:
        state.angular_velocity = local_speed * forward_dir.cross(target_dir) / state.step

func _integrate_forces(state):
    var target_position = $my_target_node3d_node.global_transform.origin
    look_follow(state, global_transform, target_position)

Diese Methode benutzt die Property angular_velocity des Rigid Body, um den Body zu rotieren. Die Achse, um die rotiert werden soll, wird durch das Kreuzprodukt zwischen der aktuellen Vorwärtsrichtung und der Richtung, in die man schauen möchte, bestimmt. Das Clamping ist eine einfache Methode, um zu verhindern, daß die Rotation über die Richtung hinausgeht, in die man schauen möchte, da die gesamte benötigte Rotation durch den Arkussinus des Skalarprodukts gegeben ist. Diese Methode kann auch mit axis_lock_angular_* verwendet werden. Wenn eine genauere Kontrolle benötigt wird, können Lösungen, die auf Quaternion beruhen, erforderlich sein, wie in 3D-Transformationen verwenden beschrieben.