在之前的程序中加入2D文字显示程序段
vtkTextActor textActor = vtkTextActor.New();
//public class vtkActor2D : vtkProp
//vtkActor2D - 绘制二维数据的Actor
//vtkActor2D类似于vtkActor,但它用于二维图像和注释。
//vtkActor2D有一个位置,但不使用类似vtkActor的变换矩阵
//(有关定位vtkActor2D的信息,请参阅超类vtkProp)。
//vtkActor2D具有对执行渲染的vtkMapper2D对象的引用。
//
//public class vtkTextActor : vtkActor2D
//vtkTextActor-显示文本的角色。按比例还是不按比例
//vtkTextActor可用于将文本注释放置到窗口中。
//当TextScaleMode为NONE时,文本为固定字体,
//操作与vtkPolyDataMapper2D/vtkActor2D对相同。
//当TextScaleMode为VIEWPORT时,字体会调整大小,
//以便相对于渲染它的VIEWPORT保持一致的大小。
//当TextScaleMode为PROP时,字体会调整大小,使文本适合由位置1和2坐标定义的框。
//此类替换了不推荐使用的vtkScaledTextActor类,
//并且此类可以充当vtkTextMapper/vtkActor2D对的方便包装器。
//通过与此Actor关联的vtkTextProperty设置文本属性。
//
//public static vtkTextActor New();
//在视图坐标系中使用矩形实例化对象。
textActor.GetTextProperty().SetFontSize(30);
//public virtual vtkTextProperty GetTextProperty();
//获取文本属性
//public class vtkTextProperty : vtkObject
//vtkTextProperty-表示文本属性。
//vtkTextProperty是表示文本属性的对象。
//可以设置的主要属性有颜色、不透明度、字体大小、
//字体水平和垂直对齐、粗体/斜体/阴影样式。
//public virtual void SetFontSize(int _arg);
//设置字体大小,以点为单位
textActor.SetDisplayPosition(50,30);
//设置道具在2D显示坐标系中的位置。
textActor.GetTextProperty().SetColor(1, 0, 1);
//设置文本颜色
textActor.SetInput("ActiViz");
//设置要显示的文本字符串。“\n”被识别为回车/换行符(行分隔符)。
//字符必须采用ISO-8859-1编码。底层映射器的便捷方法
textActor.GetTextProperty().SetBold(1);
//启用/禁用文本粗体显示。
textActor.GetTextProperty().SetItalic(1);
//启用/禁用文本斜体。
textActor.GetTextProperty().SetShadow(1);
//启用/禁用文本阴影。
VTKrenderer.AddActor(textActor);
程序运行结果如下,
(1)vtkTextActor对象不支持中文输入。
(2)SetDisplayPosition()方法使用的是Display坐标,参数为像素,表示的是输出文本的左下角坐标。
(3)二维文字不随View坐标即Camera一起运动。
修改以上程序,增加显示3D文字的程序段
vtkVectorText text3D = new vtkVectorText();
//创建多边形文本
text3D.SetText("VTK");
//设置要绘制的文本。
vtkPolyDataMapper text3DMapper = vtkPolyDataMapper.New();
text3DMapper.SetInputConnection(text3D.GetOutputPort());
vtkActor text3DActor = new vtkActor();
text3DActor.SetMapper(text3DMapper);
text3DActor.SetScale(1, 1, 1);
//设定Actor的比例。在X、Y和Z轴上独立执行缩放。零是非法的,将用一代替。
text3DActor.SetPosition(1, 0, 0);
//设置道具在3D世界坐标系中的位置。(文字左下角坐标)
text3DActor.GetProperty().SetColor(0.0, 0.0, 0.0);
VTKrenderer.AddActor(text3DActor);
程序执行结果如下:
1.vtkVectorText类不支持中文输入。
2.vtkVectorText类的vtkActor对象(三维文字)会随视点变化
以上程序当使用鼠标控制三维物体旋转时,三维文字“VTK”也会随之旋转,如果希望不论视点如何变换,都能看到文字的正面,那就要用到“告示板”技术了。所谓“告示板”,就是在三维控件中三维物体使用一个固定的面,面向视点,当视角变化时,该面也对应发生旋转,始终面向视点。VTK封装了vtkFollower类,可以简便的实现告示板效果。修改以上三维文本显示程序如下,其中数据源与映射部分程序没有变化,Actor部分程序需要修改
vtkFollower text3DActor = new vtkFollower();
//vtkFollower-始终面对摄影机的vtkActor的子类
//vtkFollower是vtkActor的一个子类,它始终面向其指定的摄影机。
//更具体地说,它不会改变其位置或比例,但会不断更新其方向,
//使其正面朝上并面向摄影机。这通常用于场景中的文本标签。
//所有可以对Actor进行的调整也将对vtkFollower生效。
text3DActor.SetMapper(text3DMapper);
text3DActor.SetScale(1, 1, 1);
text3DActor.SetPosition(1, 0, 0);
text3DActor.GetProperty().SetColor(0.0, 0.0, 0.0);
text3DActor.SetCamera(VTKrenderer.GetActiveCamera());
//将相机设置为跟随。如果没有设置,那么vtkFollower将不知道跟随谁。
VTKrenderer.AddActor(text3DActor);
运行修改后的程序,黑色文本“VTK”始终面向摄像机
修改以上程序中3D文本设置语句,可以加入换行符,以输入多行文本。但文本在3D世界坐标系中的位置貌似是以第一行文本左下角坐标为准
text3D.SetText("VTK\r\nActiViz");
程序运行结果如下:
还可以旋转3D文本,增加以下旋转语句
text3DActor.SetPosition(1, 0, 0);
text3DActor.SetOrigin(0, 0, 0);
//设置3D道具的原点。这是发生所有旋转的点。
text3DActor.RotateZ(90);
程序运行结果如下,注意,使用SetOrigin()方法设置的原点不是3D世界坐标,而是相对于文本位置的坐标(前面使用SetPosition()方法设置的位置坐标)
例如,我将旋转点设置语句修改如下
text3DActor.SetPosition(1, 0, 0);
text3DActor.SetOrigin(4, 0, 0);
程序执行结果如下