【问题标题】:How to rotate objects in OpenGL relative to local or global axes如何在 OpenGL 中相对于局部或全局轴旋转对象
【发布时间】:2015-07-17 06:36:18
【问题描述】:

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

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(场景组件)。

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

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

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

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

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

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

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

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

在一天结束时,我希望我的对象(SharpGL 术语中的Polygon)围绕它自己的轴(或围绕“世界”轴,但要保持一致)旋转。

编辑:

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

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

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

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

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

【问题讨论】:

    标签: c# opengl quaternions rotational-matrices sharpgl


    【解决方案1】:

    在一天结束时,我希望我的对象(SharpGL 术语中的多边形) 围绕它自己的轴旋转(或围绕“世界”轴旋转,但 一致)。

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

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

    2. 进行轮换

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

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

    示例:

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

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

    【讨论】:

    • 翻译不是问题,因为我的对象位于世界原点(除非我严重误解了某些东西)。尽管该原点不在对象的中心,但对象位于第一个八分圆(其中 X、Y 和 Z 均 >0)。平移它使对象的几何中心与原点对齐会改变旋转点,但不会影响原始问题。
    • 感谢 Cagkan,仔细阅读您的第 1 点让我朝着正确的方向前进。
    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 2012-08-05
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多