矩阵旋转多次

时间:2014-10-21 02:37:26

标签: opengl matrix rotation

我在理解矩阵时遇到了问题。如果我将矩阵绕X轴旋转90度,它可以正常工作,但是,如果我将它围绕Y轴旋转90度,它实际上会在Z轴上旋转它。我想每次旋转后轴会移动。如何使用原始轴旋转第二次(或更多次)?这称为本地和全球轮换吗?

4 个答案:

答案 0 :(得分:1)

你没有“旋转”矩阵。您可以通过乘法应用旋转变换矩阵。是的,每次调用OpenGL矩阵操作函数时,结果都将用作下一次变换乘法的输入。

绕X轴旋转90°会将Y轴映射到Z,Z轴映射到-Y,这是您观察到的。因此,接下来的转变将从此开始。

使用glLoadIdentity重新构建标识,或者使用glPushMatrix / glPopMatrix创建“转换块”的层次结构,重新为每个对象构建整个转换。或者更好的是,完全抛弃OpenGL内置矩阵堆栈,并用适当的矩阵数学库(如GLM,Eigen或类似物)替换它。

答案 1 :(得分:0)

在旋转之间添加'glLoadIdentity'。

答案 2 :(得分:0)

在实践中,克服这个问题的最好方法是使用四元数,这是相当多的数学。你是对的;如果你将它旋转90度左右比你想绕Z旋转它,你将围绕X旋转。

以下是将euler角度转换为四元数的好消息来源:http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToQuaternion/

以下是如何从四元数中制作旋转矩阵: http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/

填写矩阵后,您可以通过调用glMultMatrix( qMatrix);来增加。

答案 3 :(得分:0)

昨晚想到它我找到了答案(我似乎总是这样做......)

我有一个名为GLMatrix的对象,它包含矩阵:

  class GLMatrix {
    public float m[] = new float[16];
    ...includes many methods to deal with matrix...
  }

它有一个添加旋转的功能:

  public void addRotate2(float angle, float ax, float ay, float az) {
    GLMatrix tmp = new GLMatrix();
    tmp.setAA(angle, ax, ay, az);
    mult4x4(tmp);
  }

如您所见,我使用Axis Angles(AA),它使用setAA()应用于临时矩阵,然后乘以当前矩阵。 昨晚我想到如果我用当前矩阵旋转AA的输入向量然后创建临时矩阵和多个。

所以它看起来像这样:

  public void addRotate4(float angle, float ax, float ay, float az) {
    GLMatrix tmp = new GLMatrix();
    GLVector3 vec = new GLVector3();
    vec.v[0] = ax;
    vec.v[1] = ay;
    vec.v[2] = az;
    mult(vec);  //multiple vector by current matrix
    tmp.setAA(angle, vec.v[0], vec.v[1], vec.v[2]);
    mult4x4(tmp);
  }

它按预期工作! addRotate4()函数现在在原始轴上旋转&#es;