Я пишу статическую функцию, которая использует функцию 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 будет придерживаться правила правой руки? Я что-то упустил или просто запутался?