2011-08-17 123 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函数。即得到法向量和目标向量的叉积作为旋转轴。获取目标和法线之间的角度,然后在枢轴点处围绕轴旋转所有点。下次我将使用这种方法。 –