2011-08-17 64 views
2

我正在使用kinect和ofxopeni。我有一個真實世界座標點雲,但我需要旋轉這些點來抵消相機的傾斜。地面飛機應該給我所需要的所有信息,但我無法計算出如何計算旋轉軸和旋轉角度。旋轉3d點雲以偏移給定的vNormal和floor點的平面角度

我最初的想法是......

ofVec3f target_normal(0,1,0); 
ofVec3f vNormal; //set this from Xn3DPlane floorPlane (not shown here) 
ofVec3f ptPoint; //as above 

float rot_angle = target_normal.angle(vNormal); 

for(int i = 0; i < numPoints; i++){ 

    cloudPoints[i].rotate(rot_angle, vNormal, ptPoint); //align my points to normal is (0 1 0)        

} 

這似乎是迄今爲止過於簡單化。我一直在釣魚通過各種文章,可以看到它最有可能涉及到一個四分之一或旋轉矩陣,但我不知道從哪裏開始。我非常感謝任何關於相關文章的指針,或者獲得旋轉軸和旋轉角度的最佳技術是什麼?我在想象它可以使用onQuarterion或openni函數很容易地完成,但我無法解決如何實現。

最好

西蒙

回答

0

我從來沒有用過ofxopeni,但是這是最好的數學解釋,我可以給。

使用TBN矩陣(切線,二進制,法線),您可以將一組軸數據從一個軸設置到另一個軸,其中T B和N是您的新軸組。所以,你已經有了正常的數據,但是你需要找到一條切線。我不確定您的Xn3DPlane是否提供切線,但如果是這樣,請使用它。

的二重由正常與正切函數的跨產品給出:

B = T x N 

總鹼值如下:

TBN = { Tx ,Ty ,Tz, 
     Bx, By, Bz, 
     Nx, Ny, Nz } 

這將輪流在一組新的數據但你的飛機也有一個原點,所以我們通過翻譯:

A = {1 , 0 , 0, 0, { Tx , Ty , Tz , 0, 
    0, 1, 0, 0,  Bx , By , Bz , 0,  
    0, 0, 1, 0, x Nx , Ny , Nz , 0, 
    -Px,-Py,-Pz,1}  0 , 0 , 0 , 1}  

// The multiply the vertex, v, to change it's coordinate system. 
v = v * A 

如果你能得到東西s到這個階段,您可以將所有點轉換爲新的座標系。有一點需要注意,法線現在與z軸對齊,如果您希望它與y對齊,則在TBN矩陣中交換N和B.

編輯:最終矩陣計算有點不對。固定。

TBN calculation.

+0

感謝這使得旋轉矩陣使更多的意義!僅供參考,我最終使用了一些易於使用的ofVec3f函數。即得到法向量和目標向量的叉積作爲旋轉軸。獲取目標和法線之間的角度,然後在樞軸點處圍繞軸旋轉所有點。下次我將使用這種方法。 –