前言

  vtk的了解学习途径跟随代码中的示例,循序渐进。
  本篇详细解析Cone.exe,后在Qt中复现一样的。

 

Demo

  

 

自带示例:Cone.exe

  显示效果
  

  

示例所在位置

  

示例代码深度解析

int main()
{
// 步骤一:创建圆锥体数据源
vtkConeSource *cone = vtkConeSource::New();
cone->SetHeight( 3.0 );
cone->SetRadius( 1.0 );
cone->SetResolution( 10 ); // 步骤二:创建多边形数据映射器(注意:可以在数据源和映射器之间插入中间过滤器)
vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();
coneMapper->SetInputConnection(cone->GetOutputPort() ); // 步骤三:创建一个演员来代表圆锥体。演员协调映射器图形图元的渲染。actor还通过vtkProperty实例引用属性,并包含一个内部转换矩阵。我们将此actor的映射器设置为上面创建的coneMapper。
vtkActor *coneActor = vtkActor::New();
coneActor->SetMapper( coneMapper ); // 步骤四:创建渲染器并为其分配演员。渲染器就像一个视口。它是屏幕上窗口的一部分或全部,负责绘制它所拥有的演员。我们还在此处设置了背景颜色。
vtkRenderer *ren1= vtkRenderer::New();
ren1->AddActor( coneActor );
ren1->SetBackground( 0.1, 0.2, 0.4 ); // 步骤五:创建渲染窗口,它将显示在屏幕上。使用AddRenderer将渲染器放入渲染窗口。将渲染器大小设置为300像素乘300像素。
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer( ren1 );
renWin->SetSize( 300, 300 );
// 步骤六:现在我们循环360度,每次渲染圆锥体。
int i;
for (i = 0; i < 360; ++i)
{
// render the image
renWin->Render();
// rotate the active camera by one degree
ren1->GetActiveCamera()->Azimuth( 1 );
}
// 释放对象
cone->Delete();
coneMapper->Delete();
coneActor->Delete();
ren1->Delete();
renWin->Delete(); return 0;
}
 

复现Demo

  有一个很重要的点,这个示例代码是阻塞时的循环刷新,与Qt的基于消息的编程处理方式不一样,这是过程式的编程,我们复刻示例,保持一块Demo就一个函数,否则的话,可以使用Qt定时器来实现更新位置就可以了。

步骤一:创建圆锥体数据源

  

步骤二:创建多边形映射器

  

  

步骤三:创建演员类(类似osg模型结点)

  

  

步骤四:创建渲染器

  

  

步骤五:设置渲染器到渲染窗口

  

步骤六:用Qt的方式实现不阻塞又是过程化旋转

  

  

  

 

Demo源码

VTKWidget.cpp

