【发布时间】:2015-07-17 06:36:18
【问题描述】:
我问了一个之前已经被问过一百万次的问题,但是在浏览了这些并求助于其他网站之后,我仍然没有找到一个好的答案:
How to rotate a graphic over global axes, and not to local axes?
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