ActiViz(VTK的C#库)学习使用心得之九:三维坐标轴的实现

Stella981
• 阅读 966

       三维程序设计中,通常会在控件窗口中设置和显示坐标轴系线,方便操作和使用。VTY库中提供vtkAxesActor类,方便用户快捷实现三维坐标的实现。效果如下:

ActiViz(VTK的C#库)学习使用心得之九:三维坐标轴的实现

        C#核心代码如下:

        vtkAxesActor axesActor = vtkAxesActor.New();     //  创建“坐标”角色

        render1.AddActor(axesActor);                                //  渲染坐标角色

        说明:

        1.坐标原点位于世界坐标系的(0,0,0)点。

        2. 坐标自带箭头和默认颜色、大小。

        3.坐标对象自带带告示板效果的“X”,“Y”和“Z”。

        4.坐标轴会自动与视点控件联动(不需要另外编程)。

        5.可通过vtkTransform类的设定,移动、旋转和缩放坐标轴。

         6.可通过设定 vtkAxesActor的属性改变坐标轴颜色等属性。

        提供renderWindowControl1的Load事件C#源代码,供大家调试使用。请特别注意坐标轴的旋转和缩放参数的设置,这可能导致坐标轴变形。

 private void renderWindowControl1_Load(object sender, EventArgs e)
        {
            // 1.Create a simple sphere. A pipeline is created.
            // 1.新建球体,创建“管道pipeline”。

            //  --- 1.1 新建数据--“数据源Source”---
            //      (1)球体
            vtkSphereSource sphere = vtkSphereSource.New();      // 新建球
            sphere.SetThetaResolution(8);                        // 设置球纬度参数
            sphere.SetPhiResolution(16);                         // 设置球经度参数
            sphere.SetRadius(0.1);                               // 设置球的半径     
            //      (2)柱体
            vtkCylinderSource cylinder = vtkCylinderSource.New();
            cylinder.SetHeight(1.0);
            cylinder.SetRadius(0.05);
            cylinder.SetResolution(10);
            //      (3)3D文字
            vtkVectorText text3D = new vtkVectorText();
            text3D.SetText("VTK");
            
            //  --- 1.2 数据加工 -- "过滤器Filter" -- 收缩 ---
            vtkShrinkPolyData shrink = vtkShrinkPolyData.New();  // 新建数据收缩操作器
            shrink.SetInputConnection(sphere.GetOutputPort());   // 连接管道
            shrink.SetShrinkFactor(1.0);                         // 收缩“面”操作  
            
            //  --- 1.3 数据制图 -- "制图器Mapper" ---
            //      (1)球体
            vtkPolyDataMapper sphereMapper = vtkPolyDataMapper.New();    // 新建制图器
            sphereMapper.SetInputConnection(shrink.GetOutputPort());     // 连接管道

            //      (2)柱体
            vtkPolyDataMapper cylinderMapper = vtkPolyDataMapper.New();   // 新建制图器
            cylinderMapper.SetInputConnection(cylinder.GetOutputPort());  // 连接管道

            //      (3)3D文字
            vtkPolyDataMapper text3DMapper = vtkPolyDataMapper.New();
            text3DMapper.SetInputConnection(text3D.GetOutputPort());

            // 2.The actor links the data pipeline to the rendering subsystem
            // 2.创建“角色Actor”,连接“管道pipeline”和“渲染系统rendering subsystem”

            // --- 2.1 新建角色--“角色Actor”---
            //     (1)球体
            vtkActor sphereActor = vtkActor.New();                    // 新建角色
            sphereActor.SetMapper(sphereMapper);                      // 传递制图器
            sphereActor.GetProperty().SetColor(1, 0, 0);              // 设置“角色”颜色[RGB]
            //     (2)柱体
            vtkActor cylinderActor = vtkActor.New();                    // 新建角色
            cylinderActor.SetMapper(cylinderMapper);                    // 传递制图器
            cylinderActor.GetProperty().SetColor(0, 1, 0);              // 设置“角色”颜色[RGB]

          vtkTransform transform = vtkTransform.New();   // 空间变换对象
            transform.PostMultiply();                                           // 设置右乘变换矩阵
            transform.RotateX(60);                                               // 绕X轴旋转60度
            transform.RotateZ(30);                                               // 绕Z轴旋转30度
            //transform.Scale(2.0, 1.0, 1.0);                                  // 沿X个方向放大2倍
            transform.Translate(2.0, 0.0, 0.0);                               // 沿X轴移动2.0个单位

            cylinderActor.SetUserTransform(transform);                    // 柱体空间变换

            //      (3)3D文字
            vtkFollower text3DActor = new vtkFollower();
            text3DActor.SetMapper(text3DMapper);
            text3DActor.SetScale(0.3, 0.3, 0.5);                      // 大小
            text3DActor.AddPosition(0, 0, 0);                         // 位置(文字左下角坐标)
            text3DActor.GetProperty().SetColor(0.0, 1.0, 0.0);        // 颜色

            //     (4)坐标轴
            vtkAxesActor axesActor = vtkAxesActor.New();     // 创建坐标轴角色
           axesActor.SetUserTransform(transform);                 // 设置 坐标轴移动、旋转和缩放
            
            //      2.2 Create components of the rendering subsystem
            // --- 2.2 创建渲染--“渲染系统rendering subsystem”---
            //          (1)新建“渲染器Renderer”和“渲染窗口RenderWindow”
            //          renderWindowControl1控件提供“渲染窗口” 
            //vtkRenderer ren1 = renderWindowControl1.RenderWindow.GetRenderers().GetFirstRenderer();
            vtkRenderer render1 = vtkRenderer.New();       // 新建渲染器
            vtkRenderWindow renWin = renderWindowControl1.RenderWindow;
            renWin.AddRenderer(render1);                   // 添加渲染器 
          
            //         Add the actors to the renderer, set the window size
            //         (2)将“角色Actor”添加到“渲染器Renderer”并渲染
            render1.AddActor(cylinderActor);
            render1.AddActor(sphereActor);
            //render1.AddActor(text3DActor);
            text3DActor.SetCamera(render1.GetActiveCamera());
            render1.AddViewProp(text3DActor);

            render1.AddActor(axesActor);                //  渲染坐标轴角色

            render1.SetBackground(0.0, 0.0, 0.0);          //设置背景颜色  

            renWin.Render();                               // 渲染渲染窗口
            //renWin.Start();

            //         (3)设置"相机Camera"
            vtkCamera camera = render1.GetActiveCamera();   // 新建相机
            camera.Zoom(1.0);                               // 相机缩放
        }

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这