在三维空间中,通过旋转向量使其朝向另一个向量,并按角度θ计算向量的结果。

8

image

在三维空间中,有单位向量 V 和 D,它们有相同的起点。我想将向量 V 旋转到向量 D 的方向上,但只旋转 θ 角度。

已知:

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

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

您有什么想法如何解决这个问题吗?


一个小问题:对于向量来说,没有“起点”,所以这并不相关。也许你在想线段,它确实有起点和终点。 - Mike Harris
除了@comingstorm提出的解决方案之外,另一个选择是使用四元数,特别是如果您想将相同的旋转应用于多个向量。请参考四元数和空间旋转 - salva
3个回答

9
你需要做的是在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和comingstorm的D - V*((D·V)/(V·V))是相同的。因为V是一个单位向量,他的D-V*((D·V)/(V·V))简化为D-V(D·V)。根据向量三重积恒等式(http://mathworld.wolfram.com/VectorTripleProduct.html),我的(V×D)×V等于D(V·V)-V(D·V),这又简化为D-V(D·V),因为V是一个单位向量。


你需要将 D_tick 按照 length(V) 进行缩放,才能得到正确的旋转。 - comingstorm
@comingstorm - 根据定义,Length(V)为1。V是一个单位向量。 - David Hammen
抱歉如果这是一个愚蠢的问题。但是当我计算Z时,你的意思是:Zx = cos(theta) * Vx + sin(theta) * D'x Zy = ...... - Vortakis
没错。关于“向量”的最基本定义包括两个向量的加法和标量乘法。对于你所关心的向量,乘以一个标量意味着将每个分量乘以该标量,而两个向量的加法则是逐分量相加。 - David Hammen

6

一种方法是找到与V垂直的D分量,将其放大到相等长度,并使用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)。


1

向量Q叉积V × D给出。两个三维向量的叉积始终垂直于叉积的两个参数。因此,这将是旋转轴。在您的情况下,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| (Q ≠ 0) 作为旋转轴。

1
谢谢!这看起来非常有帮助,但在我的情况下,Z是我想要围绕垂直旋转的向量!我们称垂直线为Q。之后,我应该将向量V围绕Q旋转θ角度,对吗? - Vortakis
好的...我最初看不到你的图片;我已经更新了以反映这一点。是的,没错。 - andand
非常感谢!你不知道我现在有多么宽慰! - Vortakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接