【发布时间】: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。