在搭建好C#的VTK开发环境下,成功编译运行第一个窗口应用示例程序“WindowsFormsHello”后,对主要程序进行了详细的注释,供大家学习参考。
核心函数renderWindowControl1_Load:
private void renderWindowControl1_Load(object sender, EventArgs e)
{
// 1.Create a simple sphere. A pipeline is created.
// 1.新建球体,创建“管道pipeline”。
// 1.1 新建数据--“数据源Source”-- 球体
vtkSphereSource sphere = vtkSphereSource.New(); // 新建球
sphere.SetThetaResolution(8); // 设置球纬度参数
sphere.SetPhiResolution(16); // 设置球经度参数
// 1.2 数据加工 -- "过滤器Filter" -- 收缩
vtkShrinkPolyData shrink = vtkShrinkPolyData.New(); // 新建数据收缩操作器
shrink.SetInputConnection(sphere.GetOutputPort()); // 连接管道
shrink.SetShrinkFactor(0.9); // 收缩“面”操作
// 1.3 数据制图 -- "制图器Mapper"
vtkPolyDataMapper mapper = vtkPolyDataMapper.New(); // 新建制图器
mapper.SetInputConnection(shrink.GetOutputPort()); // 连接管道
// 2.The actor links the data pipeline to the rendering subsystem
// 2.创建“角色Actor”,连接“管道pipeline”和“渲染系统rendering subsystem”
// 2.1 新建角色--“角色Actor”
vtkActor actor = vtkActor.New(); // 新建角色
actor.SetMapper(mapper); // 传递制图器
actor.GetProperty().SetColor(1, 0, 0); // 设置“角色”颜色[RGB]
// 2.2 Create components of the rendering subsystem
// 2.2 创建渲染--“渲染系统rendering subsystem”
// (1)新建“渲染器Renderer”和“渲染窗口RenderWindow”
// renderWindowControl1控件提供“渲染窗口”
vtkRenderer ren1 = renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer();
vtkRenderWindow renWin = renderWindowControl1.RenderWindow;
// Add the actors to the renderer, set the window size
// (2)将“角色Actor”添加到“渲染器Renderer”并渲染
ren1.AddViewProp(actor); // 渲染器添加角色
renWin.SetSize(250, 250); // 设置渲染窗口大小[无效语句]
renWin.Render(); // 渲染渲染窗口
// (3)设置"相机Camera"
vtkCamera camera = ren1.GetActiveCamera(); // 新建相机
camera.Zoom(1.5); // 相机缩放
}
}
说明:英文为官方原注释,汉字注释为笔者添加。
从结构上看,VTK程序段落主要包含两个部分。一是数据和管道部分,二是角色和渲染部分。其工作的基本流程是“数据源Souce”--“过滤器Filter”-- “制图器Mapper”-- “角色Actor”--“渲染器Renderer”。 从对象和语言上看,VTK的类和方法实现简介,程序清晰,可读性好,这也是C#的特点。VTK对OpenGL进行了面向对象的封装,并设置了大量简单易用的默认值,如“球体”的半径为5,球心位于(0,0,0), “摄像机camera”的默认视点在(0,0,0)等。有OpenGL编程经历的程序员都清楚,没有这些默认值的OpenG程序,一个参数设置不好,三维窗口里真不知道会看到啥!关键是根据画面,你还不知道该如何修正程序或参数,因为你根本就不知道问题出在哪。
作为第一个上手的VTK示例,你可以试着简单调整语句中的相关参数,如球的边数,颜色等,并运行看看效果。如果有能力,还可以添加些语句,如球的半径等。或在此示例上的几簇号上进一步拓展VTK应用。
如果看完这些注解你还是“丈二和尚摸不着头脑”,请补充阅读一些相关知识点吧。首先是OpenGL,什么是坐标系统,什么是空间变换,什么是“管道”,什么是纹理映射等等。其次,找点VTK的资料,补充理论知识后再动手操作。
关于VTk的学习资料推荐如下:
1.《VTK User's Guide》。注意:我指的是Kitware公司出版的英文书籍,详细介绍VTK的使用方法。ActiViz自带的用户手册相当粗略,用处有限。有条件的朋友(有钱,英文好),请登录Kitware公司网页,购买正版书。没条件的也不要急,CSDN上的“东灵工作室”(详址请咨询百娘)有系列博客,逐章翻译了《VTK User's Guide》,这真的是当代活雷锋!唯一遗憾的是,该书示例均为C++,Python,Java或Vcl编写,C#用户需自行转换和调试。
2.官方离线帮助文档。请在https://www.vtk.org/download/中寻找帮助文档“vtkDocHtml-X.X.X.tar.gz"并下载。
注意:开发的ActiViz版本对应的是VTK5,所以下载尽量接近版本的帮助文档。
此处下载的是6.3版本,解压缩后有900多兆,找到"index.html"文件后运行效果如下(离线运行):
你可以通过帮助文档查询到VTK所有类的详细资料,非常受用,学习工作必备!