在3D空间中通过角度θ将矢量旋转到另一个之后计算矢量

时间:2014-02-28 15:41:10

标签: math vector

image

单位矢量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”。
  6. 我们现在想要计算向量Z,它也是一个单位向量。 是否可以计算向量Z的坐标,上面给出了这些信息?

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

3 个答案:

答案 0 :(得分:5)

您需要做的是在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彼此平行或反平行时。在这个特殊情况下你的问题是不对的。你应该检查这个特例。



<强>附录
对于三维空间中的矢量,我的(V×D)×V和来自暴群的D-V *((D·V)/(V·V))是一个相同的。因为V是单位矢量,所以他的D-V *((D·V)/(V·V))减小到D-V(D·V)。我的(V×D)×V等于矢量三重积标识(http://mathworld.wolfram.com/VectorTripleProduct.html)的D(V·V)-V(D·V),并且再次降低到DV(D·V)因为V是一个单位向量。

答案 1 :(得分:4)

执行此操作的一种方法是找到与D垂直的V分量,将其缩放到等效长度,并使用sin()和{{1}进行矢量和}:

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 D平行,这将导致V并导致除法出现问题。这并不奇怪:在这种情况下,你的旋转平面是不明确的 - 你不清楚你应该旋转哪个方向!

在数学上,这种寻找垂直的方法等同于其他答案中提到的交叉乘积方法|D_perp| == 0,但也许有点简单,适用于任何向量空间,(例如,2-D和4-D向量,而不仅仅是3-D)。

答案 2 :(得分:1)

向量 Q cross product V × D 给出。两个3D矢量的叉积始终垂直于叉积的两个参数。这将是旋转轴。在您的情况下, Q 将由以下人员提供:

Qx = VyDz - VzDy
Qy = VzDx - VxDz
Qz = VxDy - VyDx

请注意 V × D = - D × V ,因此可能存在符号问题。此外, Q 通常不是旋转所需的单位矢量,因此请务必将其除以其幅度并使用 Q '= Q / | | ( Q ≠0),然后将其用作旋转轴。