【问题标题】:3D Math: Calculate Bank (Roll) angle from Look and Up orthogonal vectors3D 数学:从 Look 和 Up 正交向量计算倾斜(滚动)角
【发布时间】:2010-06-17 19:44:38
【问题描述】:

我希望这是提出这个问题的正确位置,即same as this one,但表示为纯数学而不是图形(至少我希望我正确地将问题转换为数学)。

考虑:

  • 两个正交向量:Up (ux, uy, uz) 和 Look (lx, ly, lz)
  • 垂直于 Look 的平面 P(因此包括 Up)
  • Y1 是 Y(垂直轴)沿 Look 到 P 的投影

问题:Y1和Up之间的夹角是多少?

正如数学家会同意的那样,这是一个非常基本的问题,但至少两周来我一直在摸不着头脑,无法想象如何将 Y 投影到 P 上......也许现在太老了,无法找到解决方案学校练习。

我正在寻找三角函数解决方案,而不是使用矩阵的解决方案。谢谢。

编辑:我发现我需要确定角度的符号,相对于必须是 Look 的旋转轴。我在链接的问题上发布了最终代码(请参阅上面的链接)。感谢那些帮助过的人。感谢您的宝贵时间。

【问题讨论】:

  • 我很难想象 Y1 到底是什么,你有一组样本坐标吗?
  • 兰斯,我没有例子。但是想法如下:最初 Look 等于 Z,Up 等于 Y。我将 Look 向上旋转 10°(例如),Y 和 Up 仍然在垂直于 Look 的同一平面中,Y1 等于 Y Y1-Up 角为 10°(坡度角)。如果现在我将 Look-Up 对围绕 X 旋转 10°(俯仰角),Y 不再位于 Look 的计划中,并且我无法测量 Bank 角度(这是我想知道的)。我需要在垂直于 Look 的平面上投影 Y(Y1 是投影)。那么坡度角就是 Y1-Up 角。
  • 我把它画了出来,以为我有,但后来我意识到,在你在评论中给出的例子中,倾斜角最终是相同的 10 度,因为当你旋转X 轴,Up 和 Y1 之间的角度永远不会改变。请提供更多细节。
  • 好的,我知道我需要什么,并给出了你需要的公式。

标签: math 3d euler-angles


【解决方案1】:

我只是在纸上做这件事。我希望它是正确的。

假设 Up 和 Look 是归一化的,即长度为 1。假设平面 P 包含原点,L 是它的法线。 Y 为 (0, 1, 0)

要将Y投影到P上,求它到P的距离...

d = Y dot L = ly

...然后用-d缩放法线得到Y1(即Y在P上的投影)

Y1 = (lx * ly, ly * ly, lz * ly)

现在对 Y1 进行归一化,即按 (1 / 长度) 对其进行缩放。如果它的长度为 0,那么你就不走运了。

Y1 和 Up 的点积 = 角度的余弦。所以

angle = acos(Y1 dot Up)

【讨论】:

  • 德特玛,谢谢。这正是我一直在寻找的答案。汤姆改进了你的答案,但我会优先将你的答案标记为好,因为你先回答了。我希望也可以对 Tom's 进行排名。请参阅我对汤姆的评论,了解解决方案的有效性。非常感谢。有没有我可以参考的页面来学习一些知识并提高我对这个特定解决方案的了解?
【解决方案2】:
  • 两个正交向量:Up (ux, uy, uz) 和 Look (lx, ly, lz)
  • 垂直于 Look 的平面 P(因此包括 Up)
  • Y1 是 Y(垂直轴)沿 Look 到 P 的投影

我假设 Up 和 Look 是单位向量。设 Y=(0,1,0)。
让我们找到 Y1。

Y1 = Y - (Y*Look) * Look Y1 = Y - ly * 看 Y1 = ( -lylx, 1 - lyly, -ly*lz )

