pcl::ModelCoefficients定义一个平面与三点确定平面的法向量计算
程序员文章站
2022-04-04 08:04:47
...
点云投影需要用到pcl::ModelCoefficients,定义一个平面。实验过程中发现pcl::ModelCoefficients设置4个参数分别为ax+by+cz+d=0的a,b,c,d时,投影后的坐标是错误的(创建了一个近似于平行xy平面的平面,其z轴坐标与定义的平面高度不一致)
因为pcl老文档404了,查了很久都没有查到pcl::ModelCoefficients的Plane定义。
实验中发现对pcl::ModelCoefficients中的value1,value2,value3等比例缩放,value4不变的情况下,平面投影结果不变。所以猜测value1,value2,value3是经过比例缩放再和value4相加的,很可能是单位向量,实验后发现确实如此。
也就是说 ax+by+cz+d=0的平面,在pcl::ModelCoefficients中定义时,value1=a,value2=b,value3=c,value4=d/(a**2+b**2+c**2)**0.5。
---------------------
顺便存以下三点确定平面法向量的代码
struct Plane
{
float a;
float b;
float c;
float d;
};
int compute_plane(pcl::PointCloud<pcl::PointXYZ>::Ptr PlanePoints,Plane *pm)
{
float x[3];
float y[3];
float z[3];
for(int i=0;i<3;i++)
{
x[i]=PlanePoints->points[i].x;
y[i]=PlanePoints->points[i].y;
z[i]=PlanePoints->points[i].z;
}
pm->a=(y[1]-y[0])*(z[2]-z[0])-(y[2]-y[0])*(z[1]-z[0]);
pm->b=(z[1]-z[0])*(x[2]-x[0])-(z[2]-z[0])*(x[1]-x[0]);
pm->c=(x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]);
pm->d=-x[0]*pm->a-y[0]*pm->b-z[0]*pm->c;
printf("%f,%f,%f,%f\n",pm->a,pm->b,pm->c,pm->d);//(a,b,c)是法向量
}