VTK 显示3D模型的网格线(线框/wireframe)

VTK9.1.0在Windows10+VS2019+Qt 5.15.2环境下编译安装的Qt例子中,想显示球体表面的网格线(线框/wireframe),设置actor的EdgeVisibilityOn属性。

sphereActor->GetProperty()->EdgeVisibilityOn();

全部代码

复制代码
    QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());

    vtkNew<vtkRenderer> renderer;
    vtkNew<vtkNamedColors> colors;

    vtkNew<vtkSphereSource> sphereSource;

    vtkNew<vtkPolyDataMapper> sphereMapper;
    sphereMapper->SetInputConnection(sphereSource->GetOutputPort());

    vtkNew<vtkActor> sphereActor;
    sphereActor->SetMapper(sphereMapper);
    sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());
    sphereActor->GetProperty()->EdgeVisibilityOn();

    renderer->AddActor(sphereActor);
    
    renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());
    vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
    renderWindow->AddRenderer(renderer);
    renderWindow->SetWindowName("RenderWindowNoUIFile");
    ui.vtk_main->setRenderWindow(renderWindow);
复制代码

 

还可以通过vtkExtractEdges来实现显示全部网格线:

复制代码
    QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());

    vtkNew<vtkRenderer> renderer;
    vtkNew<vtkNamedColors> colors;

    vtkNew<vtkSphereSource> sphereSource;

    {
        //球体
        vtkNew<vtkPolyDataMapper> sphereMapper;
        sphereMapper->SetInputConnection(sphereSource->GetOutputPort());

        vtkNew<vtkActor> sphereActor;
        sphereActor->SetMapper(sphereMapper);
        sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());

        renderer->AddActor(sphereActor);
    }

    {
        //网格线
        vtkNew<vtkExtractEdges> extractEdges;
        extractEdges->SetInputConnection(sphereSource->GetOutputPort());

        vtkNew<vtkPolyDataMapper> sphereMapper;
        sphereMapper->SetInputConnection(extractEdges->GetOutputPort());
        vtkNew<vtkActor> sphereActor;
        sphereActor->SetMapper(sphereMapper);
        sphereActor->GetProperty()->SetColor(colors->GetColor4d("Black").GetData());

        renderer->AddActor(sphereActor);
    }

    renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());
    vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
    renderWindow->AddRenderer(renderer);
    renderWindow->SetWindowName("RenderWindowNoUIFile");
    ui.vtk_main->setRenderWindow(renderWindow);
复制代码

编译显示vtkExtractEdges未定义,引入vtkExtractEdges的头文件vtkExtractEdges.h,任何时候vtk类没有定义,头文件是vtk类.h

如下图所示:

还可以通过设置actor的SetRepresentationToWireframe属性来显示网格线:

sphereActor->GetProperty()->SetRepresentationToWireframe();

通过SetRepresentationToWireframe只能显示网格线,不能面和线同时显示。

 

最后,还可以通过vtkFeatureEdges来显示特定的网格线:

1.边界(boundary):只被一个多边形使用的边,或者直线单元;
2.非流行(non-manifold):被三个以上的多边形共用的边;
3.特征边(feature edges):被两个三角形使用,并且两个三角形之间的夹角大于特征角度(可自行设置此角度);
4.流行边(manifold edges):只被两个多边形使用的边。

 

posted @   上位机  阅读(2137)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示