2016-11-29 144 views
0

我試圖用openGL(C++)實現3D旋轉, 我真的厭倦了尋找圍繞全局(X,Y,Z)旋轉任何對象而不是本地對象的方法。在3D中結合旋轉

,我發現這個簡單的概念:

  1. 獲取本地到要旋轉對象的世界變換矩陣。
  2. 使用此矩陣的逆來將世界軸轉換爲局部座標。
  3. 使用轉換的軸來計算旋轉,就像您在代碼中所做的那樣。

所以我做一樣的東西:

//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); 

正常工作在特殊情況下根本沒有! 任何人都可以幫助我得到最簡單的方法來做到這一點?

+0

如果要在全局系統中旋轉,只需將旋轉矩陣乘以原始矩陣的左側即可。乘以正確結果在本地系統中旋轉(假設列向量)。 –

+0

對不起,你是什麼意思的原始矩陣? my modelMatrix = TranslationMatrix * RotationMatrix * scalingMatrix; 其中rotation = Rx * Ry * Rz; 然後我發送給頂點着色器: MVP = projection * view * modelMatrix; –

+0

然後,只需將其更改爲'modelMatrix = RotationMatrix * TranslationMatrix * ScalingMatrix'。這將在全局座標系中旋轉。這是你想要的嗎? –

回答

0

首先,確定要旋轉物體的點。這通常是對象的中心。我們將這稱爲旋轉點。

現在,對象中的每個頂點,我們將執行以下操作:

1)轉換頂點到原點。這可以通過從頂點減去旋轉點來完成。例如,如果旋轉點爲(5,10,20),我們將從頂點的x座標減去5,從頂點的y座標減去10,並從頂點的z座標減去20。

2)使用3x3旋轉矩陣執行旋轉。

3)將頂點轉換回旋轉點。我們撤銷第一步,並將5,10和20添加到頂點的座標。

我發現這比使用變換矩陣更簡單,但它可能效率較低。

+0

我寧願不處理頂點,只想將矩陣發送到頂點着色器以應用於所有頂點 –