vtk创建点

news2024/11/18 8:28:02

使用vtk库创建三维空间中的点

  • 引言
  • 开发环境
  • 示例一
    • 项目结构
    • 实现代码
  • 运行效果
  • 示例二
    • 项目结构
    • 实现代码
  • 运行效果
  • 总结

引言

本文仅适合初学者。
本文不提供vtk动态库的生成,以及在QtCreator中的引进vtk时的配置。
本文先由示例一开始,然后再在示例一的基础上进行改进,最后呈现出满天星的效果。其中示例一仅是在三维空间中展示一些点,即使用vtk创建点;示例二在示例一基础之上,进行改动。最后呈现的效果如下:

开发环境

使用vtk9.2的库,在QtCreator中创建空项目。其中QtCreator使用的是4.11.2,Qt的版本是5.14.2。

示例一

项目结构

在这里插入图片描述

实现代码

由于创建的空项目,所以项目创建之后只有一个空的.pro文件,需要自己编写pro文件,pro文件的内容如下:
testVtkPoints.pro

QT       += core #gui

#greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11 vtk9.2

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp

SOUPDIR = $$PWD/../../SOUPdependency
vtk9.2 {
    contains(QT_ARCH, x86_64) {
        include($$SOUPDIR/vtk-9.2/vtk-9.2.pri)
    } else {
        include($$SOUPDIR/vtk-9.2-2017-omp-win32/vtk-9.2.pri)
    }
    DEFINES += vtkEventDataButton3D=vtkEventDataDevice3D
    DEFINES += vtkEventDataMove3D=vtkEventDataDevice3D
}

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

main.cpp

#include <vtkSmartPointer.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include<vtkCamera.h>

//注意:不加下面的初始化模块,程序运行时不会有窗口展现(啥也没有)
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);//渲染
VTK_MODULE_INIT(vtkInteractionStyle);//交互样式
VTK_MODULE_INIT(vtkRenderingFreeType)//文本图像
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)//体素

int main(int argc,char*argv[])
{
    double dPoints[8][3] = {{0.2,2.1,3.1},{1.0,2.6,7.0},{5.0,9.2,5.0},{21.0,3.0,4.5},{5.6,7.2,4.9},{4.5,6.3,9.0},{13.0,3.4,5.6},{26.0,7.8,5.6}};

    vtkSmartPointer<vtkPolyData> polyData =vtkSmartPointer<vtkPolyData>::New();
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> cellArrays = vtkSmartPointer<vtkCellArray>::New();

    cellArrays->InsertNextCell(8);//指定点的个数
    for(int i = 0; i < 8;++i)
    {
        points->InsertPoint(i,dPoints[i]);
        cellArrays->InsertCellPoint(i);
    }

    polyData->SetPoints(points);
    polyData->SetVerts(cellArrays);

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polyData);

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New();
    render->AddActor(actor);
    render->ResetCamera();
    render->SetBackground(0.12,0.56,1);

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(render);
    renderWindow->SetSize(600,500);
    renderWindow->Render();

    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    interactor->Initialize();
    interactor->Start();

    return 0;
}

运行效果

在这里插入图片描述
由于视频制作的时候背景上出现了许多白色斑点,故而上面的视频呈现的效果不是很好。

示例二

由于示例一呈现的效果,让我想起了漫天星星的感觉,故而想做个漫天星星来看看。在上面的示例一的基础上,进行改进。

项目结构

其结构和示例一一样。

实现代码

其中pro文件不变,改变的是main.cpp.
main.cpp

#include <vtkSmartPointer.h>
#include <vtkActor.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkPolyData.h>

//注意:不加下面的初始化模块,程序运行时不会有窗口展现(啥也没有)
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);//渲染
VTK_MODULE_INIT(vtkInteractionStyle);//交互样式
VTK_MODULE_INIT(vtkRenderingFreeType)//文本图像
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)//体素

vtkSmartPointer<vtkActor> createActor(int nCount,double pPointSet[][3],double dPointSize = 1.0)
{
    vtkSmartPointer<vtkPolyData> polyData =vtkSmartPointer<vtkPolyData>::New();
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> cellArrays = vtkSmartPointer<vtkCellArray>::New();

    cellArrays->InsertNextCell(nCount);//指定点的个数
    for(int i = 0; i < nCount;++i)
    {
        points->InsertPoint(i,pPointSet[i]);
        cellArrays->InsertCellPoint(i);
    }

    polyData->SetPoints(points);
    polyData->SetVerts(cellArrays);

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polyData);

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetPointSize(dPointSize);
    return actor;
}

