VTK学习笔记二

创建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);

猜你喜欢

转载自blog.csdn.net/tianzhiyi1989sq/article/details/92079480