2011-03-25 67 views
5

我有一個經度和緯度,並希望將其轉換爲四元數,並想知道我該如何做到這一點?我想使用它,因爲我有一個應用程序,將地球投射到一個球體上,我想從一個位置旋轉到另一個位置。經度/緯度到四元數

最好!

回答

1

也許你可以看看boost C++庫如何實現它。 (或者甚至可以使用它)http://www.boost.org/doc/libs/1_46_0/libs/math/doc/quaternion/html/boost_quaternions/quaternions/create.html

經度和緯度幾乎類似於球座標中的方位角(theta - [0,2 * PI])和傾角(rho?[0,PI])角度(半徑r = 1當然表面)。在我發佈的鏈接中,Boost具有球形到四元的功能。

+0

hi jon_darkstar,經度是phi,緯度是theta,但是rho是什麼? – rick 2011-03-25 20:53:25

+0

它的phi呢?自從使用球座標後,我忘記了它已經有一段時間了。我真的不知道第三個角度會做什麼。 rho可能只是數量級,但爲什麼兩個phis?我不能幫你指點你,祝你好運 – 2011-03-25 21:05:39

+0

我正在使用它將緯度/經度轉換爲直角座標: '\t float phi = ofDeToToad(ll.lat + 90); \t float theta = ofDegToRad(ll.lon - 90); \t x = sin(phi)* cos(theta); \t y = sin(phi)* sin(theta); \t z = cos(phi);' 現在我需要一種方法將其轉換爲旋轉而不是座標。旋轉可以是軸/角度或四元數。 – rick 2011-03-25 21:08:46

1

經度和緯度不足以描述四元數。經度和緯度可以描述三維球體表面的一個點。假設這是正常點直接通過屏幕的點。你還有一定的自由度。球體可以圍繞由lat-lon指定的點的法線向量旋轉。如果你想要一個代表球體方向的四元數,你需要完全指定旋轉。

讓我們假設你想保持球體的北極向上。如果北極與對象的軸線對齊,並且屏幕上的'向上'與全球的軸線對齊,然後您想要旋轉球體以便點R在表面上在屏幕上直接指出球體(其中R如您在評論中提到的那樣使用經緯度到歐幾里德找到),那麼您創建旋轉矩陣如下。

你想對象的[R要對齊世界+ Z(假設一個OpenGL樣視圖座標系),你想對象的+ Z與世界+ Y對齊(儘可能接近可能)。我們需要第三個軸;所以我們規範化R然後找到:P = crossP([0 0 1]^T,R)。我們規範化P然後強制第二軸的正交性:Q = crossP(R,P)。最後,標準化Q。現在我們有3個正交矢量P,Q,R,我們希望分別與世界的x,y,z一致。

我假設P,Q,R是列向量;所以要創建一個變換矩陣,我們只需將它們粘在一起:M = [P Q R]。現在M是將世界座標中的一個點轉換爲對象座標的矩陣。要走相反的方向,我們找到M的倒數。幸運的是,當一個矩陣的列是正交矩陣時,逆矩陣與轉置矩陣是相同的。所以我們得到:

   [ P^T ] 
M^-1 = M^T = [ Q^T ] 
      [ R^T ] 

從這一點,如果你需要,你可以找到使用matrix to quaternion conversion四元數。然後,您可以使用斯萊普或您選擇的方法在四元數之間進行插值。

0

還有一種方法可以不使用矩陣或向量,類似於this numpy implementation。我們可以把經度/緯度看作兩個四元數的旋轉組合在一起。

讓我們使用Z-up右手座標系。我們稱之爲經度φ和緯度θ,並將這兩個點表示爲(φ,θ)。對於可視化,紅軸對應於X,綠色爲Y,和藍色Z.

我們希望找到代表從旋轉的四元數(0,0),在紅色,以(一個b),在綠色:

Sphere with origin and destination points

我們可以表示該旋轉作爲第一縱向旋轉的組合,則該緯向旋轉,像這樣:

First rotation Second rotation

首先,我們通過旋轉一個沿着Z軸,其將在X和Y軸。然後,沿着新的局部Y軸旋轉b。因此,我們知道這個旋轉的兩組軸/角度信息。

幸運的是,從軸/角度到四元數的轉換是已知的。給定的角度α和一個軸矢量ω,將得到的四元數是:

(cos(α/2), ω.x*sin(α/2), ω.y*sin(α/2), ω.z*sin(α/2)) 

所以第一旋轉通過的一個度沿(0,0,1)軸的旋轉來表示,給我們:

q1 = (cos(a/2), 0, 0, sin(a/2)) 

第二旋轉通過的b沿着變換(0,1,0)軸度的旋轉表示的,使我們:

q2 = (cos(b/2), 0, sin(b/2), 0) 

我們可以繁殖這些兩個四元給我們表示從該化合物旋轉的單個四元數(0,0)到(一個b)。四元數乘法的公式有點冗長,但你可以找到它here。結果如下:

q2*q1 = (cos(a/2)cos(b/2), -sin(a/2)sin(b/2), cos(a/2)sin(b/2), sin(a/2)cos(b/2)) 

不是說它意味着多少,但我們可以確認這個公式與前面提到的numpy實現相同。

JCooper提到了一個很好的觀點,即在這種情況下沿X軸還有一個自由度。如果θ保持在±90度以內,我們可以想象Z軸總是向上。這具有約束X軸旋轉的效果,並且希望你想要的。

希望這會有所幫助!


編輯:請注意,這與使用2個歐拉角基本相同。因此,要反轉此轉換,您可以使用任何四元數到歐拉角轉換,前提是旋轉順序相同。