欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)是法向量

}