QT5.9 VTK8.2 基础学习(1)

1、VTK介绍

在这里插入图片描述

输入数据(Source),对数据进行滤波(Filter)操作,然后对数据进行映射(vtkMapper),将其封装成一个对象(vtkActor),再将这个对象添加到渲染场景(vtkRenderer)中,再利用渲染窗口(vtkRenderWindow)中进行渲染展示。
在这里插入图片描述
现在整个剧院就相当于一个vtk中渲染窗口vtkRenderWindow,舞台就是渲染场景vtkRenderer,演员就是一个个对象vtkActor,他们不同的容貌、服装等这些属性统称为vtkProperty,我们观众和演员的互动就是vtkRenderWindowInteractor,我们送花、拥抱、握手等这些就是交互的风格vtkInteractorStyle,舞台上的灯光就是vtkLight,每个观众的眼睛就是vtkCamera,由于我们每个观众看到的东西都是唯一的所以vtkCamera只有一个,但是灯光vtkLight却可以是多个的。

2、实例

在这里插入图片描述
QtVTKTest.h

#pragma once
#include <QtWidgets/QWidget>
#include "ui_QtVTKTest.h"
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <vtkOutputWindow.h>
#include <vtkSmartPointer.h> 
#include <vtkImageViewer2.h>
#include <vtkJPEGReader.h>
#include <vtkPNGReader.h>
#include <vtkTIFFReader.h>
#include <vtkBMPReader.h>
#include <vtkDICOMImageReader.h>
#include <vtkNamedColors.h>
#include <vtkFloatArray.h>
#include <array>
#include <vtkPolyDataMapper.h>
#include <vtkCellArray.h>
#include <vtkCellArray.h>
#include <vtkCamera.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkRenderer.h>
#include <vtkPolyDataMapper.h>
#include <vtkNew.h>
#include<vtkConeSource.h>
#include<vtkPolyDataMapper.h>
#include<vtkRenderWindow.h>
#include<vtkRenderWindowInteractor.h>
#include<vtkInteractorStyleTrackballCamera.h>
#include <vtkLight.h>
#include <vtkCubeSource.h>
#include <vtkTriangleFilter.h>
#include <vtkMassProperties.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkSphereSource.h>
#include <vtkTransform.h>
#include <vtkAxesActor.h>
#include <vtkCylinderSource.h>
#include "vtkInteractorStyleTrackballCamera.h"
#include <vtkTexture.h>
#include <vtkBMPReader.h>
#include <vtkImageViewer2.h>
#include <vtkEventQtSlotConnect.h>
#include <qdebug.h>
#include <vtkAxesActor.h>

class QtVTKTest : public QWidget
{
	Q_OBJECT

public:
	QtVTKTest(QWidget *parent = Q_NULLPTR);
	void renderImg();
	void VTKWidget5();
	void VTKWidget6();
	void VTKWidget7();

public slots:
	//响应鼠标移动的消息,实时输出鼠标的当前位置	
	void updateCoords(vtkObject* obj);

private:
	Ui::QtVTKTestClass ui;
};

QtVTKTest.cpp

#include "QtVTKTest.h"

QtVTKTest::QtVTKTest(QWidget *parent)
	: QWidget(parent)
{
	vtkOutputWindow::SetGlobalWarningDisplay(0);//不弹出vtkOutputWindow窗口
	ui.setupUi(this);
	renderImg();
	VTKWidget5();
	VTKWidget6();
	VTKWidget7();
}

