前言:本文主要介绍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);