3

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

我的问题是,下面负责此操作的代码仅需要 3 秒才能运行。将 Model3DGroup 添加到视口后,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);
4

2 回答 2

1

每页:_

只有在需要不同的材质或变换时才创建不同的模型。否则,尝试将许多具有相同材质和变换的 GeometryModel3D 实例合并为几个更大的 GeometryModel3D 和 MeshGeometry3D 实例。

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

为了进一步提高速度,您可以并行创建您的位置(Parallel.ForEach 示例

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

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

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

于 2015-09-04T22:08:55.843 回答
0

我有一个类似的问题并通过使用https://github.com/jeremjlr/MurphyDisplay解决了它

它有示例,可以嵌入到 WPF 中,完美地显示点云并可以做其他事情。

于 2021-12-01T06:56:09.280 回答