繁体   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