Как правильно делать повороты с кватернионами - PullRequest
0 голосов
/ 01 ноября 2018

, поэтому я пытаюсь создать камеру, которая смотрит на объект, который я создал, и этот объект должен вращаться в ответ на нажатия мыши и клавиатуры. Мышь вращается вокруг тона и рыскания, а клавиатура управляет вращением.

До сих пор я управлял классом, представляющим камеру кватерниона:

QuaternionCamera::QuaternionCamera(vec3 direction)
{
    this->initial_state = quat(1, 0, 0, 0);
    this->distance = direction;
}

void QuaternionCamera::RotateCamera(float Xangle, float Yangle, float Zangle) {
    quat temp = initial_state.qFromAngleAxis(Xangle, vec4(1,0,0,1));
    quat temp2 = temp * initial_state.qFromAngleAxis(Yangle, vec4(0,1,0,1));
    quat temp3 =  temp2 * initial_state.qFromAngleAxis(Zangle, vec4(0, 0, 1, 1));
    initial_state = initial_state * temp3;
    initial_state = initial_state.qNormalize();
}

mat4 QuaternionCamera::ViewMatrix() {
    mat4 rotatingMatrixFromQuaternion = initial_state.qGLMatrix(initial_state, mat4());
    mat4 res = MatrixFactory::translationMatrix(distance);
    return res*rotatingMatrixFromQuaternion;
}

Как это работает очень просто, когда при щелчке и перемещении мыши вызывается функция RotateCamera с RotateCamera (Pitch, Yaw, 0), а когда клавиатура нажата, я вызываю ее с помощью RotateCamera (0, 0, Roll ). Проблема здесь в том, что объект вращается вокруг странной оси, а не вращается вокруг своей собственной оси.

Чтобы правильно понять, что я пытаюсь достичь, посмотрите это видео: Видео работы кватерниона

1 Ответ

0 голосов
/ 01 ноября 2018

Вы неправильно вычислили свои кватернионы.

Ваша камера должна содержать Quaternion Q, который, как я считаю, является вашим начальным состоянием. Если вы хотите повернуть свою ориентацию, вам просто нужно вычислить новый кватернион, как вы это делаете (quat temp), и применить его НА СЛЕДУЮЩЕМ.

Поскольку кватернионы не являются коммутативными, вы должны применять их в правильном порядке: Q2 * Q1, где Q2 - ваш новый кватернион, а Q1 - ваш старый кватернион.

...