首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >旋转轴重新映射?

旋转轴重新映射?
EN

Stack Overflow用户
提问于 2011-10-11 16:42:38
回答 3查看 1.8K关注 0票数 1

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

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

代码语言:javascript
复制
  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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-17 20:06:34

下面的代码对矩阵进行了转换,以便与OpenGL一起正常工作。

代码语言:javascript
复制
//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
EN

Stack Overflow用户

发布于 2011-10-11 16:59:10

我认为你应该尝试使用四元数计算,因为跟踪器可能会沿着当前(‘矩’轴)旋转。所以,我认为,最后的旋转应该是跟踪器所做的所有旋转的汇总。

或者我只是不明白你的“追踪器”终端的意思=)

票数 0
EN

Stack Overflow用户

发布于 2011-10-12 21:52:44

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

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

一是从一开始就做好旋转。例如,如果你从你的设备上得到的旋转应该是围绕z的,但是在你的程序中你想将它映射到x,那么不是围绕z旋转,而是围绕x旋转!!就像这样

代码语言:javascript
复制
glRotatef(rot_z, 1, 0, 0);

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

代码语言:javascript
复制
data[] = {data_about_x, data_about_y, data_about_z}

您将拥有如下所示的地图:

代码语言:javascript
复制
data_map[] = {2, 0, 1}

当旋转时,你写道:

代码语言:javascript
复制
glRotatef(data[data_map[0]], 1, 0, 0)

或者,您可以使用另一种方法,这对您来说可能更有意义:

代码语言:javascript
复制
axis_map[][3] = {{0, 1, 0}, {0, 0, 1}, {1, 0, 0}}

然后写下:

代码语言:javascript
复制
glRotatef(data[2], axis_map[2][0], axis_map[2][1], axis_map[2][2]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7723392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档