【问题标题】:Make an object rotate around a global axis Directx使对象围绕全局轴 Directx 旋转
【发布时间】:2014-11-29 15:35:35
【问题描述】:

我正在尝试围绕全局 y 轴旋转对象(无论当前方向是什么,基本上都围绕 0,1,0 偏航)。我会展示一张图片,但声誉......我想围绕全局轴而不是对象本地轴旋转偏航。例如,如果我通过俯仰稍微倾斜一个盒子,然后尝试旋转偏航,它会以倾斜的角度旋转盒子,而不是直线旋转,就好像盒子根本没有倾斜一样。

每个对象都将其位置和旋转存储在一个矩阵中,该矩阵在每次更新调用时都会更新。旋转的代码如下所示:

D3DXMatrixRotationYawPitchRoll(&rotation, yaw, pitch, roll);
D3DXMatrixMultiply(&position, &rotation, &position);

其中位置是每次更新都会平移和旋转的出色矩阵。这是在本地旋转它的原因,但我想通过全局轴旋转偏航。

如何写才能完成偏航旋转,就好像局部上向量是(0,1,0),即使倾斜?

【问题讨论】:

    标签: c++ matrix rotation directx axis


    【解决方案1】:

    解决了这个问题。决定存储前一帧的旧值以重建位置矩阵。

    我现在根据当前帧的变化构建一个矩阵,完成平移和旋转,然后在创建最终矩阵之前将这些值添加到总值中。

    像魅力一样工作!

    【讨论】:

      【解决方案2】:

      在下面的代码中有两个旋转矩阵,A 和 B。一个是由 worldYaw 绕局部轴旋转,另一个是由 worldYaw 绕全局轴旋转。

      D3DXMatrixRotationYawPitchRoll(&rotation, yaw, pitch, roll);
      D3DXMatrixRotationYawPitchRoll(&worldRotation, worldYaw, 0, 0);
      D3DXMatrixMultiply(&A, &rotation, &worldRotation);
      D3DXMatrixMultiply(&B, &worldRotation, &rotation);
      

      如果 D3D 使用行向量或列向量,我永远无法记住它,所以我不能说 A 或 B 是你要找的 :)

      【讨论】:

      • Direct3D 历来使用左手行主矩阵。 XNA Game Studio 和 DirectX Tool Kit SimpleMath 类使用左手行主矩阵。 DirectXMath 可以支持左手或右手行主矩阵。已弃用的 D3DX 数学库使用左手、行优先。
      • 这是在做同样的事情:/我不希望像立方体围绕行星运行一样围绕世界原点进行旋转。基本上我希望它假装局部上轴总是(0,1,0)而不是在做了一些俯仰之后倾斜。
      猜你喜欢
      • 2017-02-10
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 2018-05-20
      • 2015-07-14
      相关资源
      最近更新 更多