В Godot у меня есть RigidBody
, который я хотел бы повернуть в трехмерном пространстве, чтобы оно указывало на определенное направление.В значительной степени LookAt.Я нашел этот урок , и я написал ниже на его основе.
Что-то меня немного смущает, так как я не уверен, почему меня беспокоит только ось х вrotationAngle
- должен ли я каким-то образом реализовывать и другие?
public override void _IntegrateForces(PhysicsDirectBodyState state)
{
// Push RigidBody in direction that it's facing
Vector3 forwardForce = GetForwardForce();
this.ApplyCentralImpulse(forwardForce);
// Turn RigidBody to point in direction of world origin
var targetPosition = Vector3.Zero;
var currentDirection = -this.Transform.basis.z;
var currentDistanceFromTarget = this.Translation.DistanceSquaredTo(targetPosition);
GD.Print(currentDistanceFromTarget + " " + currentDirection);
if(currentDistanceFromTarget > 50)
{
var targetDir = (targetPosition - this.Transform.origin).Normalized();
var rotationAngle = Mathf.Acos(currentDirection.x) - Mathf.Acos(targetDir.x); // Why only x?
var angularVelocity = Vector3.Up * (rotationAngle / state.GetStep());
state.SetAngularVelocity(angularVelocity);
}
}
Это будет работать до определенного момента - если новый currentDirection
соответствует положительной оси Z, то он просто продолжается втаким образом.