从点云到实体网格

时间:2017-03-23 03:19:18

标签: c# .net 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);
}

我的XAML如下:

<Window xmlns:h="http://helix-toolkit.org/wpf">
  <h:HelixViewport3D Name="_viewport">
    <h:SunLight />
  </h:HelixViewport3D>
</Window>

此代码的结果以及我安排的数据如下:

enter image description here

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

enter image description here

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

1 个答案:

答案 0 :(得分:1)

这实际上取决于您拥有的点数据集。 一种强大的重建方法是行进立方体(或行进四边形)算法。 但是,如果您的数据集已经组织好了,我想应该是像波纹管这样的分层形式。 enter image description here

然后可以使用一些更简单的方法。在这种情况下,我将这样进行: -从订购图层开始。 -创建一个“ 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));
}

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

通过一些代码改进,循环可能非常短,计算时间也很短。

希望对某人有帮助。