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

在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;
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值