VTK-vtkOBBTree

前言:本文主要介绍VTK中的vtkOBBTree的功能、实现原理以及相关的应用,希望也能帮助到各位小伙伴。

vtkOBBTree

描述:

vtkOBBTree是一个用于生成定向包围框树的对象。一个有方向的包围框是一个不一定沿着坐标轴对齐的包围框。OBB树是这种盒子的分层树结构,其中OBB的更深层次限制了更小的空间区域。

要构建OBB,需要使用递归的、自顶向下的流程。首先,通过找到定义数据集的单元格(及其点)的均值和协方差矩阵来构造根OBB。提取协方差矩阵的特征向量,给出一组三个正交向量,定义最紧密拟合的OBB。要创建两个子OBB,需要找到一个分割平面,将数字单元格(大约)分成两半。然后这些被分配给孩子们的OBB。然后继续这个过程,直到MaxLevel ivar限制递归,或者找不到分割平面。

以下图为例,说明不同Level下的包围盒分割情况。

 Level=0,包围盒个数为1;

 Level=1,包围盒个数为2;

 Level=2,包围盒个数为4;

 Level=3,包围盒个数为8;

 Level=4,包围盒个数为16;

关于OBBTree可视化的代码

auto obbTree = vtkSmartPointer<vtkOBBTree>::New();
obbTree->SetDataSet(m_selectObject->GetPolyData());
obbTree->SetMaxLevel(5);
obbTree->BuildLocator();

double corner[3] = { 0.0, 0.0 ,0.0 };
double max[3] = { 0.0, 0.0 ,0.0 };
double mid[3] = { 0.0, 0.0, 0.0 };
double min[3] = { 0.0, 0.0, 0.0 };
double size[3] = { 0.0, 0.0, 0.0 };

obbTree->ComputeOBB(m_selectObject->GetPolyData(), corner, max, mid, min, size);

auto polydata = vtkSmartPointer<vtkPolyData>::New();
obbTree->GenerateRepresentation(0, polydata);
emit sendStructureHolesResult(polydata);

auto polydata1 = vtkSmartPointer<vtkPolyData>::New();
obbTree->GenerateRepresentation(1, polydata1);
emit sendStructureHolesResult(polydata1);

 应用

实例1:计算线与PolyData对象的相交点与相交Cell。

  vtkSmartPointer<vtkOBBTree> tree =
    vtkSmartPointer<vtkOBBTree>::New();
  tree->SetDataSet(sphereSource->GetOutput());
  tree->BuildLocator();

  // Intersect the locator with the line
  double lineP0[3] = {-0.6, -0.6, -0.6};
  double lineP1[3] = {.6, .6, .6};
  vtkSmartPointer<vtkPoints> intersectPoints =
    vtkSmartPointer<vtkPoints>::New();

  vtkSmartPointer<vtkIdList> intersectCells =
    vtkSmartPointer<vtkIdList>::New();

  double tol = 1.e-8;
  tree->SetTolerance(tol);
  tree->IntersectWithLine(lineP0, lineP1,
                          intersectPoints,
                          intersectCells);

猜你喜欢

转载自blog.csdn.net/qq_40041064/article/details/129729586
今日推荐