在C#中通过引用vtk的.net版本,也就是ActiViz.net,可以实现桌面三维应用程序开发,比如下面这个博主开发的类似谷歌地球的小应用。在此开发过程中,遇到了各种各样的问题,现在分享给大家。
后面的博客里,博主会上传源代码,请持续关注本人的博客!!
阅读本篇博客前,请务必先阅读 C#三维桌面应用程序开发(基于vtk,也就是ActiViz.net)经验分享系列:快速生成大量球体Sphere的三种方法(之一)
在上一篇文章中,每个球体都是一个vtkActor,这非常不好,又浪费内存,浏览起来又非常卡顿。现在介绍第二种方法,就是不管要生成多少个球体,都只生成一个vtkActor,而把所有的球体的vtkPolyData都集成为一个,这个思路非常棒!其实可以应用于任何几何体。
先上代码,这是生成单个球的vtkPolyData的代码!
/// <summary>
/// 生成单个球的polydata
/// </summary>
/// <param name="radius"></param>
/// <param name="position"></param>
/// <param name="hasColor"></param>
/// <param name="color"></param>
/// <returns></returns>
public static vtkPolyData CreateSpherePolyData(double radius, X3DVertex position, bool hasColor, Color color)
{
if (SphereSource == null) UpdateSphereSource(SphereFace);
vtkTransform transform = vtkTransform.New();
transform.Translate(position.x, position.y, position.z); // 将球体平移到position
transform.Scale(radius, radius, radius); // 将球体放大radius倍
// 创建 vtkTransformPolyDataFilter 来应用变换
vtkTransformPolyDataFilter transformFilter = vtkTransformPolyDataFilter.New();
transformFilter.SetInputConnection(SphereSource.GetOutputPort());
transformFilter.SetTransform(transform);
transformFilter.Update();
vtkPolyData pd= transformFilter.GetOutput();
return pd;
}
接下去,我们来生成大量的球
/// <summary>
/// 生成多个球的聚合actor,数量有限制,大概几万个
/// </summary>
/// <param name="color"></param>
/// <param name="positions"></param>
/// <param name="radius"></param>
/// <returns></returns>
public static vtkActor CreateManySpheresActor(Color color, List<X3DVertex> positions, double radius)
{
vtkAppendPolyData appendFilter = vtkAppendPolyData.New();
for (int i = 0; i < positions.Count; i++)
{
appendFilter.AddInputData(CreateSpherePolyData(radius, positions[i], false, X3DTools.NoUseColor));
}
appendFilter.Update();
// 创建 Mapper 和 Actor
vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
mapper.SetInputData(appendFilter.GetOutput());
return BuildActor(mapper, color);
}
看到了,这里面的关键对象是vtkAppendPolyData,它不断的Append polydata,最后赋给一个mapper和actor!
这就有点厉害了!
用这种方法,可以非常快速的生成大量的球,但也有一点,就是大概只能生成几万个,再多的可能也就不太行了,当然,毕竟在实际应用中几万个也差不多了!
对了,这里面的X3DVertex是个自定义的对象,就是三维坐标而已!
这就是第二种方法,第三种方法可以突破几万个点的限制,可以绘制上千万个点!
敬请期待!!!