C#+VTK三维开发:快速生成大量球体Sphere的三种方法(之二)

在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是个自定义的对象,就是三维坐标而已!

这就是第二种方法,第三种方法可以突破几万个点的限制,可以绘制上千万个点!

敬请期待!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值