增加一个button,将renderWindowControl的定义由方法内局部变量改为在类中定义,双击新增加的button,编写事件处理程序如下:
vtkSphereSource sphere = vtkSphereSource.New();
//创建一个简单的球体。
//public class vtkPolyDataAlgorithm : vtkAlgorithm
//vtkPolyDataAlgorithm-只生成polydata作为输出的算法的超类
//public class vtkSphereSource : vtkPolyDataAlgorithm
//vtkSphereSource-创建以原点为中心的多边形球体
//vtkSphereSource创建以原点为中心的指定半径的球体(由多边形表示)。
//可以指定纬度(φ)和经度(θ)方向上的分辨率(多边形离散化)。
//也可以通过指定最大φ和θ角来创建部分球体。
//默认情况下,球体的曲面细分使用三角形;
//但是,可以设置LatLongTessellation以使用四边形生成细分。
//警告分辨率是指完整球体的经纬线数。
//如果创建部分球体,则纬度/经度线的数量可能会减少1。
//其静态的New()方法可以在φ和θ方向上构造半径为0.5且默认分辨率为8的球体。
//θ的范围为(0~360),φ的范围为(0~180)度。
vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
mapper.SetInputConnection(sphere.GetOutputPort());
vtkActor actor = vtkActor.New();
//actor将数据管道链接到渲染系统
actor.SetMapper(mapper);
actor.GetProperty().SetColor(1, 0, 0);
vtkRenderer VTKrenderer= renderWindowControl.RenderWindow.GetRenderers().GetFirstRenderer();
vtkRenderWindow RenderWin= renderWindowControl.RenderWindow;
VTKrenderer.AddViewProp(actor);
//将actor添加到渲染器
vtkCamera camera = VTKrenderer.GetActiveCamera();
VTKrenderer.ResetCamera();
RenderWin.Render();
运行程序,点击第一个按钮,显示背景,再点击第二个按钮,显示一个红色小球,使用鼠标可以旋转小球
我们可以在数据源和mapper之间添加过滤器,其实就是各种算法,程序修改如下,红色字体为修改或添加的语句
vtkSphereSource sphere = vtkSphereSource.New();
vtkShrinkPolyData shrink = vtkShrinkPolyData.New();
//public class vtkShrinkPolyData : vtkPolyDataAlgorithm
//vtkShrinkPolyData-收缩组成PolyData的单元格
//vtkShrinkPolyData将构成多边形数据集的单元向其质心收缩。
//(例如顶点、直线、多边形和三角形条带)
//单元的质心计算为单元点的平均位置。收缩导致单元彼此断开。
//此筛选器的输出数据集类型为多边形数据。
//在执行过程中,过滤器将其输入单元格数据传递到其输出。
//点数据属性将复制到收缩过程中创建的点。
//利用vtk的典型流程是:读取或生成一些数据,过滤(filter)它,渲染(render)它,
//然后与它交互。有两种基本的获取数据的方式。这些数据可能是存在文件中,
//需要读入vtk系统。数据也可能由一些方法生成(通过算法或数学表达)。
//获取数据用于渲染管线初始化的过程称作源对象(source object),
//用于生成数据的源对象称为过程对象(procedural object),
//用于读取数据的对象称为读取器对象(reader object)。
//比如vtkCylinderSource源对象,用于生成圆柱的多边形表示,
//它的输出是圆柱(cylinder),可以作为多边形数据映射器的输入。
//比如vtkSphereSource源对象,用于生成球面的多边形表示,
//它的输出是球(sphere),可以作为多边形映射器的输入,
//在输入之前可以进行收缩操作vtkShrinkPolyData,收缩后可以看见球面的三角形表示。
shrink.SetInputConnection(sphere.GetOutputPort());
shrink.SetShrinkFactor(0.5);
vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
mapper.SetInputConnection(shrink.GetOutputPort());
vtkActor actor = vtkActor.New();
actor.SetMapper(mapper);
actor.GetProperty().SetColor(1, 0, 0);
vtkRenderer VTKrenderer= renderWindowControl.RenderWindow.GetRenderers().GetFirstRenderer();
vtkRenderWindow RenderWin= renderWindowControl.RenderWindow;
VTKrenderer.AddViewProp(actor);
vtkCamera camera = VTKrenderer.GetActiveCamera();
VTKrenderer.ResetCamera();
RenderWin.Render();
程序运行效果如下:
从结构上看,VTK程序段落主要包含两个部分。一是数据和管道部分,二是角色和渲染部分。其工作的基本流程是“数据源Souce”--“过滤器Filter”-- “制图器Mapper”-- “角色Actor”--“渲染器Renderer”。 从对象和语言上看,VTK的类和方法实现简洁,程序清晰,可读性好,这也是C#的特点。VTK对OpenGL进行了面向对象的封装,并设置了大量简单易用的默认值,如“球体”的半径为5,球心位于(0,0,0), “摄像机camera”的默认视点在(0,0,0)等。
作为第一个上手的VTK示例,你可以试着简单调整语句中的相关参数,如球的颜色等,并运行看看效果。如果有能力,还可以添加些语句,如球的半径等。
在完成和理解第一个C#的VTK示例后,我们梳理一下"角色Actor"、"渲染器Renderer"和C#中"renderWindowControl.RenderWindow"的关系。打个比方说,"RenderWindow"是剧院,"渲染器Renderer”是剧院中的舞台,"角色Actor”就是舞台上的演员。一个剧院可以有多个相对独立的舞台,自然舞台上也可以有许多演员。在一个剧院内,舞台可以现相对独立,演员也可以到不同的舞台去演出。
更新日期:2021-10-18
ActiViz还可以显示椭球,可以通过vtkParametricEllipsoid类与vtkParametricFunctionSource类协同作用创建一个椭球。vtkParametricEllipsoid类继承自vtkParametricFunction类,椭球在X、Y、Z轴上的半径相等时就是一个球体。与vtkSphereSource类相比来说,vtkParametricEllipsoid类无法设定椭球的中心点位置,需要设置中心点的话可以通过后面的vtkActor类中的SetPosition进行设定,通过vtkParametricEllipsoid类设定椭球参数后,需要将其传递给vtkParametricFunctionSource类,生成类似于Source的数据,之后的过程与传统ActiViz处理流程相同。Source(几何数据源) - Filter(滤波器) - Mapper(几何数据映射) - Actor(执行器) - Render(渲染器)得到一个椭球。程序如下:
vtkParametricEllipsoid vtkEllipsoid = vtkParametricEllipsoid.New();
//public abstract class vtkParametricFunction : vtkObject
//vtkParametricFunction-参数化函数的抽象接口
//vtkParametricFunction是由参数映射定义的函数的抽象接口,
//即f(u,v,w)->(x,y,z),
//其中u_min<=u<u_max,v_min<=v<v_max,w_min<=w<w_max。
//为了便于说明,我们将编写f(u)->x并假设u表示(u,v,w)和x表示(x,y,z)。
//该接口包含纯虚函数,Evaluate(),生成一个点和该点处的导数,然后用于构造曲面。
//第二个纯虚函数EvaluateScalar()可用于生成曲面的标量。
//因为这个抽象类定义了一个纯虚拟API,所以它的子类必须实现纯虚拟函数
//GetDimension()、Evaluate()和EvaluateScalar()。
//此类还有用于定义一系列参数值(u、v、w)的方法。
//
//public class vtkParametricEllipsoid : vtkParametricFunction
//vtkParametricEllipsoid-生成椭球体。
//vtkParametricEllipsoid生成椭球体。如果所有半径都相同,我们就有一个球体。
//如果RadiusX=RadiusY>RadiusZ,则会出现扁球体。在这里,Z轴形成对称轴。
//首先,这是地球的形状。如果RadiusX=RadiusY<RadiusZ,则出现长椭球体。
//
//public static vtkParametricEllipsoid New();
//用默认参数构造一个椭球,在默认情况下为球体。
vtkEllipsoid.SetXRadius(5);
vtkEllipsoid.SetYRadius(3);
vtkEllipsoid.SetZRadius(3);
//设置X、Y、Z轴的半径,默认值=1
vtkParametricFunctionSource vtkSource = vtkParametricFunctionSource.New();
//vtkParametricFunctionSource-细分参数化函数
//此类细分参数化函数。用户必须指定参数化坐标方向上需要多少点(即分辨率),
//以及用于生成标量的模式。
//
//public static vtkParametricFunctionSource New();
//在(u-v-w)方向上创建具有(50,50,50)个点的新实例。
vtkSource.SetParametricFunction(vtkEllipsoid);
//指定用于生成细分的参数化函数。
vtkPolyDataMapper vtkEllipsoidMapper = vtkPolyDataMapper.New();
vtkEllipsoidMapper.SetInputConnection(vtkSource.GetOutputPort());
vtkActor vtkEllipsoidActor = vtkActor.New();
vtkEllipsoidActor.SetMapper(vtkEllipsoidMapper);
vtkEllipsoidActor.GetProperty().SetColor(0.1, 0.2, 0.3);
vtkEllipsoidActor.SetPosition(0, 10, 0);
VTKrenderer.AddActor(vtkEllipsoidActor);
运行程序,结果如下,部分3D几何体为后续章节测试程序生成,请忽略
修改程序,增加圆形显示程序段
vtkRegularPolygonSource regularPolygon = vtkRegularPolygonSource.New();
//vtkRegularPolygonSource-创建规则的n边多边形或多段线
//vtkRegularPolygonSource是一个源对象,用于创建单个n边多边形或多段线。
//多边形以指定点为中心,与指定法线正交,并具有用户设置的外切半径。
//用户还可以指定多边形的边数,范围为[3,N]。此对象可用于定义剪裁/切割区域。
//
//public static vtkRegularPolygonSource New();
//实例化、获取类型的标准方法。
regularPolygon.SetRadius(6);
//设置多边形的半径。默认情况下,半径设置为0.5。
regularPolygon.SetNumberOfSides(50);
//设置多边形的边数。默认情况下,边数设置为6。
regularPolygon.SetCenter(0, 0, -10);
//设置多边形的中心。默认情况下,中心设置在原点(0,0,0)。
regularPolygon.SetGeneratePolygon(1);
//控制是否生成多边形。默认情况下,GeneratePolygon处于启用状态。
regularPolygon.SetNormal(0, 0,1);
//设置多边形的法线。默认情况下,法线设置为(0,0,1)。
vtkPolyDataMapper regularPolygonMapper = vtkPolyDataMapper.New();
regularPolygonMapper.SetInputConnection(regularPolygon.GetOutputPort());
vtkActor regularPolygonActor = vtkActor.New();
regularPolygonActor.SetMapper(regularPolygonMapper);
regularPolygonActor.GetProperty().SetColor(1, 0, 0);
VTKrenderer.AddActor(regularPolygonActor);
程序运行结果如下,生成红色圆形平面
修改以下语句,可以生成圆圈,程序运行效果如下
regularPolygon.SetGeneratePolygon(0);
修改以下语句,可以改变生成平面的法线,程序运行效果如下
regularPolygon.SetNormal(0.7, 0,1);
regularPolygon.SetNormal(-0.5, 0,1);