我正在尝试使用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);
答案 0 :(得分:1)
仅在需要不同的材料或时才创建不同的模型 变换。否则,尝试合并许多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
,因为它们是推断的。虽然我怀疑这会给你带来多少处理时间,但我不确定它是否会在以后产生性能影响。