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