簡體   English   中英

給定vNormal和地面點,將3d點雲旋轉到地面的偏移角度

[英]rotate 3d point cloud to offset angle of floor plane given vNormal and floor point

我正在使用kinect和ofxopeni。 我在現實世界坐標中有一個點雲,但我需要旋轉這些點以抵消相機的傾斜。 地板應該給我所有我需要的信息,但是我無法解決如何計算旋轉軸和旋轉角度。

我最初的想法是

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)                               

}

到目前為止,這似乎太簡單了。 我瀏覽了很多文章,可以看到它很可能涉及到四分之一或旋轉矩陣,但是我無法確定從哪里開始。 我真的很感謝任何指向相關文章的指針,或者什么是獲得旋轉軸和旋轉角度的最佳技術? 我想可以使用ofQuarterion或openni函數很容易地做到這一點,但我不知道如何實現。

最好

西蒙

我從未使用過xopeni,但這是我能給出的最佳數學解釋。

您可以使用TBN矩陣(切線,雙切線,法線)將任何一組數據從一個軸集旋轉到另一個軸,其中TB和N是您的新軸集。 因此,您已經有了法線的數據,但是您需要找到一個切線。 我不確定您的Xn3DPlane是否提供切線,但是如果提供,則使用該切線。

切線由法線和切線的叉積給出:

 B = T x N

TBN看起來像這樣:

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

如果可以解決這個問題,則可以將所有點轉換為新的坐標系。 注意,法線現在與z軸對齊,如果希望它與y對齊,請在TBN矩陣中交換N和B。

編輯:最終矩陣計算略有錯誤。 固定。

TBN計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM