代码改变世界

VTK研发笔记(七):示例Cone4,一数据源多演员模式,在Qt窗口中详解复现对应的Demo

2025-11-15 17:54  tlnshuju  阅读(0)  评论(0)    收藏  举报

若该文为原创文章,转载请注明出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/153647096

长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

OSG、VTK、OSGEARTH三维开发专栏(点击传送门)

上一篇:《VTK开发笔记(六):示例Cone3,多视口实现方式,在Qt窗口中详解复现对应的Demo
下一篇:敬请期待…


前言

  本篇详细解析Cone4.exe,一份原始数据多个演员渲染的模式,这种模式非常适合对比不同渲染风格、展示数据的不同属性或突出显示数据的不同部分。


Demo

在这里插入图片描述


一数据多演员模式

概述

  在VTK中,"一份原始数据多个演员(Actors)"是一种常见的可视化模式,它允许你基于同一数据源创建多个不同的视觉表现形式。这种模式非常适合对比不同渲染风格、展示数据的不同属性或突出显示数据的不同部分。

  • 原始数据:通常是vtkDataSet或其子类(如vtkPolyData、vtkImageData等)
  • 映射器(Mapper):将数据转换为可渲染的图形 primitives
  • 演员(Actor):控制数据的视觉属性(颜色、透明度等)并定义在场景中的位置

  一个数据源可以连接到多个映射器,每个映射器又可以关联到一个演员,每个演员可以有完全独立的视觉属性和变换。
  模式的核心是共享数据源,同时为每个渲染视图创建独立的映射器、演员、相机和渲染器。关键组件关系如下:

  • 一个数据源 → 多个映射器(可共享或独立)
  • 每个映射器 → 一个演员(视觉属性独立)
  • 每个演员 → 分配给不同渲染器(视口独立)
  • 每个渲染器 → 有独立相机(视角独立)

特点

  • 虽然使用同一数据源,但每个演员都有自己的变换矩阵,可独立移动、旋转和缩放修改
  • 原始数据会影响所有关联的演员
  • 每个演员可以有独立的属性(颜色、透明度、纹理等)
  • 过多的演员可能会影响渲染性能,特别是对于复杂数据。

  通过这种模式,可以灵活地展示数据的多个方面,为数据分析和可视化提供强大支持。


Demo实现步骤

步骤一:创建圆锥数据源

在这里插入图片描述

步骤二:创建多边形应神奇

在这里插入图片描述

步骤三:一份数据创建多个演员

  使用属性对位置和颜色进行变化
在这里插入图片描述

步骤四:创建渲染器

在这里插入图片描述

步骤五:设置渲染窗口

在这里插入图片描述

步骤六:过程式展现动画

在这里插入图片描述


Demo源码

VTKWidget.cpp

void VTKWidget::test_demo6_createCone()
{
// 步骤一:创建圆锥体数据源
vtkSmartPointer<vtkConeSource> pConeSource =
  VTKManager::createConeSource(0, 0, 0, 8, 30, 100);
  // 步骤二:创建多边形映射器
  vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper =
    VTKManager::createPolyDataMapper(pConeSource->GetOutputPort());
    // 步骤三:创建演员1,演员2,演员3,演员4
    vtkSmartPointer<vtkActor> pActor =
      VTKManager::createActor(pPolyDataMapper, 1.0, 0.3882, 0.2784, 1.0);
      pActor->SetPosition(0, 0, 0);
      vtkSmartPointer<vtkActor> pActor2 =
        VTKManager::createActor(pPolyDataMapper, 1.0, 0.3882, 0.2784, 1.0, 0.7, 0.4, 20);
        pActor2->SetPosition(0, 20, 0);
        vtkSmartPointer<vtkActor> pActor3 =
          VTKManager::createActor(pPolyDataMapper);
          vtkSmartPointer<vtkProperty> pProperty3 =
            VTKManager::createProperty(1.0, 0.3882, 0.2784, 0.7, 0.4, 40);
            pActor3->SetProperty(pProperty3);
            pActor3->SetPosition(0, 40, 0);
            vtkSmartPointer<vtkActor> pActor4 =
              VTKManager::createActor(pPolyDataMapper);
              vtkSmartPointer<vtkProperty> pProperty4 =
                VTKManager::createProperty(0.2, 0.63, 0.79);
                pActor4->SetProperty(pProperty4);
                pActor4->SetPosition(0, 60, 0);
                // 步骤四:创建渲染器
                std::vector<vtkActor *> vectorPActor;
                  vectorPActor.push_back(pActor);
                  vectorPActor.push_back(pActor2);
                  vectorPActor.push_back(pActor3);
                  vectorPActor.push_back(pActor4);
                  vtkSmartPointer<vtkRenderer> pRenderer =
                    VTKManager::createRenderer(vectorPActor, 0.1, 0.2, 0.4);
                    // 步骤五:渲染器添加到QVTKWidget渲染
                    _pQVTKWidget->GetRenderWindow()->AddRenderer(pRenderer);
                    // 步骤六:过程循环的方式实现旋转
                    QElapsedTimer elapsedTimer;
                    for(int index = 0; index < 360; index++)
                    {
                    LOG << index;
                    if(!isVisible())
                    {
                    continue;
                    }
                    // 渲染一次
                    _pQVTKWidget->GetRenderWindow()->Render();
                    elapsedTimer.start();
                    while(elapsedTimer.elapsed() < 10)
                    {
                    qApp->processEvents();
                    }
                    if(!isVisible())
                    {
                    continue;
                    }
                    // 渲染器相机绕焦点旋转
                    VTKManager::rotateAzimuth(pRenderer, 1);
                    }
                    }

