vtkVectorText从字面上可以看出,这是vtk提供的向量文本对象,它将给定的文本字符串转换为vtkPolyData对象来显示。它除了能够支持常见的数字(0-9),字母(a-z,A-Z)之外,还支持其它的一些ASCII字符,即还包括字符编码在33-126之间的字符。而且它只支持\n这个控制字符。
下面给一个示例来了解如何使用vtkVectorText。
首先,创建500个随机顶点,以顶点的ID值作为vtkVectorText的输入字符串,同时,因为我们需要在顶点的旁边来显示标签,所以还需要使用vtkTransform以及vtkTransformFilter来对vtkVectorText的输出做平移转换。代码如下:
//点集合 vtkPoints points = new vtkPoints(); //定义cells vtkCellArray verts = new vtkCellArray(); //保存标签多边形的 vtkAppendPolyData appendPolyData = new vtkAppendPolyData(); for(int i=0;i<500;i++){ double x = math.Random(1,3); double y = math.Random(1,3); double z = math.Random(1,3); points.InsertNextPoint(x,y,z); verts.InsertNextCell(1); verts.InsertCellPoint(i); vtkVectorText text = new vtkVectorText(); text.SetText(""+i); //--进行缩放 vtkTransform t = new vtkTransform(); t.Translate(x, y, z); t.Scale(.04, .04, .04); vtkTransformFilter tf = new vtkTransformFilter(); tf.SetTransform(t); tf.SetInput(text.GetOutput()); appendPolyData.AddInputConnection(tf.GetOutputPort()); } //原始数据 显示点集合 vtkPolyData polyData = new vtkPolyData(); polyData.SetPoints(points); polyData.SetVerts(verts); vtkPolyDataMapper mapper = new vtkPolyDataMapper(); mapper.SetInput(polyData); vtkActor vertsActor = new vtkActor(); vertsActor.SetMapper(mapper); vertsActor.GetProperty().SetPointSize(5); renderer.AddActor(vertsActor);
上面的代码会在窗口中显示出创建的500个顶点,同时我们还可以得到一个包含了这些顶点标签的vtkAppendPolyData 对象。下面的代码用来显示标签:
//显示字体 vtkPolyDataMapper textMapper = new vtkPolyDataMapper(); textMapper.ImmediateModeRenderingOn(); textMapper.SetInputConnection(appendPolyData.GetOutputPort()); vtkActor textActor = new vtkActor(); textActor.SetMapper(textMapper); renderer.AddActor(textActor);
最终显示结果如下:(这里只测试了100个点)
因为vtkVectorText将字符串转换为vtkPolyData来显示的,所以速度相对比较快。因为它只是输出字符串的vtkPolyData的对象,所以标签的旋转以及定位都需要我们自己来设置,这个还是有点麻烦。因为如何使得标签使用朝向屏幕,除了使用每一个标签一个vtkFollower来操作之外,就需要我们自己来计算每一个标签应该旋转的角度,然后使用vtkTransform来调整标签的朝向,以达到我们的要求。
另外,vtk提供的vtkVectorText定义,每一个字符都包含了很多三角面,如果希望获取更高的性能,可以参照vtkVectorText的实现,来重写 ,将它提供的字符定义进行精简,这样优化以后,估计显示10000个标签应该都不成问题了。