0

我问了一个以前被问过一百万次的问题,但是在经历了这些并且还求助于其他网站之后,我仍然没有找到一个好的答案:

如何在全局轴上旋转图形,而不是局部轴?

在opengl中旋转物体

如何像OpenGL中的glRotatef()一样旋转顶点?

在OpenGL中围绕3轴旋转对象

在OpenGL中在自己的轴上旋转对象

是否可以围绕自己的轴而不是围绕基本坐标的轴旋转对象?

OpenGL 旋转 - 局部与全局轴

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

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

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

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

我试图编写一个(目前)由 3 个单独的轨迹栏控制的“效果”,但这将是来自传感器的数据。

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

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

我也尝试过gl.Rotate(angleX, 1, 0, 0)(对于 Y 轴和 Z 轴也是类似的)。

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

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

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

我会发布任何要求的代码,但我觉得太多了,上述链接的代码与我所拥有的相似。

归根结底,我希望我的对象(Polygon用 SharpGL 术语)围绕它自己的轴(或围绕“世界”轴,但要保持一致)旋转。

编辑:

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

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

在 中MainForm,TbRotXYZScroll 函数具有轨迹条代码,而 Rotation 类是问题所在(或者我认为)。

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

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

4

1 回答 1

1

归根结底,我希望我的对象(SharpGL 术语中的多边形)围绕它自己的轴(或围绕“世界”轴,但要保持一致)旋转。

我认为您在问题中提出的这个答案以某种方式解释了这种情况。为了围绕对象轴执行旋转:

1.对您的对象执行平移/旋转并使对象轴与基轴之一重叠(x,y或z)

2.执行你的轮换

3.将您的对象恢复到其原始位置。(只需在第 1 步还原平移/旋转)

注意:在这样做时,您应该考虑的一件事是 openGL 从相反的顺序应用转换。

例子 :

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

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

于 2015-05-06T23:27:11.320 回答