C#+VTK三维开发:在3D场景中固定位置添加和更新2D文字信息的切实可行的方法

在C#中通过引用vtk的.net版本,也就是ActiViz.net,可以实现桌面三维应用程序开发,比如下面这个博主开发的类似谷歌地球的小应用。在此开发过程中,遇到了各种各样的问题和解决方案,现在分享给大家。都是亲自测试过的!!

后面的博客里,博主会上传源代码,请持续关注本人的博客!!

 

在三维场景中,有时需要添加一些二维的要素,比如一个位于底部的状态栏,上面描述一些相机状态参数。在vtk里添加这些文字,有好几种方法,在C#种,有些好用,有些完全没反应,经过测试,以下方法是可用的,看下面这个函数:

        public static vtkActor2D CreateTextActor(string text, Color color, XVertex location, int size, bool bold=false, bool italic=false, bool shadow=false)
        {
            // 设置文本属性
            vtkTextProperty textProperty = vtkTextProperty.New();
            textProperty.SetColor(color.R / 255.0, color.G / 255.0, color.B / 255.0);  // 设置文本颜色为黄色
            textProperty.SetFontSize(size);          // 设置字体大小
            textProperty.SetBold(bold?1:0);            // 设置加粗
            textProperty.SetItalic(italic?1:0);          // 设置斜体
            textProperty.SetShadow(shadow?1:0);          // 设置阴影
            textProperty.SetFontFamilyToTimes();        //设置字体Times New Roman

            // 创建一个文本映射器
            vtkTextMapper textMapper = vtkTextMapper.New();
            textMapper.SetInput(text);
            textMapper.SetTextProperty(textProperty);

            // 创建文本演员
            vtkActor2D textActor = vtkActor2D.New();
            textActor.SetMapper(textMapper);

            // 设置文本在窗口中的位置(归一化坐标)
            textActor.GetPositionCoordinate().SetCoordinateSystemToNormalizedViewport();
            textActor.GetPositionCoordinate().SetValue(location.X, location.Y);  // 左上角

            return textActor;
        }

逐行都有注释,相信大家很容易理解,这里的核心是建立一个类型为vtkActor2D的对象实例,其绑定一个vtkTextMapper的实例,然后这个mapper可以设置字体形式和显示内容。字体形式还是可以设置很多内容的。

下面就是一个调用的方法

vtkActor2D infoActor = X3DTools.CreateTextActor("Welcome!", Color.Red, new XVertex(0.05, 0.05), 12);
renderer.AddActor2D(infoActor);

这里有两个点要注意,其中XVertex就是一个二维的位置,自定义的,不重要,但是它的值是一个归一化的坐标,代表在窗口中的相对位置,窗口纵横坐标范围都被想象成0~1,左下角为(0,0),所以例子中给出的例子就是,大概在接近左下角的地方放文字。

还有就是,以前增加actor都是用的AddActor,而这次是二维actor,所以调用函数是AddActor2D。

在程序运行中,如果需要更新文字内容,不需要删除这个actor,重新做,可以直接修改内容,代码如下:

            ((vtkTextMapper)infoActor.GetMapper()).SetInput("new text");            
            renWin.Render();

修改完了,一定要调用Render函数完成重绘。

上述文字添加,还不能直接写中文,因为内置的字体文件不支持,后面我再介绍如何通过加载自己的字体文件,完成中文的添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值