我正在嘗試制作一個基本的球體影片。
到目前為止,我有一些點位于一個球體上,可以使用維基百科上的旋轉矩陣圍繞其原點旋轉:

我現在想旋轉球體,使特定點位于前面(在 [0, 0, 1] 處)。我認為我可能必須找到每個平面中兩個向量之間的角度并旋轉這個量,但我不確定這是否正確,或者如何實作。
那么,我將如何找到執行此操作所需的角度?
uj5u.com熱心網友回復:
在球坐標中,您的點在(sin θ cos φ, sin θ sin φ, cos θ)whereθ = arccos(z)和φ = atan2(y, x)。
注意約定:這里θ是極角或傾角,φ是方位角或方位角。
由于您要將點移動到(0, 0, 1),因此您可以先φ繞 z 軸旋轉設定為零,然后θ繞 y 軸旋轉設定為零。
第一個輪換是Rz(-φ):
cos φ sin φ 0
-sin φ cos φ 0
0 0 1
第二個輪換是Ry(-θ):
cos θ 0 -sin θ
0 1 0
sin θ 0 cos θ
組成是Ry(-θ) * Rz(-φ):
cos θ cos φ cos θ sin φ -sin θ
-sin φ cos φ 0
sin θ cos φ sin θ sin φ cos θ
請注意,最后一行是(x, y, z),它確認該點將移至(0, 0, 1)。
另一種構造需要 的旋轉矩陣的方法(x, y, z)是(0, 0, 1)構造逆矩陣(需要)然后轉置它(0, 0, 1)。(x, y, z)您需要三個相互垂直的基向量,一個用于矩陣的每一列。但是,由于我們將在最后轉置結果,因此我們可以將這些向量視為最終矩陣的行。
第一個向量是V3 = (x, y, z),它進入第三行(因為我們想將它移動到 z 單位向量)。可以使用與某個其他任意向量的叉積來計算其他兩個向量。許多游戲和 3D 引擎使用“查看”功能,該功能采用“向上”矢量,因為世界通常具有上下的感覺。
讓我們UP = (0, 1, 0)作為我們的“向上”向量。您可以計算V1 = norm(cross(UP, V3))和V2 = cross(V3, V1)。根據引數的順序,您可以翻轉球體(您也可以將其中一個向量乘以 -1)。我們不需要歸一化V2,因為V1和 `V3 都已經是單位向量。
所以向量是:
V3 = (x, y, z)
V1 = norm(cross(UP, V3)) = (z/sqrt(xx zz), 0, -x/sqrt(xx zz))
V2 = cross(V3, V1) = (-xy/sqrt(xx zz), sqrt(xx zz), -yz/sqrt(xx zz))
最終的旋轉矩陣,S = sqrt(xx zz), 是:
z/S 0 -x/S
-xy/S S -yz/S
x y z
請注意,它與我們從中獲得的不同Ry(-θ) * Rz(-φ)。有無數個旋轉矩陣可以將一個點移動到另一個點,因為旋轉具有三個自由度,如果不考慮最終方向,在表面上移動只有兩個自由度。您可以通過更改“向上”向量來獲得其他結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/520222.html
標籤:算法数学向量3d几何学