void QtVTKTest::renderImg()
{
	// bmp图片
	vtkSmartPointer<vtkBMPReader> render = vtkSmartPointer<vtkBMPReader>::New();
	render->SetFileName("C:\\Users\\Administrator\\Desktop\\N\\1.bmp");
	render->Update();
	vtkSmartPointer<vtkImageViewer2> viewer = vtkSmartPointer<vtkImageViewer2>::New();
	viewer->SetInputData(render->GetOutput());
	viewer->SetRenderWindow(ui.qvtkWidget->GetRenderWindow());
	viewer->Render();

	// jpg图片
	vtkSmartPointer<vtkJPEGReader> render1 = vtkSmartPointer<vtkJPEGReader>::New();
	render1->SetFileName("C:\\Users\\Administrator\\Desktop\\新建文件夹\\111.jpg");
	render1->Update();

	vtkSmartPointer<vtkImageViewer2> viewer1 = vtkSmartPointer<vtkImageViewer2>::New();
	viewer1->SetInputData(render1->GetOutput());
	viewer1->SetRenderWindow(ui.qvtkWidget_2->GetRenderWindow());
	viewer1->Render();
	
	// PNG图片
	vtkSmartPointer<vtkPNGReader> render2 = vtkSmartPointer<vtkPNGReader>::New();
	render2->SetFileName("C:\\Users\\Administrator\\Desktop\\新建文件夹\\111.png");
	render2->Update();

	vtkSmartPointer<vtkImageViewer2> viewer2 = vtkSmartPointer<vtkImageViewer2>::New();
	viewer2->SetInputData(render2->GetOutput());
	//viewer2->SetRenderWindow(ui.qvtkWidget_3->GetRenderWindow());
	//viewer2->Render();

	// ConeSource
	// 创建圆锥模型 Source
	// 输入数据(Source)-> 对数据进行滤波(Filter)操作 -> 然后对数据进行映射(vtkMapper)->
	// 将其封装成一个对象(vtkActor)->将这个对象添加到渲染场景(vtkRenderer)中,再利用渲染窗口->(vtkRenderWindow)中进行渲染展示。
	vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();
	cone->SetHeight(3.0);
	cone->SetRadius(1.0);
	cone->SetResolution(10.0);
	cone->SetCenter(2, 2, 2);

	// 映射器 Mapper
	vtkSmartPointer<vtkPolyDataMapper> coneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	coneMapper->SetInputConnection(cone->GetOutputPort());

	// 对象 Actor
	vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
	coneActor->SetMapper(coneMapper);

	// 添加坐标轴
	vtkSmartPointer<vtkAxesActor> actor2 = vtkSmartPointer<vtkAxesActor>::New();
	actor2->SetPosition(0, 0, 0);//设置中心点
	actor2->SetTotalLength(2, 2, 2);//设置坐标轴长度
	actor2->SetShaftType(0);
	actor2->SetAxisLabels(0);//坐标轴方向x,y,z是否显示,内部为bool类型
	actor2->SetCylinderRadius(0.02);//设置坐标轴宽度

	// 渲染
	vtkSmartPointer<vtkRenderer> coneRender = vtkSmartPointer<vtkRenderer>::New();
	coneRender->AddActor(coneActor);
	coneRender->AddActor(actor2);
	coneRender->SetBackground(0.0, 0.5, 0.5);

	// 加入灯光,灯光肯定不是唯一的,是可以存在多个的。首先我们先实例化一个灯光,灯光颜色设置为绿色、位置在(0,0,1)

	//加入灯光
	//**灯光1
	vtkSmartPointer<vtkLight> light1 = vtkSmartPointer<vtkLight>::New();
	light1->SetColor(0, 1, 0);//设置灯光颜色为绿色
	light1->SetPosition(0, 0, 1);//设置灯光的位置
	light1->SetFocalPoint(coneRender->GetActiveCamera()->GetFocalPoint());//设置灯光的焦点
	coneRender->AddLight(light1);//将其添加到渲染场景中
							   //**灯光2
	vtkSmartPointer<vtkLight>light2 = vtkSmartPointer<vtkLight>::New();
	light2->SetColor(1, 0, 0);
	light2->SetPosition(0, 0, -1);
	light2->SetFocalPoint(coneRender->GetActiveCamera()->GetFocalPoint());
	coneRender->AddLight(light2);

	//相机
	//**方法一
	//vtkSmartPointer<vtkCamera>camera = vtkSmartPointer<vtkCamera>::New();
	//camera->SetPosition(0, 5, 0);
	//camera->SetFocalPoint(0, 0, 0);
	//camera->SetViewUp(0, 0, 0.5);
	//coneRender->SetActiveCamera(camera);
	
	// 方法二(使用自带的相机进行设置)
	coneRender->GetActiveCamera()->SetPosition(0,5,0);
	coneRender->GetActiveCamera()->SetFocalPoint(0, 0, 0);
	coneRender->GetActiveCamera()->SetViewUp(0, 0, 0.5);
	coneRender->ResetCamera();

	// 渲染窗口
	vtkSmartPointer<vtkRenderWindow> coneWin = vtkSmartPointer<vtkRenderWindow>::New();
	coneWin->AddRenderer(coneRender);
	ui.qvtkWidget_3->SetRenderWindow(coneWin);

}

