0 votes

Hello, I've been using Godot for quite a while as a primarily 2D game engine. Recently, I've decided to dive into 3D.

Right now, I'm trying to move a RigidBody to a specific position and rotation using only apply impulse() and apply torque impulse().

I've figured out moving the body to a specific position using apply impulse():

func _physics_process(delta):
    self.linear_velocity = (self.translation.distance_to(targetPosition)/magnetFriction * linear_velocity * delta)
    apply_impulse(Vector3.ZERO, (targetPosition - self.translation) * delta * moveForce )

(this solution is not perfect but works...)

My problem is that I can't figure out how to move an object to a specific rotation, in the same way, using only apply torque impulse().

My target angle is a Vector3, corresponding to an Euler angle.

First I naively thought I could just apply the difference of my current Euler angle and my target Euler angle :

func _physics_process(delta):
    apply_torque_impulse(targetAngle - rotation)

This ended in disaster as it turns out, you can't rotate on two axis at once without your angles going crazy.

Next I tried to use Quaternions,

I figured out something that sort of works sometimes but will break at other times:

func _physics_process(delta):
    var targetQuat = Quat(targetRotation)
    var currentQuat = Quat(rotation)
    var intermediateQuat = currentQuat.slerp(targetQuat, 1 * delta)
    var intermediateEuler = intermediateQuat.get_euler()
    var targetEuler = intermediateEuler - rotation

    apply_torque_impulse(targetEuler * delta * 100)

This solution is really unpredictable and unstable,

The problem is that I'm having a hard time properly understanding Quaternions and how to use them in my problem.

I would really appreciate some help on this seemingly basic problem.

Godot version 3.3
in Engine by (12 points)

Please log in or register to answer this question.

Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to webmaster@godotengine.org with your username.