OpenGL:切换和反转轴

问题描述 投票:0回答:1

我正在使用陀螺仪并获得我将用于在SceneKit上旋转对象的rotationMatrix。

来自陀螺仪的旋转矩阵使用iPhone的轴:

enter image description here

但我的应用程序使用左侧的主页按钮工作。所以,我的轴是:

  • x = iphone的Y.
  • y =负iphone的X.
  • z = iphone的Z.

所以,我需要从基于[x,y,z]的加速度计获取旋转矩阵并创建一个新的[y,-x,-z] ...(是的,负Z因为对于这种特殊情况,我需要对象旋转Z)。

好吧,让它旋转负片很容易但是如何将X轴和Y轴从原始矩阵切换到新矩阵呢?

这是我到目前为止:

// I create a GLKMatrix4 from the CMRotationMatrix

GLKMatrix4 transform = GLKMatrix4Make(rotMatrix.m11, rotMatrix.m21, rotMatrix.m31, 0.0,
                                      rotMatrix.m12, rotMatrix.m22, rotMatrix.m32, 0.0,
                                      rotMatrix.m13, rotMatrix.m23, rotMatrix.m33, 0.0,
                                      0.0, 0.0,  0.0, 1.0);

GLKMatrix4 negativeX = GLKMatrix4MakeXRotation(-M_PI);
GLKMatrix4 rotate = GLKMatrix4Multiply(transform, negativeX);


GLKMatrix4 negativeZ = GLKMatrix4MakeZRotation(-M_PI);
rotate = GLKMatrix4Multiply(rotate, negativeZ);

// ok, now I have [-x, y, -z]
// how do I switch X and Y and transform that into [y, -x, -z]?
iphone opengl-es rotational-matrices
1个回答
1
投票

3x3矩阵(例如旋转矩阵)应用于:

[a b c] [x]    [a*x + b*y + c*z]    x * (a, e, i) +
[e f g] [y]  = [e*x + f*y + g*z] =  y * (b, f, j) +
[i j k] [z]    [i*x + j*y + k*z]    z * (c, g, z)

即它实际上是三个向量。在你的rotMatrix中,(m11, m12, m13)是向量,它告诉你变换的x轴将采用的方向,(m21, m22, m23)是y,而(m31, m32, m33)是z。

如果您当前用于x向量的是您实际想要用于y值的内容,则只需交换列。如果要取消一个轴,只需取消列。

© www.soinside.com 2019 - 2024. All rights reserved.