在3D中组合旋转

时间:2016-11-29 21:55:13

标签: c++ opengl 3d rotation

我正在尝试使用openGL(C ++)实现3D旋转, 我真的厌倦了寻找一种方法来旋转全局(X,Y,Z)周围的任何物体而不是本地物体。

我发现了这个简单的概念:

  1. 获取要旋转的对象的局部到世界变换矩阵。
  2. 使用此矩阵的反转将世界轴转换为本地坐标。
  3. 使用转换后的轴来计算代码中的旋转。
  4. 所以我做了类似的事情:

     //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 个答案:

答案 0 :(得分:0)

首先,确定旋转对象的点。这通常是对象的中心。我们称之为旋转点。

现在,对于对象中的每个顶点,我们将执行以下操作:

1)将顶点转换为原点。这可以通过从顶点减去旋转点来完成。例如,如果旋转点是(5,10,20),我们将从顶点的x坐标减去5,从顶点的y坐标减去10,从顶点的z坐标减去20。

2)使用3x3旋转矩阵执行旋转。

3)将顶点转换回旋转点。我们撤消第一步,并将5,10和20添加到顶点的坐标。

我发现这比使用变换矩阵更简单,但效率可能更低。