int main(int argc,char*argv[])
{
    double dPoints[8][3] = {{0.2,2.1,3.1},{1.0,2.6,7.0},{5.0,9.2,5.0},{21.0,3.0,4.5},{5.6,7.2,4.9},{4.5,6.3,9.0},{13.0,3.4,5.6},{26.0,7.8,5.6}};
    vtkSmartPointer<vtkActor> actor = createActor(8,dPoints,2);

    double dPoint1s[8][3] = {{5.2,2.1,3.1},{1.0,22.6,7.0},{5.0,19.2,5.0},{11.0,3.0,4.5},{5.6,23.2,4.9},{4.5,12.3,9.0},{13.0,6.4,5.6},{6.0,7.8,5.6}};
    vtkSmartPointer<vtkActor> actor1 = createActor(8,dPoint1s,3);

    double dPoint2s[24][3] = {{25.2,2.1,3.1},{12.0,22.6,7.0},{5.0,1.2,5.0},{11.0,3.0,5.5},{5.6,33.2,4.9},{4.5,22.3,9.0},{13.0,2.4,5.6},{6.0,5.8,5.6},
                             {5.2,2.1,13.1},{1.0,2.6,7.0},{5.0,19.2,15.0},{11.0,13.0,4.5},{5.6,2.2,42.9},{4.5,11.3,23.0},{13.0,6.3,5.6},{6.0,7.8,5.6},
                             {5.2,12.1,3.1},{1.0,32.6,7.0},{5.0,9.2,5.0},{11.0,3.0,14.5},{5.6,23.2,4.9},{4.5,12.3,9.0},{13.0,6.4,5.6},{6.0,9.8,5.6}};
    vtkSmartPointer<vtkActor> actor2 = createActor(24,dPoint2s);

    vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New();
    render->AddActor(actor);
    render->AddActor(actor1);
    render->AddActor(actor2);
    render->ResetCamera();
    render->SetBackground(0.12,0.56,1);

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(render);
    renderWindow->SetSize(600,500);
    renderWindow->Render();

    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    interactor->Initialize();
    interactor->Start();

    return 0;
}

运行效果

在这里插入图片描述
没有插入太多的点,动图这里就不再展示。

总结

以对象actor为准,向渲染器中加入对象actor,一个渲染器中可以加入多个对象,每一个对象可以通过其属性设置其颜色,大小等。数据源经映射器映射,为对象中设置映射器。实际上渲染窗口最终展示的便为我们创建的对象。此些文本,为自己理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

aws使用外部 ID对其他账号授权

点击前往授权,进入控制台 https://signin.aws.amazon.com/signin?redirect_urihttps%3A%2F%2Fconsole.aws.amazon.com%2Fconsole%2Fhome%3FhashArgs%3D%2523%26isauthcode%3Dtrue%26state%3DhashArgsFromTB_eu-north-1_f2d9c316b93c0026&client_idarn%3Aaws%3Asignin%3A%…

Glassdoor美国公司员工及面试者评价数据

一、数据简介 除了股东、债权人、政府等外部利益相关者外&#xff0c;员工的利益更应该得到公司的恰当保护&#xff0c;因为员工才是公司创造价值的真正主体。提高企业在产品市场的竞争力&#xff0c;首先就是要提高员工对企业的满意度&#xff0c;只有员工的满意度更高、幸福感…

7个技巧,助你同时轻松管理和跟踪多个项目

仅仅想到要兼顾这么多重要的职责&#xff0c;就会让许多专业的项目经理感到焦虑。当涉及多个项目的多种项目管理工具的处理&#xff0c;即使对于了解项目管理的项目经理来说&#xff0c;也是一项艰巨的任务&#xff0c;而对于在这个领域没有经过适当培训的人来说&#xff0c;这…

强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解项目实战

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

计算机网络—数据链路层

文章目录 数据链路层服务差错编码多路访问协议信道划分随机访问MAC协议 数据链路层服务 该层中的帧数据结构&#xff1a; 帧头部会因为不同的局域网协议而不同&#xff0c;因此会在另一篇博文中继续介绍不同的帧数据报&#xff0c;不在本博文介绍。&#xff08;不过除了PPP协…

Docker学习笔记11

Docker容器镜像&#xff1a; 1&#xff09;docker client 向docker daemon发起创建容器的请求&#xff1b; 2&#xff09;docker daemon查找本地有客户端需要的镜像&#xff1b; 3&#xff09;如无&#xff0c;docker daemon则到容器的镜像仓库中下载客户端需要的镜像&#…

线性代数基础--向量

目录 向量的概念 基本概念 抽象概念 向量的意义 几何意义 物理意义 欧式空间 特点和性质 行向量与列向量 行向量 列向量 两者的关系 向量的基本运算与范数 向量的基本运算 向量的加法 数乘运算&#xff08;实数与向量相乘&#xff09; 转置 向量的范数 向量…

echart 设置柱状图y轴最大刻度

start 最近接到需求希望柱状图 y轴最大高度可以略高一些&#xff1b;柱状图的数据能展示在柱状图的上方 记录一下相关配置项 解决方案 官方文档说明 https://echarts.apache.org/zh/option.html#xAxis.max 效果 代码 {key: business,title: {text: 业务领域分类,textSt…

