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 局部旋转的主要内容,如果未能解决你的问题,请参考以下文章