【发布时间】:2014-07-02 06:38:25
【问题描述】:
我试图通过矩阵在它自己的轴上旋转一个对象,但我遇到了一个问题。在 X 或 Y 轴上旋转会产生预期的结果,但在 Z 轴上旋转时,整个模型似乎围绕 Z 轴旋转,就好像它下面有一个看不见的极点一样,当从X或Y轴,隐形极点贯穿模型。
glm::mat4 rotateMatrix(GLfloat angle, glm::vec3 axis)
{
axis = glm::normalize(axis);
GLfloat s = sin(angle);
GLfloat c = cos(angle);
GLfloat oc = 1.0f - c;
return glm::mat4(
oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0,
oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0,
oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0,
0.0, 0.0, 0.0, 1.0
);
}
绘图功能内:
_prog.setUniform("Translation", glm::vec3(0.0f, 20.0f, -20.0f));
_prog.setUniform("Rotate", rotateMatrix(45.0f, glm::vec3(0.0f, 0.0f, 1.0f)));
_model.render();
【问题讨论】:
-
旋转矩阵看起来是正确的。但“翻译”的目的是什么?如果删除绘图函数的那一行会发生什么?
-
@DavidK "Translation" 是 GLSL 中的 vec3,用于在世界中移动/定位模型。我使用它很像 glTranslatef(float, float, float)。
-
它似乎会做一些事情。我只是没有在其他任何地方看到这种特殊的符号。但是您似乎在旋转之前进行了翻译,这很容易引起问题(如@Sunius 的回答中所述)。这就是为什么我问如果你根本不翻译会发生什么。
-
另一个问题:您的模型相对于坐标轴在您对其执行这些操作之前在哪里?也就是说,在平移之前,最小/最大 x 坐标、最小/最大 y 坐标、最小/最大 z 坐标的原始范围是多少?
标签: c++ opengl matrix rotation