gpt4 book ai didi

math - 同一平面内具有相同原点的两个 3D 向量之间的符号角

转载 作者:行者123 更新时间:2023-12-03 06:01:25 25 4
gpt4 key购买 nike

我需要的是位于同一 3D 平面内且具有相同原点的两个向量 Va 和 Vb 之间的有符号旋转角,知道:

  1. 包含两个向量的平面是任意的,并且不平行于 XY 或任何其他基本平面
  2. Vn - 是平面法线
  3. 两个向量与法线具有相同的原点 O = { 0, 0, 0 }
  4. Va - 是测量 Vn 处左手旋转的引用

应该以这样的方式测量角度,因此如果平面是 XY 平面,则 Va 将代表它的 X 轴单位向量。

我想我应该通过使用 Va 作为 X 轴和 Vb 和 Vn 的叉积作为 Y 轴来执行一种坐标空间转换,然后只使用一些 2d 方法,例如 atan2() 或其他方法。有任何想法吗?公式?

最佳答案

这里似乎缺少我当前使用的解决方案。假设平面法线已标准化 (|Vn| == 1),则带符号的角度很简单:

对于从 Va 到 Vb 的右手旋转:

atan2((Va x Vb) . Vn, Va . Vb)

对于从 Va 到 Vb 的左手旋转:

atan2((Vb x Va) . Vn, Va . Vb)

它返回 [-PI, +PI] 范围内的角度(或任何可用的 atan2 实现返回的值)。

.x 分别是点积和叉积。

无需显式分支,也无需计算除法/向量长度。

解释其原理:设 alpha 为向量之间的直角(0° 到 180°),beta 为我们要查找的角度(0° 到 360°),其中 beta == alphabeta == 360° - alpha

Va . Vb == |Va| * |Vb| * cos(alpha)    (by definition) 
== |Va| * |Vb| * cos(beta) (cos(alpha) == cos(-alpha) == cos(360° - alpha)


Va x Vb == |Va| * |Vb| * sin(alpha) * n1
(by definition; n1 is a unit vector perpendicular to Va and Vb with
orientation matching the right-hand rule)

Therefore (again assuming Vn is normalized):
n1 . Vn == 1 when beta < 180
n1 . Vn == -1 when beta > 180

==> (Va x Vb) . Vn == |Va| * |Vb| * sin(beta)

终于

tan(beta) = sin(beta) / cos(beta) == ((Va x Vb) . Vn) / (Va . Vb)

关于math - 同一平面内具有相同原点的两个 3D 向量之间的符号角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5188561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com