【问题标题】:Going from a point cloud to a solid mesh从点云到实体网格
【发布时间】:2018-08-26 20:13:01
【问题描述】:

我一直在尝试将一组复杂的点渲染为 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>

这段代码的结果,连同我整理的数据如下:

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

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

【问题讨论】:

  • 你有体积数据还是只有表面点?最好以 ASCII 格式分享一些样本(不必很大只是一部分),这样任何人都可以毫无问题地阅读它或需要一些库
  • @Spektre 我只有表面点——没有体积数据。我手边没有数据,但我可以在下班后上网。每个只是一组 x,y 坐标。 z 坐标是通过将常数乘以层的索引来设计的。不过,我会很高兴有一个简化的版本,甚至可能只是一组点的立方体或四面体。
  • 不,您需要有一个有效的样本,这样您的形状的某些部分就足够了(甚至切割)。重点是创建点拓扑,将邻居映射到一些u,v 坐标(网格),然后只做一个三角形条形切片......因为你得到z 坐标直接与网格对齐,那么你只需要处理2个切片有时像这样:How can I connect two parallel 2d polygons to create a seamless 3d mesh? 但我怀疑您的数据像大多数扫描仪一样具有各向同性点密度,因此可能有更简单的解决方案...
  • 据我了解,您的点代表表面的样本。如果是这样的话,你要做的就是所谓的表面重建,这是一个完整的研究领域。只需选择适合您的场景和数据的重建方法。例如。泊松曲面重建应用非常广泛(但它需要曲面法线)。或者,如果它们不代表表面样本,而您只是想将它们可视化为某种管或球,请查看 Metaballs

标签: c# .net graphics 3d


【解决方案1】:

这实际上取决于您拥有的点数据集。 一种稳健的重建方法是行进立方体(或行进四边形)算法。 但是,如果您的数据集已经组织好,我猜显然是像下面这样的层形式。

然后可以使用一些更简单的方法。在这种情况下,我会这样做: - 首先订购您的图层。 - 创建一个两层两层的“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 算法创建三角形(并使用字典从索引中获取“真实”坐标)。

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

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 2013-11-20
    • 2019-08-14
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2017-10-02
    • 2020-04-12
    相关资源
    最近更新 更多