在WPF Viewport3D中可视化点云非常慢

时间:2015-07-06 13:37:06

标签: c# wpf kinect point-clouds viewport3d

我正在尝试使用WPF的Viewport3D控件可视化~170000点的点云。在生成3D点坐标后,我在每个点创建一个具有特定大小的三角形,并将其添加到Model3DGroup对象中,该对象随后附加到我的Viewport。

我的问题是,以下代码负责此操作需要3秒才能运行。将Model3DGroup添加到Viewport后,UI将再冻结3-5秒。

如何让这项工作更快?此外,如果Viewport3D无法处理此数字的模型,是否有人可以推荐另一种在WPF控件中可视化点云的方法?

        viewport.Children.Clear();

        Model3DGroup triangles = new Model3DGroup();
        foreach (Point3D point in workspace.PointCloud)
        {
            double x = point.X;
            double y = point.Y;
            double z = point.Z;

            Point3D p1 = new Point3D(x + 0.005, y, z);
            Point3D p2 = new Point3D(x, y + 0.005, z);

            MeshGeometry3D mymesh = new MeshGeometry3D();
            mymesh.Positions.Add(point);
            mymesh.Positions.Add(p1);
            mymesh.Positions.Add(p2);
            mymesh.TriangleIndices.Add(0);
            mymesh.TriangleIndices.Add(1);
            mymesh.TriangleIndices.Add(2);

            Vector3D Normal = GeometryHelper.CalculateTraingleNormal(p0, p1, p2);
            mymesh.Normals.Add(Normal);
            mymesh.Normals.Add(Normal);
            mymesh.Normals.Add(Normal);

            Material Material = new DiffuseMaterial(
                new SolidColorBrush(Colors.Red) { Opacity = 0.5 });
            GeometryModel3D model = new GeometryModel3D(
                mymesh, Material);

            triangles.Children.Add(model);
        }

        ModelVisual3D modelVisual = new ModelVisual3D();
        modelVisual.Content = triangles;
        viewport.Children.Add(modelVisual);

1 个答案:

答案 0 :(得分:1)

This Page

  

仅在需要不同的材料或时才创建不同的模型   变换。否则,尝试合并许多GeometryModel3D实例   用相同的材​​料和变换成几个更大的   GeometryModel3D和MeshGeometry3D实例。

而不是创建多个MeshGeometry3D只创建一个并将其添加到单个GeometryModel3D。将单GeometeryModel3D添加到ModelVisual3D。这应该会显着提高模型的性能(我自己经历过这种情况)。

为了提高速度,您可以并行创建职位(Parallel.ForEach Example

      List<Point3D> points = new List<Point3D>();
      Parallel.ForEach(workspace.PointCloud, point =>
      {
        //Do Work
      }
      );
      Point3DCollection p3d = new Point3DCollection(points);
      mymesh.Positions = p3d;

我还没有测试过这段代码。要使其并行工作,可能还需要一些额外的工作。一定要用三元组创建点数,否则你会得到一个非常奇怪的点,这会产生一些疯狂的三角形。

如果未指定,您可以跳过指定TriangleIndices,因为它们是推断的。虽然我怀疑这会给你带来多少处理时间,但我不确定它是否会在以后产生性能影响。