void QtVTKTest::VTKWidget5()
{
	// 数据
	vtkSmartPointer<vtkSphereSource> sphereSource =	vtkSmartPointer<vtkSphereSource>::New();
	sphereSource->SetCenter(0.1, 0.1, 0.1);
	sphereSource->SetRadius(0.5);
	
	// 映射器
	vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
	
	// 演员
	vtkSmartPointer<vtkActor> sphereActor =vtkSmartPointer<vtkActor>::New();
	sphereActor->SetMapper(sphereMapper);
	
	// 渲染
	vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(sphereActor);
	renderer->SetBackground(0.0, 0.6, 0.6);

	// 窗口
	vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(renderer);
	ui.qvtkWidget_4->SetRenderWindow(renderWindow);

}

void QtVTKTest::VTKWidget6()
{
	// Source(生成一个中心在渲染场景原点圆柱体、并设置高,半径,柱体横截面的等边多边形的边数)
	vtkSmartPointer<vtkCylinderSource> cylinder =  vtkSmartPointer<vtkCylinderSource>::New();
	cylinder->SetHeight(3.0);
	cylinder->SetRadius(1.0);
	cylinder->SetResolution(10);
	
	// 映射器(渲染多边形几何数据,将输入的数据转成几何图元)
	vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	cylinderMapper->SetInputConnection(cylinder->GetOutputPort());

	// 演员 (派生自vtkProp类,渲染场景中数据的可视化)
	vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();
	cylinderActor->SetMapper(cylinderMapper);
	
	// 加载PNG图片
	vtkSmartPointer<vtkPNGReader>pngReader = vtkSmartPointer<vtkPNGReader>::New();
	pngReader->SetFileName("C:\\Users\\Administrator\\Desktop\\新建文件夹\\111.png");

	vtkSmartPointer<vtkTexture>texture = vtkSmartPointer<vtkTexture>::New();
	texture->SetInputConnection(pngReader->GetOutputPort());
	texture->InterpolateOn();
	// Actor贴纹理图
	cylinderActor->SetTexture(texture);

	// 渲染(负责管理场景的渲染过程)
	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(cylinderActor);
	renderer->SetBackground(0.1, 0.2, 0.4);

	// 设置灯光
	vtkSmartPointer<vtkLight> myLight = vtkSmartPointer<vtkLight>::New();
	myLight->SetColor(0, 1, 0);
	myLight->SetPosition(0, 0, 1);
	myLight->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());
	renderer->AddLight(myLight);

	vtkSmartPointer<vtkLight> myLight2 = vtkSmartPointer<vtkLight>::New();
	myLight2->SetColor(0, 0, 1);
	myLight2->SetPosition(0, 0, -1);
	myLight2->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());
	renderer->AddLight(myLight2);

	// (操作系统与VTK渲染引擎连接到一起,可以有多个vtkRenderer对象)
	ui.qvtkWidget_5->GetRenderWindow()->AddRenderer(renderer);


	//vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
	//renWin->AddRenderer(renderer);

	//vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	//iren->SetRenderWindow(renWin);

	//vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	//iren->SetInteractorStyle(style);

	//iren->Initialize();
	//iren->Start();
}

void QtVTKTest::VTKWidget7()
{
	vtkSmartPointer< vtkImageViewer2 > m_pImageViewer = vtkSmartPointer< vtkImageViewer2 >::New();
	vtkSmartPointer< vtkRenderer > m_pRenderder = vtkSmartPointer< vtkRenderer >::New();

	// 设置m_QVTKWidget的渲染器	
	vtkSmartPointer<vtkPNGReader>pngReader = vtkSmartPointer<vtkPNGReader>::New();
	pngReader->SetFileName("C:\\Users\\Administrator\\Desktop\\新建文件夹\\111.png");
	pngReader->Update();

	// 将reader的输出作为m_pImageViewer的输入,并设置m_pImageViewer与渲染器m_pRenderer的关联
	m_pImageViewer->SetInputData(pngReader->GetOutput());
	m_pImageViewer->SetRenderWindow(ui.qvtkWidget_6->GetRenderWindow());
	m_pImageViewer->Render();

	vtkEventQtSlotConnect* m_Connections = vtkEventQtSlotConnect::New();
	m_Connections->Connect(ui.qvtkWidget_6->GetRenderWindow()->GetInteractor(),
			vtkCommand::MouseMoveEvent,this,SLOT(updateCoords(vtkObject*)));	
}

void QtVTKTest::updateCoords(vtkObject* obj)
{
	// 获取交互器
	vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::SafeDownCast(obj);

	// 获取鼠标的当前位置
	int event_pos[2];
	iren->GetEventPosition(event_pos);

	QString str;
	str.sprintf("x=%d : y=%d", event_pos[0], event_pos[1]);
	qDebug() << str;
	//m_StatusBar->showMessage(str);
}

版权声明:本文为weixin_45715405原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。