單元上的3D空間中的向量V和d謊言。他們有相同的起點。我想旋轉向量V到向量D,但只能旋轉角度θ。
既然我們知道:
- 矢量V和d是單位向量。
- 我們知道V(x,y,z)和D(x,y,z)。
- 我們知道兩個矢量V和D之間的夾角Δφ。
- 我們還知道角度θ,其中矢量V將旋轉到接近矢量D.
- 我們知道三個矢量從哪裏開始的起點「O」。
我們現在想計算向量Z,它也是一個單位向量。 有沒有可能使用上面給出的這些信息來計算向量Z的座標?
你有什麼想法如何解決這個問題?
單元上的3D空間中的向量V和d謊言。他們有相同的起點。我想旋轉向量V到向量D,但只能旋轉角度θ。
既然我們知道:
我們現在想計算向量Z,它也是一個單位向量。 有沒有可能使用上面給出的這些信息來計算向量Z的座標?
你有什麼想法如何解決這個問題?
您需要做的是在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)。我的(V×D)×V等於每個向量三元產品標識(http://mathworld.wolfram.com/VectorTripleProduct.html)的D(V·V)-V(D·V),並且這又減少到DV(D·V),因爲V是單位矢量。要做到這一點
我想你需要用'length(V)'縮放'D_tick'來獲得正確的旋轉。 – comingstorm
@comingstorm - 根據定義,長度(V)是1。 V是單位矢量。 –
哎呀,你可以仔細閱讀這個問題... – comingstorm
載體Q由cross productV×d給出。兩個3D向量的叉積總是垂直於叉積的兩個參數。這將是旋轉軸。在你的情況,Q由下式給出:
Qx = VyDz - VzDy
Qy = VzDx - VxDz
Qz = VxDy - VyDx
注意V×d = - d×V所以有可能是一個跡象的問題。另外,Q通常不是經常需要旋轉的單位矢量,所以一定要將其除以其大小並且使用Q'= Q/| Q | (Q≠0),然後將其用作旋轉軸。
的一種方式是找到的D
垂直於V
組件,其放大到等效長度,並且使用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
除非這是明確定義的D
平行於V
,這將使|D_perp| == 0
並導致部門的問題。這並不令人驚訝:在這種情況下,你的旋轉飛機是不明確的 - 不清楚你應該旋轉的方向!
在數學上,這種找到垂線的方法等價於其他答案中提到的交叉乘積方法cross(cross(V,D),V)
,但可能稍微簡單一些,適用於任何向量空間(例如2-D和4-D矢量,而不僅僅是3-D)。
一個小問題:有向量,沒有「起點」,所以不相關。也許你正在考慮一個線段,它既有起點又有終點。 –
除了@comingstorm提出的解決方案外,另一種選擇是使用[quaternions](http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation),特別是如果您想將相同的旋轉應用於多個矢量。 – salva