В настоящее время я пытаюсь решить проблему с моей камерой наблюдения / орбиты.Я могу ввести рыскание и тангаж, поворачивая камеру вокруг своей цели, но после того, как я пролетел над вершиной или под нижней частью моего мишени, будет введен рулон.В качестве более прозрачного и простого примера:
Хотя приведенный выше пример не демонстрирует, что я пытаюсь предотвратить, помогает объяснить происходящее изменение,Допустим, я ввел 15 градусов рыскания и 165 градусов тангажа, и тогда мне кажется, что я ввел крен, когда мне не следовало этого делать, поскольку я вращаюсь только на X
и Y
.
Myтекущий код для расчета новой позиции камеры:
Vector3 lookAt = Position - Target;
Vector3 right = Vector3.Cross(lookAt, Up);
Up = Vector3.Normalize(Vector3.Cross(right, lookAt);
right.Normalize();
// This line may be where the restriction needs to occur.
Vector3 newPos = Vector3.Normalize(Position + right * yaw * lookAt.Length() +
Up * pitch * lookAt.Length()) * Position.Length();
float magnitude = Up.Length() * newPos.Length();
float dot = Vector3.Dot(Up, newPos) / magnitude;
if (Math.Abs(dot) < 0.98)
Position = newPos;
Положение затем используется для вычисления матрицы вида позже с помощью:
View = Matrix.LookAtRH(Position, Target, Up);
На основании вышеизложенного, когдаЯ добавляю рыскание и тангаж, это создает поворот мираЯ хочу предотвратить это, и, насколько я понимаю, мне придется сделать локальный шаг и сделать кругосветное путешествие, но я не совсем уверен, как это сделать, и не могу найти документацию по нему.
Как я могу предотвратить появление крена во время этого процесса?