Каково ожидаемое направление вращения при использовании функции вращения glm? - PullRequest
1 голос
/ 24 марта 2019

Я пишу статическую функцию, которая использует функцию rotate () GLM для поворота вектора вокруг произвольной оси.

Я написал простой тест для проверки своей работы и обнаружил, что вращения происходят в противоположном направлении, чем я ожидал.

Я поворачиваю единичный вектор (0,0,1) вокруг оси X (1,0,0) с шагом pi / 4. Я ожидал, что, поскольку OpenGL (и GLM?) Используют правую систему координат, вращение будет происходить в направлении против часовой стрелки вокруг оси X. Вместо этого они происходят по часовой стрелке.

vec3& RotateVector(vec3& targetVector, float const& radians, vec3 const &axis)
{
    mat4 rotation = glm::rotate(mat4(1.0f), radians, axis);

    targetVector = (vec4(targetVector, 0.0f) * rotation).xyz();
    return targetVector;
}


vec3 test(0, 0, 1);
cout << "test initial vals: " << test.x << " " << test.y << " " << test.z << "\n";

RotateVector(test, 3.14f / 4.0f, vec3(1, 0, 0) );
cout << "Rotated test: " << test.x << " " << test.y << " " << test.z << "\n";

RotateVector(test, 3.14 /4.0f, vec3(1, 0, 0));
cout << "Rotated test: " << test.x << " " << test.y << " " << test.z << "\n";

RotateVector(test, 3.14 / 4.0f, vec3(1, 0, 0));
cout << "Rotated test: " << test.x << " " << test.y << " " << test.z << "\n";

RotateVector(test, 3.14 / 4.0f, vec3(1, 0, 0));
cout << "Rotated test: " << test.x << " " << test.y << " " << test.z << "\n";

Когда я запускаю код выше, я получаю следующий вывод:

test initial vals: 0 0 1
Rotated test: 0 0.706825 0.707388
Rotated test: 0 1 0.000796229
Rotated test: 0 0.707951 -0.706262
Rotated test: 0 0.00159246 -0.999999

Выходные данные показывают, что вращение вращается по часовой стрелке вокруг оси X.

Почему это? Я ожидаю, что правая система координат OpenGL будет придерживаться правила правой руки? Я что-то упустил или просто запутался?

1 Ответ

2 голосов
/ 24 марта 2019

Вы используете матрицы транспонированные , и поскольку матрицы вращения являются ортогональными матрицами, это приводит к использованию обратных этих матриц: R^-1 = R^T.

glm имитирует классические соглашения GL с mat4 * vec4 порядком умножения, где vec4 - вектор-столбец. Когда вы пишете vec4 * mat4, vec4 интерпретируется как вектор строки, а с (A*B)^T = B^T * A^T вы получите тот же результат, что и transpose(mat4) * vec4.

...