【问题标题】:Global Rotation全球旋转
【发布时间】:2011-06-22 16:20:50
【问题描述】:

GLScene 中,我们有三个参数(RollAngle、PitchAngle 和 TurnAngle)用于围绕局部方向旋转。在下图中,如何围绕全局方向(橙色轴)旋转立方体?

【问题讨论】:

  • 这样的截图让我别无选择,只能投票赞成这个问题:)
  • @Wouter van Nifterick 对不起,我不明白你的意思,你是什么意思?
  • 什么是 GLScene?通常我会说简单地做 glRotatef(angle, rot_axis.x, rot_axis.y, rot_axis.z) 或一些等效的转换。
  • 你的问题不清楚。你不会围绕一个方向旋转。你围绕一个点,在一个特定的方向旋转。而且您还没有指定欧拉角使用的约定,尽管这可能在 GLScene 中隐含。
  • 是的,你说得对,我修改了图片。请检查一下。

标签: delphi opengl quaternions euler-angles glscene


【解决方案1】:

您需要将轴角旋转转换为欧拉角。下面是一个链接,用代码详细解释了这个过程:
http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToEuler/index.htm

来自文章:

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)))

编辑:将变量重命名为与俯仰、偏航、滚动命名约定一致。

【讨论】:

  • @Mikola,我检查了您建议的网站。我认为下面的代码就是你的意思:heading = atan2(y * sin(angle)- x * z * (1 - cos(angle)) , 1 - (y2 + z2 ) * (1 - cos(angle))) --- attitude = asin(x * y * (1 - cos(angle)) + z * sin(angle))--- bank = atan2(x * sin(angle)-y * z * (1 - cos(angle)) , 1 - (x2 + z2) * (1 - cos(angle)))
  • @Ata:网站上有说明。完整的推导有点复杂,但如果你知道你的三角函数就相当简单了。这段代码要做的是取一个由 (x, y, z, angle) 表示的轴角并将其转换为欧拉角,euclideanspace.com/maths/geometry/rotations/euler/index.htm
  • @Mikola,1. x、y 和 z 是什么?我应该将什么归因于这些变量? 2.“角度”是我想围绕全局方向旋转的角度吗?
  • 将它们视为您的旋转轴沿偏航、俯仰和转弯方向的“组件”。角度是您围绕该轴旋转的量。所有这些都在我链接的第二个网站上进行了讨论,或者您也可以在维基百科上阅读更多内容:en.wikipedia.org/wiki/Rotation_representation_(mathematics)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是一个肮脏的作弊,但如果对象在原点 (0,0,0) 并且场景中只有一个对象,您可以围绕对象摆动相机(和光源)而不是旋转物体。

    【讨论】:

    • 据我所知,我们应该在局部方向和全局方向之间进行一些转换。是的,你是对的。但我想知道如何使用数学算法来围绕全局方向旋转对象。我想我应该使用欧拉角。但是如何...
    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 2019-05-03
    • 2018-04-18
    • 2014-07-18
    • 2013-12-05
    • 1970-01-01
    • 2014-02-02
    • 2014-12-24
    相关资源
    最近更新 更多