void VTKWidget::test_demo3_createCone()
{
// 步骤一:创建圆锥体数据源
vtkSmartPointer<vtkConeSource> pConeSource =
VTKManager::createConeSource(0, 0, 0, 10, 30, 10);
// 步骤二:创建多边形映射器
#if 0
vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper =
VTKManager::createPolyDataMapper(pConeSource);
#else
vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper =
VTKManager::createPolyDataMapper(pConeSource->GetOutputPort());
#endif
// 步骤三:创建演员
vtkSmartPointer<vtkActor> pActor =
VTKManager::createActor(pPolyDataMapper);
// 步骤四:创建渲染器
vtkSmartPointer<vtkRenderer> pRenderer =
VTKManager::createRenderer(pActor, 0.1, 0.2, 0.4); // 步骤五:渲染器添加到QVTKWidget渲染
_pQVTKWidget->GetRenderWindow()->AddRenderer(pRenderer); // 步骤六:过程循环的方式实现旋转
QElapsedTimer elapsedTimer;
for(int index = 0; index < 360; index++)
{
LOG << index;
// render the image
_pQVTKWidget->GetRenderWindow()->Render(); elapsedTimer.start();
while(elapsedTimer.elapsed() < 10)
{
qApp->processEvents();
}
// 渲染器相机绕焦点旋转
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(vtkConeSource *pConeSource)
{
// 步骤一:智能指针定义
vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper;
// 步骤二:智能指针实例化
pPolyDataMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
// 步骤三:设置
pPolyDataMapper->SetInputConnection(pConeSource->GetOutputPort()); return pPolyDataMapper;
} vtkSmartPointer<vtkPolyDataMapper> VTKManager::createPolyDataMapper(vtkAlgorithmOutput *pAlgorithmOutput)
{
// 步骤一:智能指针定义
vtkSmartPointer<vtkPolyDataMapper> pPolyDataMapper;
// 步骤二:智能指针实例化
pPolyDataMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
// 步骤三:设置
pPolyDataMapper->SetInputConnection(pAlgorithmOutput); return pPolyDataMapper;
}
vtkSmartPointer<vtkActor> VTKManager::createActor(vtkPolyDataMapper *pPolyDataMapper)
{
// 步骤一:智能指针定义
vtkSmartPointer<vtkActor> pActor;
// 步骤二:智能指针实例化
pActor = vtkSmartPointer<vtkActor>::New();
// 步骤三:设置映射器
pActor->SetMapper(pPolyDataMapper); return pActor;
}
vtkSmartPointer<vtkRenderer> VTKManager::createRenderer(vtkActor *pActor, double r, double g, double b)
{
// 步骤一:智能指针定义
vtkSmartPointer<vtkRenderer> pRenderer;
// 步骤二:智能指针实例化
pRenderer = vtkSmartPointer<vtkRenderer>::New();
// 步骤三:设置映射器
pRenderer->AddActor(pActor);
// 步骤四:设置背景色
pRenderer->SetBackground(r, g, b); return pRenderer;
} void VTKManager::rotateAzimuth(vtkRenderer *pRenderer, double angle)
{
pRenderer->GetActiveCamera()->Azimuth(angle);
}
 

工程模板v1.2.0

  

VTK开发笔记(四):示例Cone,创建圆锥体,在Qt窗口中详解复现对应的Demo的更多相关文章

  1. FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  2. Django开发笔记四

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.邮箱激活 users app下,models.py: ...

  3. Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例

    Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13|  分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...

  4. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  5. “全栈2019”Java第四十九章:重载与重写对比详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解

    如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 最近一段时间生病了,整天往医院跑,也没状态学东西了,现在是好了不少了,也该继续学习啦!!! ...

  7. Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕

    Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...

  8. 命令创建.net core3.0 web应用详解(超详细教程)

    原文:命令创建.net core3.0 web应用详解(超详细教程) 你是不是曾经膜拜那些敲几行代码就可以创建项目的大神,学习了命令创建项目你也可以成为大神,其实命令创建项目很简单. 1.cmd命令行 ...

  9. CoolBlog开发笔记第3课:创建Django应用

    教程目录 1.1 CoolBlog开发笔记第1课:项目分析 1.2 CoolBlog开发笔记第2课:搭建开发环境 前言 经过上一节我们已经创建了CoolBlog工程,但是关于CoolBlog的功能代码 ...

  10. [APP] Android 开发笔记 002-命令行创建默认项目结构说明

    接上节:[APP] Android 开发笔记 001 4. 默认项目结构说明: 这里我使用Sublime Text 进行加载.

随机推荐

  1. C# WInFomr 窗体圆角

    #region 设置窗体圆角 /// <summary> /// 设置窗体圆角 /// </summary> /// <param name="f"& ...

  2. leetcode 69 x 的平方根 牛顿迭代法

    简介 简单的题, 直接上代码. 其实还挺复杂的. 参考链接 https://leetcode-cn.com/problems/sqrtx/solution/x-de-ping-fang-gen-by- ...

  3. SciTech-Anatomy-Tooth

    0. 牙: 成人牙:称为 恒牙,上下各16颗, 以牙科医师面对患者视角,对上下两排牙编号: - 上排:共16颗,从左到右编号 1号 - 16号, 左右两侧对称,每侧各8颗: {Molars:3,Pre ...

  4. freeswitch: ESL中如何自定义事件及自定义事件的监听

    虽然freeswitch已经内置了一些标识的事件,比如:CHANNEL_CREATE(发起呼叫时触发),CHANNEL_HANGUP_COMPLETE(电话挂断时触发)...,但是有时候我们想根据业务 ...

  5. SQLcl:不仅是 SQL*Plus 的继任者,更是 AI 时代的连接器

    在 Oracle 数据库的世界里,SQL*Plus 是开发和管理工作的标配工具.但随着数据库技术的演进和 AI 能力的嵌入,传统工具已无法满足现代数据开发.智能交互和自动化运维的需求. Oracle ...

  6. vue07-router 路由

    main.js vue init webpack //选择router import router from './router' new Vue({ el: '#app', router, comp ...

  7. 社区集结令:Dora-rs 官方交流群正式开放!

    如何能更好地服务于Dora-rs的中文开发者,是我们一直在思考的问题.为此,我们近期发布了官方中文教程,但这仅仅是一个开始. 我们深知,学习一门新技术,总会遇到各种各样的问题: 教程里的某个步骤卡住了 ...

  8. Android如何实现实时音视频会议的背景分割

    1 背景分割功能简介 ZegoEffects SDK AI视觉SDK提供背景分割功能,适用于在线教育.视频会议.美发.短视频等多种场景. 2 视频中背景分割功能实现的前提条件 在使用 ZegoEffe ...

  9. 利用MATLAB的FDATOOL工具生成IIR滤波器的verilog代码

    IIR滤波器因为其非线性相位,不稳定,设计复杂等缺点往往很少应用,但是在FPGA资源紧张或者需要一些特殊应用时,使用IIR滤波器就显得有必要了.但是网上除了杜勇老师的IIR滤波器教程之外,很少再有关于 ...

  10. [题解]AtCoder Beginner Contest 413(ABC413) A~G

    A - Content Too Large 输出Yes\(\iff \sum a_i\le m\). 时间复杂度\(O(n)\). 点击查看代码 #include<bits/stdc++.h&g ...