VTKManager.cpp

vtkSmartPointer<vtkConeSource> VTKManager::createConeSource(double x, double y, double z, double r, int h, int n)
  {
  // 步骤一:智能指针定义
  vtkSmartPointer<vtkConeSource> pConeSource;
    // 步骤二:智能指针实例化
    pConeSource = vtkSmartPointer<vtkConeSource>::New();
      // 步骤三:设置中心坐标
      pConeSource->SetCenter(x, y, z);
      // 步骤三:设置半径
      pConeSource->SetRadius(r);
      // 步骤四:设置圆锥的高度
      pConeSource->SetHeight(h);
      // 步骤五:设置圆锥球体的经度分辨率,即横向的切片数量(横向/水平精细度)
      pConeSource->SetResolution(n);
      return pConeSource;
      }
      vtkSmartPointer<vtkPolyDataMapper> VTKManager::createPolyDataMapper(vtkAlgorithmOutput *pAlgorithmOutput)
        {
        // 步骤一:智能指针定义
        vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper;
          // 步骤二:智能指针实例化
          pPolyDataMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
            // 步骤三:设置
            pPolyDataMapper->SetInputConnection(pAlgorithmOutput);
            return pPolyDataMapper;
            }
            vtkSmartPointer<vtkActor> VTKManager::createActor(vtkPolyDataMapper *pPolyDataMapper, double r, double g, double b, double a)
              {
              // 步骤一:智能指针定义
              vtkSmartPointer<vtkActor> pActor;
                // 步骤二:智能指针实例化
                pActor = vtkSmartPointer<vtkActor>::New();
                  // 步骤三:设置映射器
                  pActor->SetMapper(pPolyDataMapper);
                  // 步骤四:设置颜色
                  pActor->GetProperty()->SetColor(r, g, b);
                  // 步骤五:设置透明度
                  pActor->GetProperty()->SetOpacity(a);
                  return pActor;
                  }
                  vtkSmartPointer<vtkActor> VTKManager::createActor(vtkPolyDataMapper *pPolyDataMapper, double r, double g, double b, double a, double diffuse, double specular, double specularPower)
                    {
                    // 步骤一:智能指针定义
                    vtkSmartPointer<vtkActor> pActor;
                      // 步骤二:智能指针实例化
                      pActor = vtkSmartPointer<vtkActor>::New();
                        // 步骤三:设置映射器
                        pActor->SetMapper(pPolyDataMapper);
                        // 步骤四:设置颜色
                        pActor->GetProperty()->SetColor(r, g, b);
                        // 步骤五:设置透明度
                        pActor->GetProperty()->SetOpacity(a);
                        // 步骤六:设置漫反射
                        pActor->GetProperty()->SetSpecular(specular);
                        // 步骤七:设置镜面反射
                        pActor->GetProperty()->SetSpecularPower(specularPower);
                        return pActor;
                        }
                        vtkSmartPointer<vtkActor> VTKManager::createActor(vtkPolyDataMapper *pPolyDataMapper)
                          {
                          // 步骤一:智能指针定义
                          vtkSmartPointer<vtkActor> pActor;
                            // 步骤二:智能指针实例化
                            pActor = vtkSmartPointer<vtkActor>::New();
                              // 步骤三:设置映射器
                              pActor->SetMapper(pPolyDataMapper);
                              return pActor;
                              }
                              vtkSmartPointer<vtkProperty> VTKManager::createProperty(double r, double g, double b)
                                {
                                // 步骤一: 智能指针定义
                                vtkSmartPointer<vtkProperty> pProperty;
                                  // 步骤二:智能指针实例化
                                  pProperty = vtkSmartPointer<vtkProperty>::New();
                                    // 步骤三: 设置颜色
                                    pProperty->SetColor(r, g, b);
                                    return pProperty;
                                    }
                                    vtkSmartPointer<vtkProperty> VTKManager::createProperty(double r, double g, double b, double diffuse, double specular, double specularPower)
                                      {
                                      // 步骤一: 智能指针定义
                                      vtkSmartPointer<vtkProperty> pProperty;
                                        // 步骤二:智能指针实例化
                                        pProperty = vtkSmartPointer<vtkProperty>::New();
                                          // 步骤三: 设置颜色
                                          pProperty->SetColor(r, g, b);
                                          // 步骤四:设置漫反射
                                          pProperty->SetSpecular(specular);
                                          // 步骤五:设置镜面反射
                                          pProperty->SetSpecularPower(specularPower);
                                          return pProperty;
                                          }
                                          vtkSmartPointer<vtkRenderer> VTKManager::createRenderer(std::vector<vtkActor *> vectorPActor, double r, double g, double b)
                                            {
                                            // 步骤一:智能指针定义
                                            vtkSmartPointer<vtkRenderer> pRenderer;
                                              // 步骤二:智能指针实例化
                                              pRenderer = vtkSmartPointer<vtkRenderer>::New();
                                                // 步骤三:设置映射器
                                                for(int index = 0; index < vectorPActor.size(); index++)
                                                {
                                                pRenderer->AddActor(vectorPActor.at(index));
                                                }
                                                // 步骤四:设置背景色
                                                pRenderer->SetBackground(r, g, b);
                                                return pRenderer;
                                                }

工程模板v1.5.0

在这里插入图片描述


上一篇:《VTK开发笔记(六):示例Cone3,多视口实现方式,在Qt窗口中详解复现对应的Demo
下一篇:敬请期待…


本文章博客地址:https://hpzwl.blog.csdn.net/article/details/153647096