我问了一个以前被问过一百万次的问题,但是在经历了这些并且还求助于其他网站之后,我仍然没有找到一个好的答案:
任务比较简单,我正在做一个带有加速度计和陀螺仪的传感器模块,我需要显示旋转。
我有一个 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 会产生类似的结果,但这只是将旋转应用于多边形(不是渲染的内容,因为它也包括局部坐标轴)。