单位矢量V和D位于3D空间上。他们有相同的起点。我想将矢量V朝向矢量D旋转,但仅限角度θ。
鉴于我们知道:
我们现在想要计算向量Z,它也是一个单位向量。 是否可以计算向量Z的坐标,上面给出了这些信息?
你有什么想法可以解决这个问题吗?
答案 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),然后将其用作旋转轴。