gpt4 book ai didi

c++ - 使用 glm 的旋转功能时预期的旋转方向是什么?

转载 作者:行者123 更新时间:2023-11-30 03:17:38 24 4
gpt4 key购买 nike

我正在编写一个静态函数,它使用 GLM 的 rotate() 函数来围绕任意轴旋转 vector 。

我写了一个简单的测试来检查我的工作,我发现旋转的方向与我预期的相反。

我以 pi/4 为步长围绕 X 轴 (1,0,0) 旋转一个单位 vector (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 的右手坐标系遵守右手定则?我是不是遗漏了什么,或者我只是感到困惑?

最佳答案

您正在使用矩阵转置,并且由于旋转矩阵是正交矩阵,这具有使用这些矩阵的逆矩阵的效果:R^-1 = R^T.

glm 使用 mat4 * vec4 乘法顺序模仿经典的 GL 约定,其中 vec4 是列 vector 。当您编写 vec4 * mat4 时,vec4 被解释为行 vector ,并且由于 (A*B)^T = B^T * A^T,你会得到与 transpose(mat4) * vec4 相同的结果。

关于c++ - 使用 glm 的旋转功能时预期的旋转方向是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55319480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com