【问题标题】:How to know that object has been rotated only in 15 degree chunks in 3D?如何知道该对象仅在 3D 中旋转了 15 度块?
【发布时间】:2011-09-26 00:14:09
【问题描述】:

我在 3D 空间中有一个 3D 对象,该对象以某个方向定向。我怎么知道它已经从它的初始旋转 q(欧拉角:0、0、0)只在任何轴上任意旋转了 15 度。例如,X 轴旋转 4*15 度,Y 轴旋转 7*15 度,Z 轴旋转 13*15 度。我怎样才能检测到这一点?

我试图从对象的旋转矩阵中获取欧拉角,但它似乎只有在我只在一个轴上旋转时才能正确检测到这种情况。如果我开始混合 X、Y 和 Z 轴 15 度旋转,欧拉角就会变得混乱。

我 100% 确定对象仅旋转了 15 度。

【问题讨论】:

  • 我很确定 any 旋转矩阵任意接近沿坐标轴旋转 15° 的乘积。您能否提供一些有关该问题的背景信息,以便我们可以引导您走向不同的道路?
  • 不,不是。 360 可以被 15 整除。
  • @iosiki:没关系。如果先旋转 15°X,然后旋转 15°Y,再旋转 15°Z,您会得到一个既不是围绕 X 也不是围绕 Y 也不是围绕 Z 的旋转。让我们将此旋转称为 XYZ。现在我声明,如果你进行任何旋转,就会有一个任意接近它的“单词”(例如 XXYZYYZYXYYZ)。实际上,我很确定我的陈述是正确的,这类似于产生 Banach-Tarski 悖论的论点。正如你所说,在 2D 中这是错误的。
  • @ioski:如果你能找到两个词(比如 A=XYZ 和 B=XZY,这应该可以工作),它们代表围绕两个独立轴的 非理性角度 的两个旋转,那么我的陈述是正确的(例如参见irregularwebcomic.net/2339.html
  • 我们通过执行 24*X (24*15 = 360)、执行 24*Y 和执行 24*Z 来开始旋转。我们不应该通过任意顺序执行 24*X + 24*Y + 24*Z 来开始旋转吗?现在,我想检测是否可以通过该公式形成任意旋转。

标签: c++ math object 3d rotation


【解决方案1】:

我相信,旋转矩阵只能分解为四元数,而不能分解为每轴旋转。

【讨论】:

    【解决方案2】:

    我不确定您使用的是什么数学库,但是,如果提供,您可以使用四元数,这将非常简单地实现您想要的功能。之后可以将它们转换为旋转矩阵。

    【讨论】:

    • 我的旋转也存储为四元数。我该怎么做?
    【解决方案3】:

    如果可以,最简单的方法是存储组件 (float3 m_Translation, m_Rotation, m_Scale) 和一个矩阵,该矩阵在它们更改时更新 (float4x4 m_Matrix)。要获取数据,只需获取该部分的向量并将其返回。内存使用量很小(12-16 个浮点数),计算开销最小(更新部分时重新计算矩阵)。

    但是,如果无法做到这一点,Google 建议您可以通过一些工作来分解旋转矩阵like so。它确实需要大量的数学运算。

    如该页所述,D3DX 库还具有分解矩阵的功能:D3DXMatrixDecompose

    【讨论】:

    • 您指向的链接不会分解旋转矩阵。它将任意矩阵分解为一个旋转矩阵乘以其他东西。
    • 好的,所以您更改了链接。但是,它只会捕获以特定顺序组成旋转的情况。它会抓住例如。 XYYZ,但不是 XZYY。
    • 我没有更改链接,我只是删除了(有些误导性的)维基百科链接,并使有用的链接更加明显(它已经存在)。
    【解决方案4】:

    旋转不是可交换的,因此如果您不知道正确的顺序,用欧拉角来描述它们是有问题的。如果您知道顺序,您可以建立一个方程系统,其中一侧是三个旋转矩阵(由旋转角度参数化)的乘积,另一侧是最终的旋转矩阵。给你三个方程和三个未知数。但要注意欧拉角表示中的奇点!

    【讨论】:

    • 其实,如果你知道顺序,@peachykeen 的回答会给你一个实现的链接。
    猜你喜欢
    • 2013-10-03
    • 2010-11-22
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    相关资源
    最近更新 更多