【问题标题】:calculate vector after rotating it towards another by angle θ in 3D space在 3D 空间中将矢量旋转到另一个角度 θ 后计算矢量
【发布时间】:2014-02-28 15:41:09
【问题描述】:


单位向量 V 和 D 位于 3D 空间上。他们有相同的起点。我想将向量 V 向向量 D 旋转,但只能旋转角度 θ。

鉴于我们知道:

  1. 向量 V 和 D 是单位向量。
  2. 我们知道 V(x,y,z) 和 D(x,y,z)。
  3. 我们知道两个向量 V 和 D 之间的夹角,Δφ。
  4. 我们还知道角度 θ,向量 V 将在该角度旋转以接近向量 D。
  5. 我们知道三个向量的起点“O”。

我们现在要计算向量 Z,它也是一个单位向量。 是否可以根据上面给出的信息计算矢量 Z 的坐标?

你有什么想法可以解决这个问题吗?

【问题讨论】:

  • 一个小问题:对于向量,没有“起点”,所以这不相关。也许您正在考虑一条线段,它确实有起点和终点。
  • 除了@comingstorm 提出的解决方案,另一种选择是使用quaternions,特别是如果你想对多个向量应用相同的旋转。

标签: math vector


【解决方案1】:

您需要做的是在 V 和 D 矢量平面中定义第三个轴,以便从 V 指向该方向旋转 90 度。我将把指向这个方向的单位向量称为 D'。有了这个,你的 Z 向量就很简单了:

Z = cos(theta)*V + sin(theta)*D_tick;

那么如何计算 D'?这也很容易。首先使用叉积计算与 V 和 D 正交的向量。将此称为 W:W = V×D。接下来计算与 W 和 V 正交的向量:D' = W×V = (V×D)×V。这指向正确的方向,但如果你的 V 和 D 是正交的,它只会是一个单位向量。所以归一化:D' = D'/||D'||,其中||D'||是向量 D' 的大小。如果你有一个向量数学包,你可以通过

D_tick = ((V.cross(D)).cross(V)).normalize();

一个警告:如果 ||D'||是零?当且仅当您的 Δφ 是 pi 弧度(或 180 度)的倍数时才会发生这种情况。或者,它发生在 V 和 D 彼此平行或反平行时。在这种特殊情况下,您的问题不合适。您应该检查这种特殊情况。



附录
My (V×D)×V 和comingstorm的D - V*((D·V)/(V·V)) 对于三维空间中的向量是一回事。因为V是单位向量,所以他的D-V*((D·V)/(V·V))简化为D-V(D·V)。 My (V×D)×V 等于 D(V·V)-V(D·V) 每个向量三乘积恒等式 (http://mathworld.wolfram.com/VectorTripleProduct.html),这又简化为 D-V(D·V),因为 V是单位向量。

【讨论】:

  • 我认为您需要将D_tick 缩放length(V) 以获得正确的旋转。
  • @comingstorm - 根据定义,长度(V)是一。 V 是单位向量。
  • 如果这是一个愚蠢的问题,我很抱歉。但是当我计算 Z 时,你的意思是:Zx = cos(theta) * Vx + sin(theta) * D'x Zy = ......
  • 没错。构成“向量”的最基本定义包括两个向量的加法和一个标量的乘法。对于您关心的向量,乘以标量意味着将每个分量乘以该标量,添加两个向量意味着将它们逐个添加。
【解决方案2】:

一种方法是找到垂直于VD 的分量,将其放大到等效长度,然后使用sin()cos() 进行向量求和:

D_perp = D - V * ((D . V)/(V . V))

D_perp_scaled = D_perp * (|V|/|D_perp|)

result = cos(theta) * V + sin(theta) * D_perp_scaled

这是明确定义的,除非DV 平行,这将产生|D_perp| == 0 并导致除法问题。这并不令人惊讶:在这种情况下,您的旋转平面是不明确的——不清楚您应该旋转哪个方向!

在数学上,这种求垂线的方法等同于其他答案中提到的叉积方法cross(cross(V,D),V),但可能更简单一些,适用于任何向量空间(例如,2-D 和 4- D 向量,而不仅仅是 3-D)。

【讨论】:

    【解决方案3】:

    向量 Qcross product V × D 给出。两个 3D 向量的叉积始终垂直于叉积的两个参数。所以这将是旋转轴。在您的情况下,Q 将由以下方式给出:

    <b>Q</b><sub>x</sub> = <b>V</b><sub>y</sub><b>D</b><sub>z</sub> - <b>V</b><sub>z</sub><b>D</b><sub>y</sub><b>Q</b><sub>y</sub> = <b>V</b><sub>z</sub><b>D</b><sub>x</sub> - <b>V</b><sub>x</sub><b>D</b><sub>z</sub><b>Q</b><sub>z</sub> = <b>V</b><sub>x</sub><b>D</b><sub>y</sub> - <b>V</b><sub>y</sub><b>D</b><sub>x</sub>

    请注意,V × D = -D × V 因此可能存在符号问题。此外,Q 通常不是旋转经常需要的单位向量,因此请务必将其除以其大小并使用 Q' = Q /|| (Q ≠ 0) 之前使用它作为旋转轴。

    【讨论】:

    • 谢谢!!这似乎真的很有帮助,但在我的例子中,Z 是我想绕垂直线旋转的向量!让我们称之为垂直Q。然后我应该将向量V围绕Q旋转角度θ,对吗?
    • 好吧...我原来看不到你的照片;我已经更新以反映这一点。是的,没错。
    • 非常感谢!你不知道我现在有多么轻松!
    猜你喜欢
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多