旋转轴重映射?

Posted

技术标签:

【中文标题】旋转轴重映射?【英文标题】:Rotation Axis Remap? 【发布时间】:2011-10-11 08:42:37 【问题描述】:

我正在使用跟踪设备(仅跟踪旋转,而不是位置)作为输入,并将其旋转矩阵发送到 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

【问题讨论】:

你是右乘还是左乘跟踪器?尝试切换矩阵乘法操作数。 你的意思是在你写glRotatef(degree, axis)之后你得到了错误的旋转,或者当你手动计算变换矩阵时你得到了错误? Shahbaz:我只是将跟踪器的矩阵按原样传递给 OpenGL(通过着色器)。如果你看图,当设备绕它的 z 轴旋转时,我应用矩阵的 opengl 对象会以不同的方式旋转。 @Jubei 所以你手动计算矩阵?尝试在您的 OpenGL 程序中发送此矩阵: [1 0 0 0; 0 cos_a -sin_a,0; 0 sin_a cos_a 0; 0 0 0 1] 具有不断增加的 alpha。它仍然旋转错误吗? 不,它不会旋转错误。即使使用我的跟踪器矩阵,它也不会“错误”旋转。当我的跟踪器围绕 Z 旋转时,openGL 围绕其 Z 轴旋转。没有错,符合预期,但并不如预期。我需要重新映射轴! @datenwolf 我这样复制:modelMatrix = AxisChangeMatrix*TrackerMatrix; 【参考方案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));

我不知道它为什么起作用,但它起作用了。

【讨论】:

【参考方案2】:

我认为您应该尝试使用四元数计算,因为跟踪器可能会沿其当前(“瞬间”)轴旋转。所以,我认为最终的旋转将是跟踪器所做的所有旋转的总结。

或者我只是没有理解你的“跟踪器”终点的含义=)

【讨论】:

跟踪器是以绝对方式被跟踪的,而不是相对的。因此,当我将跟踪器指向显示器时(即,将其与图中右侧的轴对齐),跟踪器认为它的 y 轴朝下。 想象一下一个输入设备,它通过电缆与计算机通信,只向您发送 9 个浮点数(一个旋转矩阵)。【参考方案3】:

从 cmets 中,我了解到您得到了正确的旋转矩阵,但您希望旋转发生在另一个轴上。例如,您的矩阵围绕 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]);

【讨论】:

一个旋转矩阵包含所有 3 个旋转,大约 x y 和 z。因此,恐怕您的答案不适用于重新映射现有矩阵:( 据我所知,没有简单的方法可以改变现有的矩阵。但是等一下,我以为你构造了矩阵,所以我解释了如何改变构造。所以你只是已经建立了转换矩阵?

以上是关于旋转轴重映射?的主要内容,如果未能解决你的问题,请参考以下文章

指数映射

Android View 通过平移旋转缩放后,顶点映射

Android View 通过平移旋转缩放后,顶点映射

Android View 通过平移旋转缩放后,顶点映射

旋转纹理时如何消除失真

图像旋转中原图16×16分块测试2,映射后插入图中,测试边界信息