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 算法创建三角形(并使用字典从索引中获取“真实”坐标)。
只要稍微改进一下代码,循环就可以非常短,计算时间也相当短。
希望对某人有帮助。