我试图用openGL(C++)实现3D旋转, 我真的厌倦了寻找围绕全局(X,Y,Z)旋转任何对象而不是本地对象的方法。在3D中结合旋转
,我发现这个简单的概念:
- 获取本地到要旋转对象的世界变换矩阵。
- 使用此矩阵的逆来将世界轴转换为局部坐标。
- 使用转换的轴来计算旋转,就像您在代码中所做的那样。
所以我做一样的东西:
//set the rotation matrix ti identity matrix
transformedModel->rotationMatrix = glm::rotate(glm::mat4(1.0f), float(0), glm::vec3(1, 1, 1)); //rotation matrix = identity matrix
//X-axis
glm::vec4 axis = glm::inverse(transformedModel->rotationMatrix) * glm::vec4(1,0,0,0);
axis = glm::normalize(axis);
transformedModel->rotationMatrix = glm::rotate(transformedModel->rotationMatrix, glm::radians(rotation.x), glm::vec3(axis.x, axis.y, axis.z));
//Y-axis
glm::vec4 axis2 = glm::inverse(transformedModel->rotationMatrix) * glm::vec4(0,1,0,0);
transformedModel->rotationMatrix = glm::rotate(transformedModel->rotationMatrix, glm::radians(rotation.y), glm::vec3(axis2.x, axis2.y, axis2.z));
axis2 = glm::normalize(axis2);
//Z-axis
glm::vec4 axis3 = glm::inverse(transformedModel->rotationMatrix) * glm::vec4(0,0,1,0);
axis3 = glm::normalize(axis3);
transformedModel->rotationMatrix = glm::rotate(transformedModel->rotationMatrix, glm::radians(rotation.z), glm::vec3(axis3.x, axis3.y, axis3.z));
updateModelMatrix(transformedModel);
正常工作在特殊情况下根本没有! 任何人都可以帮助我得到最简单的方法来做到这一点?
如果要在全局系统中旋转,只需将旋转矩阵乘以原始矩阵的左侧即可。乘以正确结果在本地系统中旋转(假设列向量)。 –
对不起,你是什么意思的原始矩阵? my modelMatrix = TranslationMatrix * RotationMatrix * scalingMatrix; 其中rotation = Rx * Ry * Rz; 然后我发送给顶点着色器: MVP = projection * view * modelMatrix; –
然后,只需将其更改为'modelMatrix = RotationMatrix * TranslationMatrix * ScalingMatrix'。这将在全局坐标系中旋转。这是你想要的吗? –