DAY32:回溯算法(七)全排列+全排列Ⅱ(排列问题)

文章目录 46.全排列思路树形图used数组的作用 伪代码完整版时间复杂度总结 47.全排列Ⅱ思路树形图 完整版时间复杂度总结 46.全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xf…

C#和LABVIEW的对决:哪种上位机编程语言更适合你?

今天&#xff0c;我们将谈论主流的上位机编程语言。你听说过C#和LABVIEW吗&#xff1f;它们是的上位机编程语言&#xff0c;C#作为自动化主流编程语言特别受欢迎&#xff0c;LABVIEW用于自动化测试&#xff0c; 首先&#xff0c;我们来了解C#语言。C#是一种文本语言&#xff0c…

2023年江西省研究生数模竞赛植物的多样性

2023年江西省研究生数模竞赛 植物的多样性 原题再现 植物作为食物链中的生产者&#xff0c;通过光合作用吸收二氧化碳&#xff0c;制造氧气&#xff0c;同时为其他生物提供食物和栖息地&#xff0c;支持它们的生存。植物在生态系统中还起到防止水土流失、缓解温室效应等作用。…

新手小白编程利器!Debug 断点调试工具IDEA

前言 很多新手小白在学习的时候总会遇到一个问题&#xff1a; 我们一运行程序&#xff0c;只能看到程序最后的结果&#xff0c;但是这个程序究竟是怎么一步步运行出这样的结果呢&#xff1f;如果有一个工具能够让我们看到我们程序的执行流程该有多好~ 这就需要用到新手小白编程…

modbus转MQTT网关支持自定义JSON格式

在工业自动化系统中&#xff0c;Modbus是一种非常常见的通信协议&#xff0c;而OPC UA则是近年来兴起的一种新型通信协议。由于各种设备之间使用的通信协议不尽相同&#xff0c;因此需要一种能够实现多种协议转换的网关产品。BL110网关就是一款能够实现Modbus到OPC UA转换的产品…

硬件设计-PLL篇(下)

目录 概要 整体架构流程 技术名词解释 技术细节 1.环路滤波器采用有源滤波器还是无源滤波器&#xff1f;、 2.如何设计 VCO 输出功率分配器&#xff1f;、 3.如何设置电荷泵的极性&#xff1f; 4.锁定指示电路如何设计&#xff1f; 小结 概要 提示&#xff1a;这里可以添加技术…

学习Spring的补充

《JavaEE 框架整合开发入门到实践 》这本书还是太浅了 &#xff0c;需要补充一些基本的知识。 首先修改一下快捷键&#xff0c;使得可以像eclipse一样使用alt/ 快速补全代码。 参考博客&#xff1a; (33条消息) IDEA 设置代码提示或自动补全的快捷键_idea补全提示_thirty.st…

【Java核心技术】面向对象编程

面向对象编程 1、面向过程与面向对象面向过程(POP)与面向对象(OOP)面向对象的三大特征面向对象的思想概述 2、Java语言基本元素&#xff1a;类和对象类和对象类和对象的使用&#xff08;面向对象思想落地的实现&#xff09;对象的创建和使用&#xff1a;内存解析 3、类的成员之…

【瑞萨RA6系列】CoreMark移植完全指南——UART输出和SysTick计时

一、CoreMark简介 什么是CoreMark&#xff1f; 来自CoreMark首页的解释是&#xff1a; CoreMark is a simple, yet sophisticated benchmark that is designed specifically to test the functionality of a processor core. Running CoreMark produces a single-number scor…

tomcat进程注入

跟随上一篇《java进程注入》 这里使用memShell https://github.com/rebeyond/memShell 将agent.jar和inject.jar放到tomcta的web目录下 然后输入命令注入 效果&#xff1a; 注入成功后 可以看到agent.jar文件为了防止发现&#xff0c;自动清除&#xff0c;而且重启电脑之后&…

【Python数据分析】Python中axis的理解

axis用来为超过一维的数组定义属性。 理解时从数据变化的方向入手&#xff01; 以二维数据为例&#xff0c;在二维数据中&#xff0c;1表示横轴&#xff0c;方向从左到右&#xff1b;0表示纵轴&#xff0c;方向从上到下从数轴的方向入手&#xff0c;理解数据变化&#xff0c;a…

测试这碗饭,你还拿得稳吗?

今年测试行业格外寒冷&#xff0c;大部分人为了糊口饭吃&#xff0c;紧紧地捂住了本来已经很嫌弃的饭碗&#xff0c;以便挺过寒冬迎接春天。 公司天天加班&#xff0c;新出了各种扣款制度&#xff0c;为了上老下小我忍了。 2022年度的绩效&#xff0c;2023年都要过完了&#xf…