RigidBody (Starre Körper)

Was ist ein starrer Körper?

Ein starrer Körper wird direkt von der Physik-Engine gesteuert, um das Verhalten physikalischer Objekte zu simulieren. Um die Form des Körpers zu definieren, müssen ihm eines oder mehrere Shape Objekte zugewiesen sein. Beachten Sie, dass das Festlegen der Position dieser Formen den Schwerpunkt des Körpers beeinflusst.

Wie man einen starren Körper kontrolliert

Das Verhalten eines starren Körpers kann durch Festlegen seiner Eigenschaften wie Reibung, Masse, Sprungkraft usw. geändert werden. Diese Eigenschaften können im Inspektor oder über den Code festgelegt werden. Die vollständige Liste der Eigenschaften und ihrer Auswirkungen finden Sie unter RigidBody.

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

Wenn Sie einen starren Körper nur einmal platzieren müssen, um beispielsweise seine ursprüngliche Position festzulegen, können Sie die vom Spatial Node bereitgestellten Methoden verwenden, z.B. set_global_transform () oder look_at (). Diese Methoden können jedoch nicht in jedem Frame aufgerufen werden, oder die Physik-Engine kann den Zustand des Körpers nicht korrekt simulieren. Stellen Sie sich als Beispiel einen starren Körper vor den Sie drehen möchten, damit er auf ein anderes Objekt zeigt. Ein häufiger Fehler bei der Implementierung dieser Art von Verhalten ist die Verwendung von look_at() für jeden Frame, wodurch die Physiksimulation unterbrochen wird. Im Folgenden wird gezeigt, wie dies korrekt implementiert wird.

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 starren Körper 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 Verwendung der ``look_at () ``-Methode des Spatial Nodes nicht für jeden Frame verwendet werden, um einem Ziel zu folgen. Hier ist eine benutzerdefinierte ``look_at () ``-Methode, die zuverlässig mit starren Körpern funktioniert:

extends RigidBody

func look_follow(state, current_transform, target_position):
    var up_dir = Vector3(0, 1, 0)
    var cur_dir = current_transform.basis.xform(Vector3(0, 0, 1))
    var target_dir = (target_position - current_transform.origin).normalized()
    var rotation_angle = acos(cur_dir.x) - acos(target_dir.x)

    state.set_angular_velocity(up_dir * (rotation_angle / state.get_step()))

func _integrate_forces(state):
    var target_position = $my_target_spatial_node.get_global_transform().origin
    look_follow(state, get_global_transform(), target_position)
class Body : RigidBody
{
    private void LookFollow(PhysicsDirectBodyState state, Transform currentTransform, Vector3 targetPosition)
    {
        var upDir = new Vector3(0, 1, 0);
        var curDir = currentTransform.basis.Xform(new Vector3(0, 0, 1));
        var targetDir = (targetPosition - currentTransform.origin).Normalized();
        var rotationAngle = Mathf.Acos(curDir.x) - Mathf.Acos(targetDir.x);

        state.SetAngularVelocity(upDir * (rotationAngle / state.GetStep()));
    }

    public override void _IntegrateForces(PhysicsDirectBodyState state)
    {
        var targetPosition = GetNode<Spatial>("my_target_spatial_node").GetGlobalTransform().origin;
        LookFollow(state, GetGlobalTransform(), targetPosition);
    }
}

Diese Methode verwendet die Methode set_angular_velocity() des starren Körpers, um ihn zu drehen. Es berechnet zuerst die Differenz zwischen dem aktuellen und dem gewünschten Winkel und addiert dann die Geschwindigkeit, die erforderlich ist, um sich in der Zeit eines Frames um diesen Betrag zu drehen.

Bemerkung

Dieses Skript funktioniert nicht mit starren Körpern im Character Modus, da dann die Drehung des Körpers gesperrt ist. In diesem Fall müssten Sie den angehängten Mesh-Node stattdessen mit den Standardmethoden Spatial drehen.