3d 矩阵旋转 - 对象奇怪地旋转

Posted

技术标签:

【中文标题】3d 矩阵旋转 - 对象奇怪地旋转【英文标题】:3d matrix rotation - object rotates strangely 【发布时间】:2014-08-02 01:19:03 【问题描述】:

我正在尝试使用旋转矩阵来围绕其 X 轴转动线框立方体。

但是,我不知道如何将旋转原点设置为 0,0,0 以外的任何值..

最奇怪的是——当我增加角度(以度为单位)时,物体旋转得越来越快.. 因此,当旋转角度大约为 8 度时,立方体会执行完整的旋转(围绕原点 0,0,0)。然后是 11 度,等等。

我尝试了三种教程方法,复制代码并将其插入我的顶点系统。每个矩阵代码都会导致相同的行为。

这是我正在使用的方法 - 矩阵在 Matrix_Handler 中使用相关的三角函数定义..

-(void) GLmatrixRotation:(HeyaldaGLDrawNode*) GLpolygon angle:(float)angle 

  matrix X_Matrix, Y_Matrix, Z_Matrix, Final_Matrix;

  int vertexCount = GLpolygon.dynamicVertCount;

  x_angle = angle;
  y_angle = 0;
  z_angle = 0;

  float xOrigin = 150;
  float yOrigin = 150;
  float zOrigin = 0;

  Matrix_Handler(X_Matrix, Y_Matrix, Z_Matrix, deg_to_rad(x_angle), deg_to_rad(y_angle), deg_to_rad(z_angle));
  Concatenate_Matrices(X_Matrix, Y_Matrix, Z_Matrix, Final_Matrix);

  for (int i=0; i<vertexCount; i++) 
    HeyaldaPoint v = GLpolygon.dynamicVerts[i];
    HeyaldaPoint vt;

    HeyaldaPoint newPoint;

    // translate for new origin
    v.x = v.x + xOrigin;
    v.y = v.y + yOrigin;
    v.z = v.z + zOrigin;

    newPoint.x = (Final_Matrix[0][0] * v.x) + (Final_Matrix[0][1] * v.y) + (Final_Matrix[0][2] * v.z);
    newPoint.y = (Final_Matrix[1][0] * v.x) + (Final_Matrix[1][1] * v.y) + (Final_Matrix[1][2] * v.z);
    newPoint.z = (Final_Matrix[2][0] * v.x) + (Final_Matrix[2][1] * v.y) + (Final_Matrix[2][2] * v.z);

    // translate back to old origin
    newPoint.x = newPoint.x - xOrigin;
    newPoint.y = newPoint.y - yOrigin;
    newPoint.z = newPoint.z - zOrigin;

    GLpolygon.dynamicVerts[i] = newPoint;
  

【问题讨论】:

【参考方案1】:

啊,我太傻了!

我误解了矩阵变换 - 我假设传递一个旋转角度会将形状旋转到那个角度..

相反,它将形状旋转该角度。所以如果我以角度 = 10 旋转形状,它会将形状旋转 10 度。它不会将其旋转到 10 度。

为了设置我们旋转的原点,我需要反转平移数学(将其设置为负) -

// translate for new origin
v.x = v.x - xOrigin;
v.y = v.y - yOrigin;
v.z = v.z - zOrigin;

// translate back to old origin
newPoint.x = newPoint.x + xOrigin;
newPoint.y = newPoint.y + yOrigin;
newPoint.z = newPoint.z + zOrigin;

而且 - 需要在所有三个坐标中设置原点 -

float xOrigin = 150;
float yOrigin = 150;
float zOrigin = 150;

【讨论】:

以上是关于3d 矩阵旋转 - 对象奇怪地旋转的主要内容,如果未能解决你的问题,请参考以下文章

如何在 3D 中围绕同一个枢轴/点旋转多个对象?

使用 Sceneform 生态系统有问题地旋转 3D 模型

如何使用现代 OpenGL 的 GLM 或 JOML 矩阵正确转换(平移、旋转、缩放)对象

3D可旋转粒子矩阵

3D可旋转粒子矩阵

根据 3D 对象的位置旋转相机