从点云到实体网格

Dan*_*iel 5 .net c# 3d graphics

我一直在尝试将一组复杂的点渲染为 3D 可视化。我有一组图层,每个图层都有多个多边形,每个多边形都有不同数量的点。

我尝试了大量的 .NET 库(OpenGL、DirectX 等的包装器),最终使用 Helix Toolkit 实现了超级简单的 WPF 3D 控件,只是为了渲染 3d 点云可视化。我的超级简单的代码如下所示:

private void Render3D(List<Layer> layers) {
  var layerIndex = 0;
  var pts = new Point3DCollection();

  foreach (var layer in layers) {
    foreach (var shape in layer.Shapes) {
      foreach (var point in shape.Points) {
        pts.Add(new Point3D(point.Item1, point.Item2, layerIndex * .5));
      }
    }
    layerIndex++;
  }

  var vis = new PointsVisual3D() { Points = pts };
  _viewport.Children.Add(vis);
}
Run Code Online (Sandbox Code Playgroud)

我的 XAML 如下:

<Window xmlns:h="http://helix-toolkit.org/wpf">
  <h:HelixViewport3D Name="_viewport">
    <h:SunLight />
  </h:HelixViewport3D>
</Window>
Run Code Online (Sandbox Code Playgroud)

这段代码的结果以及我整理的数据如下:

在此输入图像描述

这太棒了,我非常兴奋能够真正以 3D 形式看到我的数据,但我想更进一步,开始从我的点数据实际渲染实体形状,有点像这样:

在此输入图像描述

我正在使用 .NET,如果可能的话,我希望坚持使用这个平台,但我对其他想法持开放态度。希望这足以得到一个明确的答案。

小智 4

这实际上取决于您拥有的点数据集。一种稳健的重建方法是 Marching 立方体(或 Marching tetras)算法。但是,如果您的数据集已经以分层的形式组织起来,我猜显然如下所示。 在此输入图像描述

那么可以使用一些更简单的方法。在这种情况下,我会像这样继续: - 首先订购图层。- 创建一个两层两层的“for”循环:

Mesh MyMesh = new Mesh();
for (int i = 0; i< layers.Count -1; i++)
{
 Expand(layers[i+1]);
 Dictionary<int[],Point[]> localMesh = project(layers[i], layers[i+1]
 MyMesh.AddTriangles( Delaunay2D(localMesh));
}
Run Code Online (Sandbox Code Playgroud)

扩展功能只是垂直于层法线稀疏数据点。(为了避免两层之间的点重叠)投影函数将两个连续层的点投影在同一平面上,以便可以执行Delaunay三角剖分。该字典允许您跟踪投影点和“真实点”之间的点索引。最后使用 Delaunay 算法创建三角形(并使用字典从索引中获取“真实”坐标)。

只要稍微改进一下代码,循环就可以非常短,计算时间也相当短。

希望对某人有帮助。