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

时间:2014-08-02 01:19:04

标签: ios matrix 3d rotation

我正在尝试使用旋转矩阵来围绕其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 个答案:

答案 0 :(得分:0)

Aah傻傻的我!

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

相反,它会旋转形状BY角度。所以如果我用角度= 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;