gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:43:13 24 4
gpt4 key购买 nike

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

最佳答案

根据 This Page :

Create different models only when they require different Materials or Transforms. Otherwise, try to coalesce many GeometryModel3D instances with the same Materials and Transforms into a few larger GeometryModel3D and MeshGeometry3D instances.

与其创建多个 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 的指定,因为如果未指定,它们将被推断。虽然我怀疑这会给你带来很多处理时间,而且我不确定它以后是否会对性能产生影响。

关于c# - 在 WPF Viewport3D 中可视化点云非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31247321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com