簡體   English   中英

結合3D旋轉

[英]Combine rotations in 3D

我試圖用openGL(C ++)實現3D旋轉,我真的很疲倦於尋找一種方法來圍繞全局(X,Y,Z)而不是局部對象旋轉任何對象。

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

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

在特殊情況下根本無法正常工作!! 有誰能幫助我找到最簡單的正確方法呢?

首先,確定旋轉對象的點。 這通常是對象的中心。 我們將其稱為旋轉點。

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

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

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

3)將頂點平移回旋轉點。 我們撤消第一步,然后將5、10和20添加到頂點的坐標。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM