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

创建一个带有背景图层和前景图层的渲染窗口


开发环境:

  1. Windows 11 家庭中文版
  2. Microsoft Visual Studio Community 2019
  3. VTK-9.3.0.rc0
  4. vtk-example

demo解决问题: 创建一个带有背景图层和前景图层的渲染窗口,知识点:1. 画布转image;2. 渲染图层设置;3. 相机位置、焦点、距离等属性设置

在这里插入图片描述

  1. 构造imageData对象:程序检查是否提供了输入图像文件名。如果提供了,则使用VTK库中的vtkImageReader2类来读取图像数据,并将其存储在imageData对象中。如果没有提供,则创建一个带有三种颜色的矩形图像。程序使用vtkImageCanvasSource2D类来创建一个画布,并使用其FillBox、FillTriangle和FillTube方法在画布上绘制三种颜色的形状。然后,使用canvasSource->GetOutput()方法获取画布上的图像数据,并将其存储在imageData对象中。

  2. 创建了一个vtkImageActor对象imageActor,并将其设置为显示imageData中的图像数据。然后,程序创建了一个vtkRenderer对象backgroundRenderer,并将其设置为显示imageActor中的图像数据。程序还创建了一个vtkSuperquadricSource对象superquadricSource,并使用其SetPhiRoundness和SetThetaRoundness方法设置超椭球体的形状。然后,程序创建了vtkPolyDataMapper和vtkActor对象来显示超椭球体,并使用colors->GetColor3d方法设置超椭球体的颜色。

  3. 程序创建了一个vtkRenderer对象sceneRenderer,并将其设置为显示超椭球体。然后,程序创建了一个vtkRenderWindow对象renderWindow,并将其设置为显示backgroundRenderer和sceneRenderer中的内容。程序还使用renderWindow->SetWindowName方法设置窗口名称。

  4. 创建了一个vtkRenderWindowInteractor对象renderWindowInteractor,并使用renderWindowInteractor->SetRenderWindow方法将其与renderWindow关联。然后,程序将超椭球体添加到sceneRenderer中,将imageActor添加到backgroundRenderer中。

  5. 程序调用renderWindow->Render方法以确定背景相机的位置。程序使用imageData->GetOrigin、imageData->GetSpacing和imageData->GetExtent方法获取图像数据的原点、间距和范围等信息。然后,程序设置相机的位置、焦点和平行比例等参数以使背景相机填充渲染器中的图像。


prj name: BackgroundImage

