在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函数完成重绘。
上述文字添加,还不能直接写中文,因为内置的字体文件不支持,后面我再介绍如何通过加载自己的字体文件,完成中文的添加。