天天看点

vtk学习笔记之显示标签vtkVectorText

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个点)

vtk学习笔记之显示标签vtkVectorText

因为vtkVectorText将字符串转换为vtkPolyData来显示的,所以速度相对比较快。因为它只是输出字符串的vtkPolyData的对象,所以标签的旋转以及定位都需要我们自己来设置,这个还是有点麻烦。因为如何使得标签使用朝向屏幕,除了使用每一个标签一个vtkFollower来操作之外,就需要我们自己来计算每一个标签应该旋转的角度,然后使用vtkTransform来调整标签的朝向,以达到我们的要求。

另外,vtk提供的vtkVectorText定义,每一个字符都包含了很多三角面,如果希望获取更高的性能,可以参照vtkVectorText的实现,来重写 ,将它提供的字符定义进行精简,这样优化以后,估计显示10000个标签应该都不成问题了。