[英]Combine rotations in 3D
我試圖用openGL(C ++)實現3D旋轉,我真的很疲倦於尋找一種方法來圍繞全局(X,Y,Z)而不是局部對象旋轉任何對象。
我發現了這個簡單的概念:
所以我做了類似的事情:
//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);
在特殊情況下根本無法正常工作!! 有誰能幫助我找到最簡單的正確方法呢?
首先,確定旋轉對象的點。 這通常是對象的中心。 我們將其稱為旋轉點。
現在,對於對象中的每個頂點,我們將執行以下操作:
1)將頂點平移到原點。 這可以通過從頂點減去旋轉點來完成。 例如,如果旋轉點為(5,10,20),我們將從頂點的x坐標減去5,從頂點的y坐標減去10,從頂點的z坐標減去20。
2)用3x3旋轉矩陣執行旋轉。
3)將頂點平移回旋轉點。 我們撤消第一步,然后將5、10和20添加到頂點的坐標。
我發現這比使用轉換矩陣更簡單,但是效率可能較低。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.