【VTK】包围盒和最小包围盒

很高兴在雪易的CSDN遇见你 ,给你糖糖

欢迎大家加入雪易社区-CSDN社区云 


前言

本文分享VTK中创建包围盒和最小包围盒的技术,以及延伸的应用希望对各位小伙伴有所帮助!

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的点赞就是我的动力(^U^)ノ~YO

【VTK】包围盒和最小包围盒_第1张图片

目录

前言

1. 采用vtkOutlineFilter计算对象的包围盒

2. 采用vtkOBBTree计算对象的最小包围盒

3. 根据最小包围盒计算对象的坐标系,进而基于对象坐标系的旋转和移动

结论:


1. 采用vtkOutlineFilter计算对象的包围盒

采用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);

2. 采用vtkOBBTree计算对象的最小包围盒

 采用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);

3. 根据最小包围盒计算对象的坐标系,进而基于对象坐标系的旋转和移动

详细介绍见VTK-旋转小工具_雪易的博客-CSDN博客 

结论:

        总结VTK中计算对象包围盒的方法以及最小包围盒的延伸用法。

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的赞赏是我的最最最最大的动力(^U^)ノ~YO

你可能感兴趣的:(VTK,VTK,算法,人工智能)