Ich möchte, dass meine First-Person-Kamera ihre Blickrichtung reibungslos von Richtung d1 in Richtung d2 ändert. Die letztere Richtung wird durch eine Zielposition t2 angezeigt.
Bisher habe ich eine Drehung implementiert, die gut funktioniert, aber die Geschwindigkeit der Drehung verlangsamt sich, je näher die aktuelle Richtung der gewünschten kommt. Das möchte ich vermeiden.
Hier sind die zwei sehr einfachen Methoden, die ich bisher geschrieben habe:
// this method initiates the direction change and sets the parameter
public void LookAt(Vector3 target) {
_desiredDirection = target - _cameraPosition;
_desiredDirection.Normalize();
_rotation = new Matrix();
_rotationAxis = Vector3.Cross(Direction, _desiredDirection);
_isLooking = true;
}
// this method gets execute by the Update()-method if _isLooking flag is up.
private void _lookingAt() {
dist = Vector3.Distance(Direction, _desiredDirection);
// check whether the current direction has reached the desired one.
if (dist >= 0.00001f) {
_rotationAxis = Vector3.Cross(Direction, _desiredDirection);
_rotation = Matrix.CreateFromAxisAngle(_rotationAxis, MathHelper.ToRadians(1));
Direction = Vector3.TransformNormal(Direction, _rotation);
} else {
_onDirectionReached();
_isLooking = false;
}
}
Auch hier funktioniert die Rotation einwandfrei. Kamera erreicht die gewünschte Richtung. Aber die Geschwindigkeit ist im Laufe der Bewegung nicht gleich -> sie verlangsamt sich.
Wie erreicht man eine Rotation mit konstanter Geschwindigkeit?
Quaternion.Slerp
Ist es nur ich oder klingt das wie ein Name in einem wirklich schlechten oder wirklich guten Fantasy-Roman? Abzüglich des Punktes natürlich.