我正在编写一个静态函数,该函数使用GLM的rotation()函数围绕任意轴旋转矢量。
我写了一个简单的测试来检查我的工作,发现旋转发生的方向与预期相反。
我以pi / 4为步长绕X轴(1,0,0)旋转单位矢量(0,0,1)。我期望由于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的右手坐标系会遵循右手规则吗?我是否想念某些东西,还是感到困惑?
答案 0 :(得分:2)
您使用的是转置的矩阵,并且由于旋转矩阵是正交矩阵,因此具有使用这些矩阵的逆矩阵AppBar(...)
的效果。
glm用appBar: AppBar(...)
乘法顺序模仿经典的GL约定,其中R^-1 = R^T
是列向量。
编写mat4 * vec4
时,vec4
被解释为行向量,并且由于vec4 * mat4
,您得到的结果与vec4
相同。