[英]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。
编辑:最终矩阵计算略有错误。 固定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.