入门参考的这篇(修改了很多):QT加载显示DICOM文件浏览
但还是必须在main()中先读文件再show,先show了再打开文件是黑的显示不出来(后续再查)。
//.h中要加入
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);
//.cpp中
#include "vtkCamera.h"
#include "vtkImageData.h"
void TestQtGui::SetFileName(const std::string& file)
{
m_fileName = file;
m_reader->SetFileName(m_fileName.c_str());
m_reader->Update();
m_actor->InterpolateOn();// 使用差值平滑处理,更有利于用户看清楚
m_actor->SetInputData(m_reader->GetOutput());
m_actor->SetOrientation(0, 1, 0);
m_actor->Update();
m_renderer->AddActor(m_actor);
m_renderWindow->AddRenderer(m_renderer);
ui->openGLWidget->SetRenderWindow(m_renderWindow); //QVTKOpenGLWidget
// QVTKInteractor* interactor = ui.openGLWidget->GetInteractor();
vtkRenderWindowInteractor *interactor = ui->openGLWidget->GetInteractor();
interactor->SetInteractorStyle(m_interactorStyle);
interactor->SetRenderWindow(m_renderWindow);
//下面两个都能实现重新打开文件的渲染
// interactor->GetRenderWindow->Render();
ui->openGLWidget->GetRenderWindow->Render();
interactor->Start();
}
VTK 多平面重建(MPR)及三维切片显示
BestMPRBaseVtk-005-翻车加修车
VTK教程系列:VTK基础及应用开发教程
一、基本流程
VTK 的可视化流程将需要处理的数据视作流动介质在管道中流动,因此可视化的不同阶段的数据将会有不同的处理方式,图形模型与可视化模型的结合构成了 VTK的可视化管线。
可视化模型主要用来对拟合后的数据进行处理,生成可被VTK绘制的几何形体,它包括处理对象(vtkProcessObject)与数据对象(vtkDataObject)。数据对象用于表达各种类型的数据,处理对象作用于过滤器(Filter),被用来对数据对象进行相关操作并产生新的数据对象;图形模型主要对生成的几何体进行绘制,包括相机(vtkCamera)、映射器(vtkMapper)、对象属性(vtkProperty)、灯光(vtkLight)、渲染器(vtkRenderer)、演示对象(vtkActor)及渲染窗口(vtkRenderWindows)。
在 VTK 管线中的数据流两个基本的对象[44]:流程对象(Process Object)与数据对象(Data Object)。数据对象的数据类型有许多,其父类为 vtkDataSet 类,数据结构有标准的格式。VTK 支持的数据类型有:结构网格(vtkStructureGrid)、结构点(vtkStructurePoint)、多边形数据(vtkPolyData)、非结构网格(vtkUnStructureGrid)及非结构点(vtkUnStructurePoint)等。流程对象运用数据的系统级运算法则对数据对象进行操作用来生成新的数据对象。流程对象根据其作用可分为映射对象(Mapper)、过滤器对象(Filter)以及源对象(Source)。
![](https://i-blog.csdnimg.cn/blog_migrate/6d0a73d6528edfa32c4bd7de0ab8a665.png)
#include <vtkSphereSource.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
int main()
{
//source
vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
sphereSource->Update();
//map
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(sphereSource->GetOutputPort());
//actor
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
//renderer
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
//renderWindow
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->SetWindowName("Sphere");
renderWindow->AddRenderer(renderer); //window加入render
//interactor
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
renderer->AddActor(actor);
renderWindow->Render(); //这是关键的渲染render,否则不出图
renderWindowInteractor->Start();
return 0;
}
vtkConeSource *cone = vtkConeSource::New(); //source
vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New(); //map
vtkActor *coneActor = vtkActor::New(); //actor
vtkRenderer *ren1 = vtkRenderer::New(); //renderer
vtkRenderWindow *renWin = vtkRenderWindow::New(); //renderWindow
renWin->AddRenderer( ren1 );
vtkConeSource *cone = vtkConeSource::New();
cone->SetHeight( 3.0 );
cone->SetRadius( 1.0 );
cone->SetResolution( 10 ); //准备需要渲染的数据
vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New(); //创建映射器
coneMapper->SetInputConnection( cone->GetOutputPort() ); //将准备的数据连接到映射器
vtkActor *coneActor = vtkActor::New();
coneActor->SetMapper( coneMapper ); //创建一个演员来代表数据
vtkRenderer *ren1= vtkRenderer::New();
ren1->AddActor( coneActor ); //创建一个渲染器添加演员
ren1->SetBackground( 0.1, 0.2, 0.4 ); //设置背景色
// 创建渲染窗口来显示数据
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer( ren1 );
renWin->SetSize( 300, 300 ); //设置渲染窗口的大小
// 接下来将actor逐渐旋转,每次旋转1°
int i;
for (i = 0; i < 360; ++i)
{
renWin->Render();
// 每次旋转1°
ren1->GetActiveCamera()->Azimuth( 1 );
}