vtk 最小包围盒vtkOBBTree参数解析

        最近遇到一个计算点云最小包围盒的应用,查询资料后,发现vtk有现成的API,vtkOBBTree提供了非常方便的便捷的方法 ComputeOBB,其API的描述如下。

  /**
   * Compute an OBB from the list of points given. Return the corner point
   * and the three axes defining the orientation of the OBB. Also return
   * a sorted list of relative "sizes" of axes for comparison purposes.
   */
  static void ComputeOBB(
    vtkPoints* pts, double corner[3], double max[3], double mid[3], double min[3], double size[3]);
输入参数 说明
pts 待计算的输入点云数据

输出参数 说明
corner obb的某一个顶点
max obb最长边的方向向量
mid obb次长边的方向向量
min obb最短边的方向向量
sizes 按照距离降序排列的方向因子(暂未清楚用处)

这里要注意 max,mid,min并非是单位向量,而是带各方向的偏移量的向量。因此根据corner的坐标加上各个方向的偏移量即可计算出包围盒的8个顶点。

具体代码实现,获取到包围盒8个顶点的方法仅需要按如下向量计算即可:

class Point3D
{
public:
    double x;
    double y;
    double z;
    Point3D operator+(const Point3D& p) const {
        return Point3D(x + p.x, y + p.y, z + p.z);
    }
};

Point3D corner, max, mid, min, sizes

//假设输入点云是 cloud
vtkOBBTree::ComputeOBB(cloud, &corner.x, &max.x, &mid.x, &min.x, &sizes.x);

Point3D p0 = corner;
Point3D p1 = corner + max;
Point3D p2 = p1 + mid;
Point3D p3 = corner + mid;
Point3D p4 = p3 + min;
Point3D p5 = p4 + max;
Point3D p6 = p1 + min;
Point3D p7 = corner + min;                           

原始点云效果图

vtk 最小包围盒vtkOBBTree参数解析_第1张图片

最小包围盒(OBB)效果图

vtk 最小包围盒vtkOBBTree参数解析_第2张图片

你可能感兴趣的:(vtk,3d算法,算法,开发语言,3d)