【问题标题】:Visualizing point clouds in WPF Viewport3D is extremely slow在 WPF Viewport3D 中可视化点云非常慢
【发布时间】:2015-09-23 16:29:05
【问题描述】:

我正在尝试使用 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);

【问题讨论】:

  • 即使经过优化,我相信您也不会看到正在搜索的结果。使用纯原生解决方案和 D3D 可能会为您提供更好的服务。看起来是一个有趣的项目。祝你好运。

标签: c# wpf kinect point-clouds viewport3d


【解决方案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 的指定,因为如果未指定,则会推断出它们。虽然我怀疑这会给您带来很多处理时间,而且我不确定它以后是否会对性能产生影响。

【讨论】:

  • hmm...直到我发布此问题后我才注意到问题是 2 个月大!哦,好吧……为了后代!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2021-02-14
    • 2015-05-07
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多