日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ActiViz学习点滴(四)——显示圆柱(两种方式构建圆柱体)

發布時間:2024/3/26 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ActiViz学习点滴(四)——显示圆柱(两种方式构建圆柱体) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

程序修改如下:

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);

程序中一些類和方法之前沒有提到,可以參考我的其他博客,程序運行效果如下

總結

以上是生活随笔為你收集整理的ActiViz学习点滴(四)——显示圆柱(两种方式构建圆柱体)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。