在C#中通过引用vtk的.net版本,也就是ActiViz.net,可以实现桌面三维应用程序开发,比如下面这个博主开发的类似谷歌地球的小应用。在此开发过程中,遇到了各种各样的问题,现在分享给大家。
后面的博客里,博主会上传源代码,请持续关注本人的博客!!
阅读本篇博客前,请务必先阅读 C#三维桌面应用程序开发(基于vtk,也就是ActiViz.net)经验分享系列:快速生成大量球体Sphere的三种方法(之一)和(之二)
在之二方法中,我们用了vtkAppendPolyData来生成单个vtkActor,在有些情况下,其实我们只是想生成大量的点,很小的点,无尺度的点,比如说三维点云中的点而已。或者说就是一个像素,那么就完全没有必要使用SphereSource这种球了,直接上像素点云!
/// <summary>
/// 创建点云actor
/// </summary>
/// <param name="color"></param>
/// <param name="positions"></param>
/// <param name="pointSize"></param>
/// <returns></returns>
public static vtkActor CreateManyPointsActor(Color color, List<X3DVertex> positions, float pointSize = 1)
{
// 创建点云数据
vtkPoints points = vtkPoints.New();
vtkCellArray vertices = vtkCellArray.New();
for (int i = 0; i < positions.Count; i++)
{
// 插入点
long pointId = points.InsertNextPoint(positions[i].x, positions[i].y, positions[i].z);
// 创建顶点
vtkVertex vertex = vtkVertex.New();
vertex.GetPointIds().SetId(0, pointId);
vertices.InsertNextCell(vertex);
}
// 创建 PolyData 并设置点和顶点
vtkPolyData polyData = vtkPolyData.New();
polyData.SetPoints(points);
polyData.SetVerts(vertices);
// 创建 Mapper 和 Actor
vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
mapper.SetInputData(polyData);
return BuildActor(mapper, color, pointSize);
}
这里面的核心就是polyData.SetVerts(vertices);
用这种方法可以生成上千万个点,都没问题,浏览起来很smooth!
对了,这里的BuildActor实际就是一个自定义的函数,大概是这样的
public static vtkActor BuildActor(vtkPolyDataMapper mapper,
Color color,
float pointSize)
{
mapper.Update();
vtkActor actor = vtkActor.New();
actor.SetMapper(mapper);
actor.GetProperty().SetColor(color.R / 255.0, color.G / 255.0, color.B / 255.0);
actor.GetProperty().SetPointSize(pointSize);
return actor;
}