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版权协议,转载请附上原文出处链接和本声明。