ActiViz学习点滴(三)——显示小球、椭球、圆

这篇博客介绍了使用VTK库在C#中创建3D图形的基本步骤,包括创建球体、椭球体和多边形。通过数据源、过滤器、映射器、演员和渲染器之间的交互,展示了如何构建和修改3D模型。示例代码演示了如何添加缩放过滤器以改变球体的大小,并展示了如何创建和操纵不同形状的3D几何体,如椭球和多边形。
摘要由CSDN通过智能技术生成

增加一个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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值