我試圖用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'。這將在全局座標系中旋轉。這是你想要的嗎? –