请注意,当 Look 为 (0,1,0) 或 (0,-1,0) 时,Y1 将为 (0,0,0)。

就像 Detmar 说的,通过归一化 Y1 并找到 Y1*Up 的 arccos(其中 * 是点积)来找到 Y1 和 Up 之间的角度

【讨论】:

  • 汤姆,非常感谢。我将 Detmar 标记为优先的好答案,但你改进了它,只需将你的答案发布到我的链接问题,我会在这里将你标记为正确答案,给你们两点。该解决方案改进了我的应用程序。我可以转动物体,并且倾斜角度正确地每转两次为零。很好。在 360° 航向转弯期间,仍然存在 180° 错误坡度。我会及时通知你我将做些什么来纠正。我很难说清楚,因为还涉及到惯用手的变化,这对我来说很复杂;-)
  • 请注意,我们的 Y1 公式略有不同。请务必同时尝试!
  • 我使用你的,因为 (1-ly*ly) 在我的情况下更好。我发现我的残余问题是因为当我测量 Y1 和 Up 之间的角度时,这个角度总是正的(这在没有参考旋转轴的情况下是合乎逻辑的),而我需要一个有符号的角度。所以我添加了一个基于 Look、Up 和 Y1 的测试。现在没关系。真的好痛好痛,多亏了各位朋友!我发布了用于链接问题的代码。
【解决方案3】:

这是一个使用向量数学的相对简单的问题。使用equation for vector projection 得到Y1,然后使用trigonometric equation for the dot product 得到Y1 和Up 之间的角度。

这个方程可以很容易地用任何语言自己实现,但如果你问这种问题,你可能打算做更多的重型矢量数学,在这种情况下,我建议尝试找第三方库。

【讨论】:

  • 谢谢。我同意你建议的两个步骤。我正在使用 WPF,并且 Vector3D 有一个 AngleBetween 方法,所以这个操作非常简单。问题只是我无法计算的 Y1 的值。如果我必须沿着 X、Z 轴之一进行投影,我会知道该怎么做,但不会沿着 Look。你不能通过提供 Y1x、Y1y 和 Y1z 的公式来帮助我吗?有人告诉我这是基本的数学,但到目前为止没有人提供神奇的公式。因此,如果您知道,我将不胜感激并为您解答这两个问题。
【解决方案4】:

您需要了解 3D 空间中的向量。我认为对这些产品的基本理解,尤其是点积和交叉积,会让你明白。找一本基本的向量教科书。

两个正交的向量:向上 (ux, uy, uz) 和 Look (lx, ly, lz)

正交向量的点积为零。

一个垂直于 看(因此包括向上)

如果您将 Look 与 Up 相乘,您将得到第三个向量,它与 Up 一起定义垂直于 Look 的平面。

Y1 是 Y 的投影 (垂直轴)沿着看向P

我不知道你在这里得到什么,但是任何带有 Look 的向量的点积都会给你它在 Look 方向上的分量的大小。

【讨论】:

  • 谢谢,我知道他们,至少我知道他们是什么。我也知道什么是四元数或矩阵。但是我仍然不知道如何解决这个三角问题。你呢?
  • 是的,我愿意。我很难相信声称知道四元数和矩阵的人不能解决这样的问题。我觉得不对。
  • 每个人都可以阅读一本关于 3D 数学的书,或者 Martin Baker 的漂亮页面,我已经完成了所有工作,并且在第二天抛出了诸如正交性、交叉乘积或谈论这些聪明的词,但那不是意思是知道如何解决问题。我看不出有什么难以相信的。
【解决方案5】:

如果 Y = (0,1,0) 那么

Y1 = (-lylx, 1 - lyly, -ly*lz)

|Y1| = sqrt(Y1x^2 + Y1y^2 + Y1z^2)

|上| = sqrt(Upx^2 + Upy^2 + Upz^2)

倾斜角 = (Y1xUpx + Y1yUpy + Y1zUpz)/(|Y1||Up|)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多