Delphi 全局旋转

Delphi 全局旋转,delphi,opengl,quaternions,euler-angles,glscene,Delphi,Opengl,Quaternions,Euler Angles,Glscene,在中,我们有三个参数(滚转角、俯仰角和转角)用于绕局部方向旋转。在下图中,如何围绕全局方向(橙色轴)旋转立方体 您需要将轴角度旋转转换为Euler角度。这里有一个链接,用代码详细解释了这个过程: 从文章中: yaw = atan2(y * sin(angle)- x * z * (1 - cos(angle)) , 1 - (y2 + z2 ) * (1 - cos(angle))) pitch = asin(x * y * (1 - cos(an

在中,我们有三个参数(滚转角、俯仰角和转角)用于绕局部方向旋转。在下图中,如何围绕全局方向(橙色轴)旋转立方体


您需要将轴角度旋转转换为Euler角度。这里有一个链接,用代码详细解释了这个过程:

从文章中:

yaw   = atan2(y * sin(angle)- x * z * (1 - cos(angle)) 
                , 1 - (y2 + z2 ) * (1 - cos(angle)))   

pitch = asin(x * y * (1 - cos(angle)) + z * sin(angle))   

roll  = atan2(x * sin(angle)-y * z * (1 - cos(angle)) 
             , 1 - (x2 + z2) * (1 - cos(angle)))

编辑:重命名变量以符合俯仰、偏航和滚动命名约定。

这是一个肮脏的欺骗,但如果对象位于原点(0,0,0),并且场景中只有一个对象,则可以围绕对象旋转摄影机(和光源),而不是旋转对象

也许您可以使用“DummyCube”对象作为父对象。然后你可以先旋转虚拟立方体中的立方体,然后旋转虚拟立方体。

像这样的屏幕截图,我别无选择,只能向上投票:)
@Wouter van Nifterick
对不起,我不明白你的意思,你是什么意思?GLScene是什么?通常我会说简单地做glRotatef(角度,rot_轴.x,rot_轴.y,rot_轴.z)或一些等价的变换。你的问题不清楚。你不能绕着一个方向旋转。围绕一个点以特定方向旋转。你们还并没有指定你们对欧拉角使用什么约定,尽管这可能是GLScene中隐含的。是的,你们说得对,我修改了图片。请检查一下。据我所知,我们应该在局部定向和全局定向之间进行一些转换。是的,你说得对。但我想知道如何使用数学算法使物体围绕全局方向旋转。我想我应该用欧拉角。但是怎么…@Mikola,我查过你建议的网站了。我想下面的代码就是你的意思:
heading=atan2(y*sin(angle)-x*z*(1-cos(angle)),1-(y2+z2)*(1-cos(angle))
--
姿态=asin(x*y*(1-cos(angle))+z*sin(angle))
--
bank=atan2(x*sin(angle)-y*z*(1-cos(angle)),1-(x2+z2)*(angle)))
@Ata:网站上有解释。完整的推导有点复杂,但是如果你知道你的trig,就相当简单了。这段代码要做的是取一个由(x,y,z,angle)表示的轴角,并将其转换为欧拉角@Mikola,1。x,y和z是什么?这些变量应该赋予什么属性?2.“角度”是我想绕着全局方向旋转的角度吗?把它们看作是你的旋转轴沿偏航、俯仰和转弯方向的‘组件’。角度是围绕该轴旋转的量。所有这些都在我链接的第二个网站上讨论过,或者你也可以在维基百科上阅读更多内容: