创建VTK应用程序(C++)
基本步骤
* 读取或生成源数据
* 过滤数据
* 绘制图形
* 交互操作
读取数据
* 读源对象:从文件中读取(调用Modified()方法,可以保证数据文件变化时,流水线重新执行)
auto objStlReader = vtkSmartPointer<vtkSTLReader>::New();
objStlReader->SetFileName("C:\\Users\\qiang.shen\\Desktop\\IronData\\XZW.stl");
* 程序源对象: 通过vtk类直接生成
//创建圆柱体
vtkCylinderSource *cylinder = vtkCylinderSource::New();
//生成圆柱体多边形的数目
cylinder->SetResolution(8);
* 一个完整的vtk流水线+图像渲染流程实例
#include <iostream>
#include "vtkCylinderSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkLODActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkProperty.h"
#include "vtkSmartPointer.h"
#include "vtkSTLReader.h"
int main()
{
创建圆柱体
//vtkCylinderSource *cylinder = vtkCylinderSource::New();
生成圆柱体多边形的数目
//cylinder->SetResolution(8);
//构建读源对象
vtkSmartPointer<vtkSTLReader> objStlReader = vtkSmartPointer<vtkSTLReader>::New();
//设置读源对象读取文件的路径
objStlReader->SetFileName("C:\\Users\\qiang.shen\\Desktop\\IronData\\XZW.stl");
//....中间可加一个或多个过滤器对象
//创建映射器对象
vtkSmartPointer<vtkPolyDataMapper> myMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
//将几何拓扑数据设置到映射器中
myMapper->SetInputConnection(objStlReader->GetOutputPort());
//创建演员对象
vtkSmartPointer<vtkLODActor> myActor = vtkSmartPointer<vtkLODActor>::New();
//将映射器对象设置到演员对象中(将流水线的最终处理结果转换成图形处理过程所需的输入)
myActor->SetMapper(myMapper);
//设置演员的颜色属性——漫反射的颜色
myActor->GetProperty()->SetDiffuseColor(1.0,1.0,1.0);
//创建绘制者对象
vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
//将演员对象Add到绘制者对象中
ren1->AddActor(myActor);
//设置绘制者对象的背景色属性
ren1->SetBackground(0.1, 0.2, 0.4);
//构建绘制窗口对象
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
//设置绘制窗口显示大小
renWin->SetSize(200, 200);
//将绘制者对象Add到绘制窗口中
renWin->AddRenderer(ren1);
//构建vtk内建的交互类对象
vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
//将绘制窗口对象与绘制交互类绑定
iren->SetRenderWindow(renWin);
//触发绘制流程及流水线
renWin->Render();//绘制
//开启交互
iren->Start();
getchar();
return 0;
}
VTK交互
内建交互类vtkRenderWindowInteractor
* vtkRenderWindowInteractor提供了预定义的事件和行为
* 允许控制Camera和Actors
* 包括操纵杆模式和跟踪球模式(默认)
操作|模式|表现
---|:--:|:--:|
按下键盘j|--|切换至操纵杆模式|
按下键盘j|--|切换至跟踪球模式|
按住鼠标左键|相机模式|绕相机焦点旋转|
按住鼠标左键|Actors模式|绕Actors原点旋转|
按住鼠标右键|相机模式|推拉相机|
按住鼠标右键|Actors模式|缩放Actors|
*按住鼠标中键*|*相机模式*|*扫视相机*|
Shift+左键|Actors模式|平移Actors|
*按下键盘3键*|--|*进入立体模式*|
*按下键盘e键*|--|*退出程序*|
按下键盘p键|--|进行拾取|
按下键盘r键|--|沿着当前视线方向重新设置相机|
按下键盘u键|--|调用用户设定的方法|
按下键盘s/w键|Actors模式|切换显示模式|
注意:表中斜体字的几项会报如下错误,原因未知,有兴趣的可以研究下
Warning: In ..\..\..\Rendering\Core\vtkRenderWindow.cxx, line 267
vtkWin32OpenGLRenderWindow (0000000002D7D250): Adjusting stereo mode on a window that does not support stereo type CrystalEyes is not possible.
具体的交互类型
vtkRenderWindowInteractor类会将它接收的事件转发给它关联的交互类型,然后由这些交互类型来响应事件
* 使用vtkInteractorStyle的子类
* 使用用户自己写的集成自vtkInteractorStyle的子类的类
//用户继承的交互类型
class PointPickerInteractorStyle : public vtkInteractorStyleTrackballCamera
{
public:
static PointPickerInteractorStyle* New();
vtkTypeMacro(PointPickerInteractorStyle, vtkInteractorStyleTrackballCamera);
virtual void OnLeftButtonDown()
{
auto rwi = this->Interactor;
if (rwi->GetControlKey())
{
}
else if (rwi->GetShiftKey())
{
}
}
virtual void OnMouseMove()
{
auto rwi = this->Interactor;
if (rwi->GetAltKey())
{
}
}
};
vtkStandardNewMacro(PointPickerInteractorStyle);
vtkSmartPointer<vtkPointPicker> pointPicker =
vtkSmartPointer<vtkPointPicker>::New();
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetPicker(pointPicker);
renderWindowInteractor->SetRenderWindow(renderWindow);
vtkSmartPointer<PointPickerInteractorStyle> style =
vtkSmartPointer<PointPickerInteractorStyle>::New();
renderWindowInteractor->SetInteractorStyle(style);