#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkImageActor.h>
#include <vtkImageCanvasSource2D.h>
#include <vtkImageData.h>
#include <vtkImageReader2.h>
#include <vtkImageReader2Factory.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkSuperquadricSource.h>#include <array>int main(int argc, char* argv[])
{vtkNew<vtkNamedColors> colors;vtkSmartPointer<vtkImageData> imageData;// Verify input arguments.if (argc > 1){// Read the imagevtkNew<vtkImageReader2Factory> readerFactory;vtkSmartPointer<vtkImageReader2> imageReader;imageReader.TakeReference(readerFactory->CreateImageReader2(argv[1]));imageReader->SetFileName(argv[1]);imageReader->Update();imageData = imageReader->GetOutput();}else{std::array<double, 3> drawColor1{0, 0, 0};std::array<double, 3> drawColor2{0, 0, 0};std::array<double, 3> drawColor3{0, 0, 0};auto color1 = colors->GetColor3ub("warm_grey").GetData();auto color2 = colors->GetColor3ub("DarkCyan").GetData();auto color3 = colors->GetColor3ub("LightCoral").GetData();for (auto i = 0; i < 3; ++i){drawColor1[i] = color1[i];drawColor2[i] = color2[i];drawColor3[i] = color3[i];}vtkNew<vtkImageCanvasSource2D> canvasSource;canvasSource->SetExtent(0, 100, 0, 100, 0, 0);canvasSource->SetScalarTypeToUnsignedChar();canvasSource->SetNumberOfScalarComponents(3);canvasSource->SetDrawColor(drawColor1.data());canvasSource->FillBox(0, 100, 0, 100);canvasSource->SetDrawColor(drawColor2.data());canvasSource->FillTriangle(10, 10, 25, 10, 25, 25);canvasSource->SetDrawColor(drawColor3.data());canvasSource->FillTube(75, 75, 0, 75, 5.0);canvasSource->Update();imageData = canvasSource->GetOutput();}// Create an image actor to display the image.vtkNew<vtkImageActor> imageActor;imageActor->SetInputData(imageData);// Create a renderer to display the image in the background.vtkNew<vtkRenderer> backgroundRenderer;// Create a superquadric.vtkNew<vtkSuperquadricSource> superquadricSource;superquadricSource->SetPhiRoundness(1.1);superquadricSource->SetThetaRoundness(.2);// Create a mapper and actor.vtkNew<vtkPolyDataMapper> superquadricMapper;superquadricMapper->SetInputConnection(superquadricSource->GetOutputPort());vtkNew<vtkActor> superquadricActor;superquadricActor->SetMapper(superquadricMapper);superquadricActor->GetProperty()->SetColor(colors->GetColor3d("NavajoWhite").GetData());vtkNew<vtkRenderer> sceneRenderer;vtkNew<vtkRenderWindow> renderWindow;// Set up the render window and renderers such that there is// a background layer and a foreground layer.backgroundRenderer->SetLayer(0);backgroundRenderer->InteractiveOff();sceneRenderer->SetLayer(1);renderWindow->SetNumberOfLayers(2);renderWindow->AddRenderer(backgroundRenderer);renderWindow->AddRenderer(sceneRenderer);renderWindow->SetWindowName("BackgroundImage");vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;renderWindowInteractor->SetRenderWindow(renderWindow);// Add actors to the rendererssceneRenderer->AddActor(superquadricActor);backgroundRenderer->AddActor(imageActor);// Render once to figure out where the background camera will be.renderWindow->Render();// Set up the background camera to fill the renderer with the image.double origin[3];double spacing[3];int extent[6];imageData->GetOrigin(origin);imageData->GetSpacing(spacing);imageData->GetExtent(extent);vtkCamera* camera = backgroundRenderer->GetActiveCamera();camera->ParallelProjectionOn();double xc = origin[0] + 0.5 * (extent[0] + extent[1]) * spacing[0];double yc = origin[1] + 0.5 * (extent[2] + extent[3]) * spacing[1];// double xd = (extent[1] - extent[0] + 1)*spacing[0];double yd = (extent[3] - extent[2] + 1) * spacing[1];double d = camera->GetDistance();camera->SetParallelScale(0.5 * yd);camera->SetFocalPoint(xc, yc, 0.0);camera->SetPosition(xc, yc, d);// Render again to set the correct view.renderWindow->Render();// Interact with the window.renderWindowInteractor->Start();return EXIT_SUCCESS;
}

相关文章:

创建一个带有背景图层和前景图层的渲染窗口

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题&#xff1a; 创建一个带有背景图层和前景图层的渲染窗口&#xff0c;知识点&#xff1a;1. 画布转image&#xff1b;2. 渲染图层设置&#xff1b;3.…...

Docker 运行 Oracle Autonomous Database Free Container

​ Docker 运行 Oracle Autonomous Database Free Container Oracle Autonomous Database Free Container Image 介绍通过 Docker 运行 Oracle Autonomous Database Free ContainerWallet 配置可用的 TNS 别名MY_ATP TNS 别名MY_ADW TNS 别名连接到 Oracle Autonomous Databas…...

《2023全球隐私计算报告》正式发布!

2023全球隐私计算报告 1、2023全球隐私计算图谱2、国内外隐私计算相关政策3、隐私计算技术的最新发展4、隐私计算技术的合规挑战5、隐私计算的应用市场动态6、隐私计算开源整体趋势7、隐私计算的未来趋势 11月23日&#xff0c;由浙江省人民政府、商务部共同主办&#xff0c;杭州…...

JAVA sql 查询2

SELECT * FROM employees order by salayr DESC SELECT employee_id,first_name,salary from employees ORDER BY salary,employee_id desc -- 最大值 最小值 总和 平均值 SELECT max(salary),MIN(salary),sum(salary),AVG(salary) FROM employees -- 总共有多少员工 select…...

为第一个原生Spring5应用程序添加上Log4J日志框架!

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…...

单片机复位电路

有时候我们的代码会跑飞,这个时候基本上是一切推到重来.”推倒重来”在计算机术语上称为复位.复位需要硬件的支持,复位电路就是在单片机的复位管脚上产生一个信号&#xff0c;俗称复位信号.这个信号需要持续一定的时间,单片机收到该信号之后就会复位,从头执行。 复位原理: 那么…...

11.28 知识回顾(Web框架、路由控制、视图层)

一、 web 框架 1.1 web框架是什么&#xff1f; 别人帮咱们写了一些基础代码------》我们只需要在固定的位置写固定的代码--》就能实现一个web应用 Web框架&#xff08;Web framework&#xff09;是一种开发框架&#xff0c;用来支持动态网站、网络应用和网络服务的开发。这大多…...

osgFX扩展库-异性光照、贴图、卡通特效(1)

