程序修改如下:
vtkSphereSource sphere = vtkSphereSource.New();
sphere.SetCenter(5, 5, 5);
vtkCylinderSource cylinder = vtkCylinderSource.New();
//public class vtkCylinderSource : vtkPolyDataAlgorithm
//生成以原点为中心的圆柱体,vtkCylinderSource创建以原点为中心的多边形圆柱体
//圆柱体的轴沿全局y轴对齐。可以指定圆柱体的高度和半径以及侧面数。
//还可以控制圆柱体是开口的还是有盖的。
cylinder.SetHeight(3.0);
//设置圆柱体的高度。初始值为1。
cylinder.SetRadius(0.1);
//设置圆柱体的半径。初始值为0.5
cylinder.SetResolution(10);
//设置用于定义圆柱体的面数。初始值为6。
vtkPolyDataMapper sphereMapper = vtkPolyDataMapper.New();
sphereMapper.SetInputConnection(sphere.GetOutputPort());
vtkPolyDataMapper cylinderMapper = vtkPolyDataMapper.New();
cylinderMapper.SetInputConnection(cylinder.GetOutputPort());
vtkActor sphereactor = vtkActor.New();
sphereactor.SetMapper(sphereMapper);
sphereactor.GetProperty().SetColor(1, 0, 0);
vtkActor cylinderactor = vtkActor.New();
cylinderactor.SetMapper(cylinderMapper);
cylinderactor.GetProperty().SetColor(0, 1, 0);
vtkRenderWindow RenderWin = renderWindowControl.RenderWindow;
vtkRenderer VTKrenderer = renderWindowControl.RenderWindow.GetRenderers().GetFirstRenderer();
VTKrenderer.AddViewProp(sphereactor);
VTKrenderer.AddViewProp(cylinderactor);
vtkCamera camera = VTKrenderer.GetActiveCamera();
VTKrenderer.ResetCamera();
RenderWin.Render();
在原有程序的基础上增加圆柱,程序运行效果如下:
现在修改程序,在场景中增加一个渲染器
vtkSphereSource sphere = vtkSphereSource.New();
sphere.SetCenter(5, 5, 5);
vtkCylinderSource cylinder = vtkCylinderSource.New();
cylinder.SetHeight(3.0);
cylinder.SetRadius(0.1);
cylinder.SetResolution(10);
vtkPolyDataMapper sphereMapper = vtkPolyDataMapper.New();
sphereMapper.SetInputConnection(sphere.GetOutputPort());
vtkPolyDataMapper cylinderMapper = vtkPolyDataMapper.New();
cylinderMapper.SetInputConnection(cylinder.GetOutputPort());
vtkActor sphereactor = vtkActor.New();
sphereactor.SetMapper(sphereMapper);
sphereactor.GetProperty().SetColor(1, 0, 0);
vtkActor cylinderactor = vtkActor.New();
cylinderactor.SetMapper(cylinderMapper);
cylinderactor.GetProperty().SetColor(0, 1, 0);
vtkRenderWindow RenderWin = renderWindowControl.RenderWindow;
vtkRenderer VTKrenderer1 = vtkRenderer.New();
vtkRenderer VTKrenderer2 = vtkRenderer.New();
VTKrenderer1.AddViewProp(sphereactor);
VTKrenderer2.AddViewProp(cylinderactor);
RenderWin.AddRenderer(VTKrenderer1);
RenderWin.AddRenderer(VTKrenderer2);
VTKrenderer1.SetViewport(0, 0.5, 0.5, 1);
VTKrenderer2.SetViewport(0.5, 0, 1, 0.5);
VTKrenderer1.SetBackground(1, 1, 0);
VTKrenderer2.SetBackground(1, 1, 0);
vtkCamera camera1 = VTKrenderer1.GetActiveCamera();
VTKrenderer1.ResetCamera();
vtkCamera camera2 = VTKrenderer2.GetActiveCamera();
VTKrenderer2.ResetCamera();
RenderWin.Render();
红色字体为变更语句,程序运行效果如下,可以使用鼠标分别旋转两个渲染场景中的三维几何体
完整的流程:“数据源Souce”-->“过滤器Filter”--> “制图器Mapper”--> “角色Actor”-->“渲染器Renderer”。其中,“过滤器Filter”是可有可无的,其他步骤一步都不能少。
创建新的渲染器后,通过AddViewProp()添加角色,角色可以在多个不同渲染器中出现。通过SetViewport()设置渲染器在可视化控件中的位置,SetBackground()给渲染器赋予背景色。
注意:
(1)Viewport窗口的坐标赋值,控件的左下角为原点,X轴由左向右[0.0,1.0],Y轴由下向上[0.0,1.0];
(2)各自“渲染器Renderer”的交互操作是独立完整的;
(3)同一控件中的“渲染器Renderer”是可以相互重叠或遮挡的,具体效果请自行测试。
可以去掉圆柱体上下地面,通过以下语句
cylinder.CappingOff();
//禁用是否使用多边形覆盖圆柱体。初始值为启用。
程序运行结果如下,图中的三个小球为后续程序添加的几何体,其中红球在圆柱体内部
还可以通过以下语句设置圆柱体的透明度
cylinderactor.GetProperty().SetOpacity(0.5);
//设置对象的不透明度。1.0完全不透明,0.0完全透明。
程序运行结果如下
第二种方式,更新日期2021-10-19
如果我们已知圆柱体中心轴的两个端点,可以使用vtkLineSource
和vtkTubeFilter两个类配合
来生成具有方向性的圆柱体。程序如下
vtkTubeFilter tubeFilter = vtkTubeFilter.New();
//vtkTubeFilter-在管线周围生成管的过滤器
//vtkTubeFilter是一种在每条输入线周围生成一个管的过滤器。
//管由三角形组成,并随着线法线的旋转围绕管旋转。
//(如果不存在法线,则会自动计算法线。)
//可以将管的半径设置为随标量或矢量值而变化。
//如果半径随标量值变化,则将线性调整半径。
//还可以指定管的边数。您还可以指定哪些边是可见的。
//这对于生成有趣的条带效果非常有用。
//其他选项包括为管状体加盖和生成纹理坐标的功能。
//纹理坐标可以与关联的纹理贴图一起使用,以创建有趣的效果,
//例如使用与长度或时间对应的条纹标记管。
//此过滤器通常用于创建粗线条。
//另一个常见用途是将此过滤器与vtkStreamLine组合以生成流管。
//
//public static vtkTubeFilter New();
//构造半径为0.5、半径变化已禁用、边数设置为3、半径系数为10的对象。
tubeFilter.SetInputConnection(lineSource.GetOutputPort());
tubeFilter.SetRadius( 0.5 );
tubeFilter.SetNumberOfSides( 50 );
tubeFilter.CappingOff();
vtkPolyDataMapper DataMapper = vtkPolyDataMapper.New();
DataMapper.SetInputConnection(tubeFilter.GetOutputPort());
vtkActor tubeActor = vtkActor.New();
tubeActor.SetMapper(DataMapper);
vtkProperty property = vtkProperty.New();
property.SetOpacity(0.5);
property.SetColor(0, 1, 1);
tubeActor.SetProperty(property);
VTKrenderer.AddActor(tubeActor);
程序中一些类和方法之前没有提到,可以参考我的其他博客,程序运行效果如下