当前位置: 首页 > news >正文

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

若该文为原创文章,转载请注明出处
本文章博客地址: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,演员4vtkSmartPointer<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

http://www.dtcms.com/a/506738.html

相关文章:

  • Java开发—JDK的安装和版本管理(macOS)
  • 初次使用remix
  • 文献阅读翻译工具的选择
  • YOLOv1原理介绍
  • c 网站建设教程win7 搭建iss网站
  • 镇江软件公司南宁网站建设优化案例
  • 火电厂VR安全培训系统有哪些:广州华锐互动构建 “安全元宇宙” 生态
  • 【计算机科学与应用】基于多光谱成像与边缘计算的物流安全风险预警模式及系统实现
  • 分布式架构未来趋势:从云原生到智能边缘的演进之路
  • 云原生系列Bug修复:Docker镜像无法启动的终极解决方案与排查思路
  • 元宇宙赋能智慧城市:重构城市治理与生活新生态
  • 算法笔试题具体在考什么领域的知识?计算机科学领域的基础:数据结构,计算机组成原理,操作系统,计算机网络
  • HarmonyOS安全与隐私:权限申请与敏感数据保护实战
  • 做促销的网站珠海网站建设厚瑜
  • 基于STM32F103ZET6实现6路舵机控制
  • 【案例实战】鸿蒙分布式智能办公应用的架构设计与性能优化
  • 嘉兴网站排名优化价格环保网站 中企动力建设
  • 网站注册页面html网站建设邀标书
  • spring AOP失效的原因
  • 阿里云国际代理:阿里云备份如何保障数据安全?
  • Elasticsearch面试精讲 Day 25:Elasticsearch SQL与数据分析
  • Spring Boot 3零基础教程,WEB 开发 Thymeleaf 总结 热部署 常用配置 笔记44
  • 从概念到代码:4A架构(业务架构、数据架构、应用架构、技术架构)全景落地指南
  • 深入解析 ZeroMQ 请求-应答模式:服务端实现与全链路测试指南 || 测试ZMQ重连重试机制
  • 五行八卦知识介绍和科学的关系
  • 做公司网站客户群体怎么找数据库怎么存储wordpress
  • 拉力猫指纹浏览器配置 Novproxy 代理 IP 教程:从参数设置到连接验证全流程
  • 深圳购物网站建设公司wordpress插件无法安装
  • 内网用户无法通过公网IP访问内网服务器:NAT回流问题
  • 【高并发服务器】Socket套接字类 Channel事件管理类设计与实现