本章将简单介绍 osgFX扩展库及osgSim 扩展库。osgFX库用得比较多,osgSim库不常用&#xff0c;因此&#xff0c;这里只对这个库作简单的说明。 osgFX扩展库 osgFX是一个OpenSceneGraph 的附加库&#xff0c;是一个用于实现一致、完备、可重用的特殊效果的构架工具&#xff0c;其…...

SELinux零知识学习三十一、SELinux策略语言之角色和用户(2)

接前一篇文章:SELinux零知识学习三十、SELinux策略语言之角色和用户(1) 三、SELinux策略语言之角色和用户 SELinux提供了一种依赖于类型强制(类型增强,TE)的基于角色的访问控制(Role-Based Access Control),角色用于组域类型和限制域类型与用户之间的关系,SELinux中…...

Unity UGUI的自动布局-LayoutGroup(水平布局)组件

Horizontal Layout Group | Unity UI | 1.0.0 1. 什么是HorizontalLayoutGroup组件&#xff1f; HorizontalLayoutGroup是Unity UGUI中的一种布局组件&#xff0c;用于在水平方向上对子物体进行排列和布局。它可以根据一定的规则自动调整子物体的位置和大小&#xff0c;使它们…...

【SpringCloud】设计原则之分层架构与统一通信协议

一、设计原则之分层架构 应用分层看起来很简单&#xff0c;但每个程序员都有自己的一套方法&#xff0c;哪怕是初学者&#xff0c;所以实施起来并非易事 最早接触的分层架构应该是最熟悉的 MVC&#xff08;Model - View - Controller&#xff09;架构&#xff0c;其将应用分成…...

在Linux环境如何启动和redis数据库?

Linux中连接redis数据库&#xff1a; 前台启动&#xff1a; 第一步&#xff1a;redis-server:服务器启动命令 当我们启动改窗口后&#xff0c;出现如下所示&#xff1a; 该窗口就不能关闭&#xff0c;否则会出现redis无法使用的情况&#xff0c;重新打开一个窗口&#xff0c…...

selenium判断元素是否存在的方法

文章目录 快捷方法完整示例程序 快捷方法 selenium没有exist_xxx相关的方法&#xff0c;无法直接判断元素存在。但是锁定元素时使用的browser.find_elements(By.CSS_SELECTOR, "css元素")会返回一个列表list&#xff0c;如果不存在这个元素就会返回一个空列表。因此…...

后端真批量新增的使用

1,添加真批量新增抽象接口 public interface EasyBaseMapper extends BaseMapper { /** * 批量插入 仅适用于mysql * * return 影响行数 */ Integer insertBatchSomeColumn(Collection entityList); } 2,新增类,添加真批量新增的方法 public class InsertBatchSqlInjector ext…...

HttpRunner原来还能这么用,大开眼界!!!

hook机制 Httprunner 框架中的 hook 机制相当于unittest框架中的 setup , teardown 函数&#xff0c;用来进行测试用例执行之前的环境初始化以及测试用例执行完毕之后的环境清理操作。 httprunner 中的 hooks 机制可以用在测试用例层级也可以用在测试步骤层级&#xff0c;其关键…...

给WordPress 自带的搜索功能添加过滤只搜索文章的标题

如果想让 WordPress 自带的搜索功能只搜索文章标题&#xff0c;让搜索结果更加精确&#xff08;其实WordPress 自带的搜索功能本来模糊查找就很弱&#xff09;&#xff0c;可以将下面的代码添加到当前主题functions.php中&#xff1a; 用过滤器&#xff1a;posts_search 就可以…...

frp内网穿透

1 概述 frp 是什么? frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。frp原理 公网服务器作为服务端,内网服…...

哈希和unordered系列封装(C++)

哈希和unordered系列封装 一、哈希1. 概念2. 哈希函数&#xff0c;哈希碰撞哈希函数&#xff08;常用的两个&#xff09;哈希冲突&#xff08;碰撞&#xff09;小结 3. 解决哈希碰撞闭散列线性探测二次探测代码实现载荷因子&#xff08;扩容&#xff09; 开散列哈希桶代码实现扩…...

PHP基础与安全

基础 1. 简介概述 ●PHP是脚本语言-是一门弱类型语言&#xff0c;不需要事先编译 ●PHP 脚本在服务器上执行&#xff0c;然后向浏览器发送回纯文本的 HTML 结果 ●超文本预处理器&#xff0c;服务器端脚本语 2.创建&#xff08;声明&#xff09;PHP变量 ● 变量以 $ 符号开…...

【面试HOT200】滑动窗口篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot200】进行的&#xff0c;每个知识点的修正和深入主要参…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...