Поворот камеры по вертикали (с использованием вращения по оси) - PullRequest
0 голосов
/ 25 декабря 2010

Я пишу класс камеры для OpenGL, который использует кватернионы и угловую ось. Мне удалось создать функцию для горизонтального вращения (это было легко), но я не могу написать рабочую функцию для ее вертикального вращения. Все мои попытки заканчиваются вращением камеры, черт знает, в каких направлениях ... Мне нужна формула или код, как для моей функции вертикального вращения ( pitchTurn () в моем коде).

Here is my current code:

void Camera::yawTurn(const float& angle){
    rotate(angle, 0.0f, 1.0f, 0.0f);
}

void Camera::pitchTurn(const float& angle){
// need code here
}

void Camera::rotate(const float& angle, const float& x, const float& y, const float& z){
    Quaternionf t;
    t.fromAxisAngle(angle, x, y, z);
    q_ *= t;
    q_.normalize();
}

Мне также интересно, есть ли лучший способ использовать кватернион для вращений без использования оси-оси.

1 Ответ

1 голос
/ 25 декабря 2010

Наиболее вероятной проблемой является порядок вращений.

Кватернионное произведение q * r, если рассматривать его как два комбинированных вращения, применяется к преобразованным вершинам в порядке r, q.

Теперь, если вы хотите повернуть камеру вокруг глобальной оси Y (ось не зависит от ориентации камеры), вы должны умножить t * q.Если вы хотите повернуть камеру вокруг локальной оси Y (ось указана с точки зрения ориентации камеры - если вы смотрите прямо вниз, ваш вектор «вверх» лежит в плоскости XZ, то есть имеет координату Y 0),Вы должны умножить q * t.

Типичные элементы управления камерой вращаются вокруг глобальной оси Y и вокруг локальной оси X.Таким образом, вы должны сделать две функции, preRotate и postRotate (или local / global), использовать глобальную (pre) версию в yawTurn и local (post в pitchTurn.

...