在3D中合并旋转

Combine rotations in 3D

本文关键字:旋转 合并 3D      更新时间:2023-10-16

我正在尝试使用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。

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