很高兴在雪易的CSDN遇见你 ,给你糖糖
欢迎大家加入雪易社区-CSDN社区云
本文分享VTK中创建包围盒和最小包围盒的技术,以及延伸的应用希望对各位小伙伴有所帮助!
感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!
你的点赞就是我的动力(^U^)ノ~YO
目录
前言
1. 采用vtkOutlineFilter计算对象的包围盒
2. 采用vtkOBBTree计算对象的最小包围盒
3. 根据最小包围盒计算对象的坐标系,进而基于对象坐标系的旋转和移动
结论:
采用OutLine计算包围盒,如上图中红色框所示
vtkSmartPointer outline =
vtkSmartPointer::New();
outline->SetInputData(dynamic_cast(picker->GetActor()->GetMapper()->GetInput()));
vtkSmartPointer outlineMapper =
vtkSmartPointer::New();
outlineMapper->SetInputConnection(outline->GetOutputPort());
vtkSmartPointer outlineActor =
vtkSmartPointer::New();
outlineActor->SetMapper(outlineMapper);
outlineActor->GetProperty()->SetColor(1, 0, 0);
m_viewer->renderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(outlineActor);
采用OBBTree计算最小包围盒,如上图绿色包围盒所示
int maxLevel = 5;
// Create the tree
auto obbTree = vtkSmartPointer::New();
obbTree->SetDataSet(dynamic_cast(picker->GetActor()->GetMapper()->GetInput()));
obbTree->SetMaxLevel(maxLevel);
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(dynamic_cast(picker->GetActor()->GetMapper()->GetInput()), corner, max, mid, min, size);
// Initialize the representation
auto polydata = vtkSmartPointer::New();
obbTree->GenerateRepresentation(0, polydata);
auto obbtreeMapper =
vtkSmartPointer::New();
obbtreeMapper->SetInputData(polydata);
auto obbtreeActor = vtkSmartPointer::New();
obbtreeActor->SetMapper(obbtreeMapper);
obbtreeActor->GetProperty()->SetInterpolationToFlat();
obbtreeActor->GetProperty()->SetOpacity(.5);
obbtreeActor->GetProperty()->EdgeVisibilityOn();
obbtreeActor->GetProperty()->SetColor(0.,1.,0.);
m_viewer->renderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(obbtreeActor);
绿色包围盒的几何数据为
x[0] = OBBptr->Corner[0];
x[1] = OBBptr->Corner[1];
x[2] = OBBptr->Corner[2];
cubeIds[0] = pts->InsertNextPoint(x);
x[0] = OBBptr->Corner[0] + OBBptr->Axes[0][0];
x[1] = OBBptr->Corner[1] + OBBptr->Axes[0][1];
x[2] = OBBptr->Corner[2] + OBBptr->Axes[0][2];
cubeIds[1] = pts->InsertNextPoint(x);
x[0] = OBBptr->Corner[0] + OBBptr->Axes[1][0];
x[1] = OBBptr->Corner[1] + OBBptr->Axes[1][1];
x[2] = OBBptr->Corner[2] + OBBptr->Axes[1][2];
cubeIds[2] = pts->InsertNextPoint(x);
x[0] = OBBptr->Corner[0] + OBBptr->Axes[0][0] + OBBptr->Axes[1][0];
x[1] = OBBptr->Corner[1] + OBBptr->Axes[0][1] + OBBptr->Axes[1][1];
x[2] = OBBptr->Corner[2] + OBBptr->Axes[0][2] + OBBptr->Axes[1][2];
cubeIds[3] = pts->InsertNextPoint(x);
x[0] = OBBptr->Corner[0] + OBBptr->Axes[2][0];
x[1] = OBBptr->Corner[1] + OBBptr->Axes[2][1];
x[2] = OBBptr->Corner[2] + OBBptr->Axes[2][2];
cubeIds[4] = pts->InsertNextPoint(x);
x[0] = OBBptr->Corner[0] + OBBptr->Axes[0][0] + OBBptr->Axes[2][0];
x[1] = OBBptr->Corner[1] + OBBptr->Axes[0][1] + OBBptr->Axes[2][1];
x[2] = OBBptr->Corner[2] + OBBptr->Axes[0][2] + OBBptr->Axes[2][2];
cubeIds[5] = pts->InsertNextPoint(x);
x[0] = OBBptr->Corner[0] + OBBptr->Axes[1][0] + OBBptr->Axes[2][0];
x[1] = OBBptr->Corner[1] + OBBptr->Axes[1][1] + OBBptr->Axes[2][1];
x[2] = OBBptr->Corner[2] + OBBptr->Axes[1][2] + OBBptr->Axes[2][2];
cubeIds[6] = pts->InsertNextPoint(x);
x[0] = OBBptr->Corner[0] + OBBptr->Axes[0][0] + OBBptr->Axes[1][0] + OBBptr->Axes[2][0];
x[1] = OBBptr->Corner[1] + OBBptr->Axes[0][1] + OBBptr->Axes[1][1] + OBBptr->Axes[2][1];
x[2] = OBBptr->Corner[2] + OBBptr->Axes[0][2] + OBBptr->Axes[1][2] + OBBptr->Axes[2][2];
cubeIds[7] = pts->InsertNextPoint(x);
拓扑数据为
ptIds[0] = cubeIds[0];
ptIds[1] = cubeIds[2];
ptIds[2] = cubeIds[3];
ptIds[3] = cubeIds[1];
polys->InsertNextCell(4, ptIds);
ptIds[0] = cubeIds[0];
ptIds[1] = cubeIds[1];
ptIds[2] = cubeIds[5];
ptIds[3] = cubeIds[4];
polys->InsertNextCell(4, ptIds);
ptIds[0] = cubeIds[0];
ptIds[1] = cubeIds[4];
ptIds[2] = cubeIds[6];
ptIds[3] = cubeIds[2];
polys->InsertNextCell(4, ptIds);
ptIds[0] = cubeIds[1];
ptIds[1] = cubeIds[3];
ptIds[2] = cubeIds[7];
ptIds[3] = cubeIds[5];
polys->InsertNextCell(4, ptIds);
ptIds[0] = cubeIds[4];
ptIds[1] = cubeIds[5];
ptIds[2] = cubeIds[7];
ptIds[3] = cubeIds[6];
polys->InsertNextCell(4, ptIds);
ptIds[0] = cubeIds[2];
ptIds[1] = cubeIds[6];
ptIds[2] = cubeIds[7];
ptIds[3] = cubeIds[3];
polys->InsertNextCell(4, ptIds);
详细介绍见VTK-旋转小工具_雪易的博客-CSDN博客
总结VTK中计算对象包围盒的方法以及最小包围盒的延伸用法。
感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!
你的赞赏是我的最最最最大的动力(^U^)ノ~YO