如何相对于局部或全局轴旋转 OpenGL 中的对象

How to rotate objects in OpenGL relative to local or global axes

我问的问题已经被问过一百万次了,但在浏览了这些并求助于其他网站后,我仍然没有找到好的答案:

How to rotate a graphic over global axes, and not to local axes?

rotating objects in opengl

How to rotate vertices exactly like with glRotatef() in OpenGL?

Rotate object about 3 axes in OpenGL

Rotate an object on its own axes in OpenGL

Is it possible to rotate an object around its own axis and not around the base coordinate's axis?

OpenGL Rotation - Local vs Global Axes

任务比较简单,我在做一个板载加速度计和陀螺仪的传感器模块,需要显示旋转。

我有一个 STL 格式的对象的 3D 模型,我制作了一个 STL 解析器,我可以很好地可视化对象。

当我尝试旋转它时,我得到了各种奇怪的结果。

我正在使用 SharpGL(场景组件)。

我尝试编写一个 "effect"(目前)由 3 个独立的轨迹栏控制,但这将是来自传感器的数据。

我想把它作为一种效果,因为(理论上)我可以在场景中有更多的对象,我只需要旋转一个特定的对象(也出于教育目的,因为我对 OpenGL 比较陌生)。

我尝试使用四元数旋转对象,将它们相乘并生成旋转矩阵,然后应用 gl.MultMatrix(transformMatrix.AsColumnMajorArray)

我也尝试了 gl.Rotate(angleX, 1, 0, 0)(Y 轴和 Z 轴也类似)。

根据四元数乘法或 gl.Rotate(...) 语句的顺序,我会让对象绕局部轴旋转(第一个),一些奇怪的东西(第二个),以及 "world" 第三个。例如,如果我用四元数 qX*qY*qZ 做它并从中得到旋转矩阵,我会得到(我认为)关于局部 X、"arbitrary" Y 和世界 Z 轴的旋转。

我无法理解的部分是,当我在轨迹栏的 Scroll 事件中应用 gl.Rotate(dx, 1, 0, 0)(以及其他 Y 和 Z 旋转)时,整个场景围绕 X、Y 和Z 轴并按此顺序,完全按照我的预期进行旋转。

我对这种方法的唯一问题是整个场景都在旋转。所以如果我(假设地)想在物体周围画一个房间,整个房间也会旋转,这不是我想要的。

我会 post 请求任何代码,但我觉得太多了,而且上述链接的代码与我的相似。

在一天结束时,我希望我的对象(Polygon 在 SharpGL 术语中)绕其自身的轴旋转(或绕 "world" 轴旋转,但要保持一致)。

编辑:

我已将项目放入我的保管箱:https://goo.gl/1LzNhn

如果有人想看,任何帮助将不胜感激。

MainForm中,TbRotXYZScroll函数有trackbar代码,而Rotation class是问题所在(我认为是这样)。

按顺序将 X、Y 和 Z 旋转 45 度。一切似乎都很好。现在将 X、Y 和 Z 进一步旋转 30 度左右,尝试想象旋转时围绕哪个轴发生旋转...
X 似乎总是世界,Z 似乎总是本地,而 Y 介于两者之间(改变旋转顺序会改变这一点)。

进入 TbRotXYZScroll 函数并将方法更改为 2 可以实现我想要的效果(除了整个场景的旋转)。试过四元数,它们产生完全相同的结果,所以 我一定是做错了什么...
将其更改为 1 会产生类似的结果,但这是将旋转单独应用于多边形(而不是渲染的内容,因为它也包括局部坐标轴)。

At the end of the day, I want my object (Polygon in SharpGL terms) to rotate about its own axes (or about the "world" axes, but be consistent).

我认为 this answer 你提出的问题在某种程度上解释了这种情况。为了围绕对象轴执行旋转:

1. 对您的对象执行Translation/Rotation 并使对象轴与其中一个基轴(x、y 或z)重叠

2. 执行轮换

3. 将对象恢复到原来的位置。 (只需还原步骤 1 中的 translation/rotations)

注意:在执行此操作时,您应该考虑的一件事是 openGL 从相反的顺序应用转换。

示例:

glRotatef(90,1,0,0); 
glTranslatef(-5,-10,5); 
drawMyObject();

在这种情况下,opengl 将首先平移您的对象,然后进行旋转。因此,在编写转换时请考虑这一点。这里 my answer 可能会给你一个想法。