OpenGL glm 局部旋转

Posted

技术标签:

【中文标题】OpenGL glm 局部旋转【英文标题】:OpenGl glm local rotation 【发布时间】:2015-10-08 14:17:30 【问题描述】:

我需要在本地坐标系中旋转对象,就像你可以在 3dmax\maya 等中旋转它一样...

我当前的代码是:

ModelMatrix = glm::mat4(1.0f);
TransformMatrix = glm::mat4(1.0f);
ScaleMatrix = glm::mat4(1.0f);
RotateMatrix = glm::mat4(1.0f);

ScaleMatrix = glm::scale(ScaleMatrix, glm::vec3(scalex, scalez, scaley));
TransformMatrix = glm::translate(TransformMatrix, glm::vec3(x, z, y));
RotateMatrix = glm::rotate(RotateMatrix, anglex, glm::vec3(1, 0, 0));
RotateMatrix= glm::rotate(RotateMatrix, angley, glm::vec3(0, 0, 1));
RotateMatrix = glm::rotate(RotateMatrix, anglez, glm::vec3(0, 1, 0));

ModelMatrix = TransformMatrix * ScaleMatrix* RotateMatrix;
MVP = Projection * View * ModelMatrix ;

anglex,y,z - 来自键盘。

现在只有最后一个维度作为本地工作(在我的示例中,它是 glm::vec3(0, 1, 0) Z 轴)在此 IMAGE 我展示了我需要的(2)和我拥有的( 3)...如果我更改“anglez”,它总是作为 ROLL 工作。但是anglex和angley在世界坐标系中。

我的第二次尝试 - 使用四元数:

quat MyQuaternion= glm::quat(cos(glm::radians(xangle / 2)), 0, sin(glm::radians(xangle / 2)), 0);
    quat MyQuaternion2 = glm::quat(cos(glm::radians(yangle/ 2)), sin(glm::radians(yangle / 2)), 0, 0);
    quat MyQuaternion3 = glm::quat(cos(glm::radians(zangle / 2)), 0,0,sin(glm::radians(zangle / 2)));
    glm::mat4 RotationMatrix = toMat4(MyQuaternion*MyQuaternion2*MyQuaternion3);

但我有同样的结果

【问题讨论】:

【参考方案1】:

您应该修改整个ModelMatrix 而不是角度。将ModelMatrix 初始化为单位矩阵。然后,当您处理键盘输入时:

if(rotate about x-axis)
    ModelMatrix = glm::rotate(ModelMatrix, angle, glm::vec3(1, 0, 0));
if(rotate about y-axis)
    ModelMatrix = glm::rotate(ModelMatrix, angle, glm::vec3(0, 1, 0));
if(rotate about z-axis)
    ModelMatrix = glm::rotate(ModelMatrix, angle, glm::vec3(0, 0, 1));
if(any rotation happened)
    MVP = Projection * View * ModelMatrix ;

您可以在任何级别进行此修改。 MVP 级别、ModelMatrix 级别(如此处所示)或RotateMatrix 级别。

【讨论】:

这种方式只有在我不重置每个循环的矩阵时才有效 - //ModelMatrix = glm::mat4(1.0f); 这样我所有的子模型只能通过乘法继承父模型:ModelMatrix[i] *= TransformMatrix[i] * ScaleMatrix[i]*RotateMatrix[i]; ...也在这个我只能严格沿轴旋转 为什么要重置矩阵?只需使用一个临时矩阵来累积场景图中的矩阵。严格的轴约束旋转不是您最初想要的吗?当然,您始终可以指定其他旋转轴。 谢谢!我只是没有重置旋转矩阵 - 现在它工作正常。只有规范:angle=value,但不是 angle+=value

以上是关于OpenGL glm 局部旋转的主要内容,如果未能解决你的问题,请参考以下文章

在 Opengl 中使用 glm 旋转

OpenGL - 使用 glm 围绕 2 个轴旋转

OpenGL glm旋转

opengl 使用 glm 单独旋转对象

OpenGL/GLSL/GLM - Skybox 像第三人称一样旋转

使用 GLM(旋转)为 OpenGL 创建变换矩阵