旋转轴重新映射?

时间:2011-10-11 08:42:38

标签: opengl matrix graphics rotation

我正在使用跟踪设备(仅跟踪旋转,而不是位置)进行输入,我将其旋转矩阵发送到OpenGL应用程序。当跟踪器与其轴系统对齐时,即当跟踪器面向其Y轴并且跟踪器的向上方向面向其Z轴时,跟踪器发送一个单位矩阵。如图中右侧所示。

Axis Systems Diagram

但是,如果我旋转跟踪器,我的opengl程序中的相应旋转是错误的。试图纠正我试图将跟踪器提供的矩阵乘以:

  1  0  0  0
  0  0  1  0
  0 -1  0  0
  0  0  0  1 

要重新映射,但无论我尝试什么,似乎总是三个旋转中的一个是错误的。

是否有一些矩阵能够使我的跟踪器矩阵与旋转相乘?

=====编辑=====

Android的remapCoordinateSystem似乎实现了我想要的但我无法理解其中的代码: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/hardware/SensorManager.java#L1459

3 个答案:

答案 0 :(得分:1)

以下内容有助于将矩阵转换为使用OpenGL正常工作。

//orientation is the tracker's rotation matrix
orientation = glm::rotate(orientation, glm::degrees((float)M_PI/2),vec3(1,0,0));
orientation = glm::inverse(orientation);
orientation = glm::rotate(orientation, glm::degrees((float)M_PI/2),vec3(1,0,0));

我不知道它为什么有用,但它确实有效。

答案 1 :(得分:0)

我认为你应该尝试使用四元数计算,因为跟踪器可能会沿着它的当前轴(“摩尔(Momental)”这样的轴旋转。因此,最终轮换将是跟踪器所做的所有轮换的总结,我认为。

或者我只是没有明白你的"跟踪器" terminus =)

答案 2 :(得分:0)

从评论中,我理解的是你得到了正确的旋转矩阵,但是你希望旋转发生在另一个轴上。例如,您的矩阵围绕z旋转,但您希望它围绕x。

要做到这一点,你有很多方法。

首先要做的就是旋转。例如,如果从您的设备获得旋转应该在z附近,但是在您的程序中,您希望将其映射到x,而不是围绕z旋转,将其旋转到x!像

这样的东西
glRotatef(rot_z, 1, 0, 0);

所以如果你得到的数据是这样的:

data[] = {data_about_x, data_about_y, data_about_z}
你会得到一张这样的地图:

data_map[] = {2, 0, 1}

旋转时你写:

glRotatef(data[data_map[0]], 1, 0, 0)

或者,您可以反过来使用地图,这可能对您更有意义:

axis_map[][3] = {{0, 1, 0}, {0, 0, 1}, {1, 0, 0}}

然后写:

glRotatef(data[2], axis_map[2][0], axis_map[2][1], axis_map[2][2]);