Предотвратить крен при регулировке рыскания и тангажа? - PullRequest
0 голосов
/ 26 декабря 2018

В настоящее время я пытаюсь решить проблему с моей камерой наблюдения / орбиты.Я могу ввести рыскание и тангаж, поворачивая камеру вокруг своей цели, но после того, как я пролетел над вершиной или под нижней частью моего мишени, будет введен рулон.В качестве более прозрачного и простого примера:

Yaw + Pitch + Yaw = Roll

Хотя приведенный выше пример не демонстрирует, что я пытаюсь предотвратить, помогает объяснить происходящее изменение,Допустим, я ввел 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);

На основании вышеизложенного, когдаЯ добавляю рыскание и тангаж, это создает поворот мираЯ хочу предотвратить это, и, насколько я понимаю, мне придется сделать локальный шаг и сделать кругосветное путешествие, но я не совсем уверен, как это сделать, и не могу найти документацию по нему.


Как я могу предотвратить появление крена во время этого процесса?

...