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

但是,如果我旋转跟踪器,opengl程序中相应的旋转是错误的。为了纠正我试图将跟踪器提供的矩阵乘以:
1 0 0 0
0 0 1 0
0 -1 0 0
0 0 0 1 为了重新映射,但无论我怎么尝试,似乎总是三个旋转中的一个是错误的。
有没有一些矩阵可以用来乘以我的跟踪器的矩阵,以获得正确的旋转?
=====编辑=====
安卓的remapCoordinateSystem似乎实现了我想要的功能,但我不能理解其中的代码:https://github.com/android/platform_frameworks_base/blob/master/core/java/android/hardware/SensorManager.java#L1459
发布于 2011-10-17 20:06:34
下面的代码对矩阵进行了转换,以便与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));我不知道为什么它起作用了,但它起作用了。
发布于 2011-10-11 16:59:10
我认为你应该尝试使用四元数计算,因为跟踪器可能会沿着当前(‘矩’轴)旋转。所以,我认为,最后的旋转应该是跟踪器所做的所有旋转的汇总。
或者我只是不明白你的“追踪器”终端的意思=)
发布于 2011-10-12 21:52:44
从评论中,我理解的是你得到了正确的旋转矩阵,但你希望旋转发生在另一个轴上。例如,矩阵围绕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]);https://stackoverflow.com/questions/7723392
复制相似问题