ActiViz学习点滴(四)——显示圆柱(两种方式构建圆柱体)
程序修改如下:
vtkSphereSource sphere = vtkSphereSource.New();? ? ? ? ? ??
sphere.SetCenter(5, 5, 5);? ? ? ? ? ?
vtkCylinderSource cylinder = vtkCylinderSource.New();? ? ? ? ? ??
//public class vtkCylinderSource : vtkPolyDataAlgorithm? ? ? ? ? ??
//生成以原點為中心的圓柱體,vtkCylinderSource創建以原點為中心的多邊形圓柱體? ? ? ? ? ??
//圓柱體的軸沿全局y軸對齊??梢灾付▓A柱體的高度和半徑以及側面數。? ? ? ? ? ??
//還可以控制圓柱體是開口的還是有蓋的。? ? ? ? ? ??
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);
程序中一些類和方法之前沒有提到,可以參考我的其他博客,程序運行效果如下
總結
以上是生活随笔為你收集整理的ActiViz学习点滴(四)——显示圆柱(两种方式构建圆柱体)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【3D动态思维导图制作软件】万彩脑图大师
- 下一篇: Boost.Asio 技术文档