我问过一个问题已被问过一百万次,但是在经过这些问题之后我还没有找到一个好的答案,并且还要求其他网站:
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轴的旋转。
我无法理解的部分是当我在轨迹栏的gl.Rotate(dx, 1, 0, 0)
事件中应用Scroll
(和其他Y和Z旋转)时,整个场景围绕X,Y和Z轴旋转并且按照这个顺序,正如我预期的那样发生轮换。
这种方法的唯一问题是整个场景都会旋转。因此,如果我(假设)想在物体周围画一个房间,整个房间也会旋转,这不是我想要的。
我会发布所要求的任何代码,但我觉得有太多,上述链接的代码与我的相似。
在一天结束时,我希望我的对象(以SharpGL术语Polygon
)围绕自己的轴旋转(或围绕“世界”轴旋转,但要保持一致)。
编辑:
我已将项目放在我的保管箱中:https://goo.gl/1LzNhn
如果有人想看一下,我们将非常感谢任何帮助。
在MainForm
中,TbRotXYZScroll函数具有轨迹代码,而Rotation类是问题所在的位置(或者我认为)。
按顺序旋转X,Y和Z 45度。一切似乎都很好。现在将X,Y和Z进一步旋转30度左右,尝试在旋转时可视化旋转发生的轴...
X似乎总是世界,Z似乎总是局部的,而Y介于两者之间(改变旋转顺序会改变这一点)。
进入TbRotXYZScroll函数并将方法更改为2可以实现我想要的(除了整个场景的旋转)。尝试四元数并产生完全相同的结果,因此 我必须做错事 ...
将它更改为1会产生类似的结果,但这只是将旋转应用于多边形(而不是像包含局部坐标轴那样渲染的内容)。
答案 0 :(得分:1)
在一天结束时,我想要我的对象(以SharpGL术语表示的Polygon) 围绕自己的轴旋转(或围绕"世界"轴旋转,但是 一致)。
我认为this answer你提出的问题是以某种方式解释情况。为了围绕对象轴执行旋转:
1。对对象执行平移/旋转,并使对象轴与基轴(x,y或z)之一重叠
2. 执行轮换
3. 将您的对象还原回原来的位置。 (只需在步骤1恢复翻译/轮换)
注意:在执行此操作时,您应该考虑的一件事是从相反的顺序应用转换。
示例:
glRotatef(90,1,0,0);
glTranslatef(-5,-10,5);
drawMyObject();
在这种情况下,opengl将首先翻译您的对象然后旋转。因此,在编写转换时请考虑这一点。这里有my answer可能会给你一个想法。