2017-04-25 39 views
0

我有一个表面,给定为r[i, j],phi[i, j]theta[i, j](球坐标系统中的高度图)。如何绘制一个大的3D表面(10000 x 10000点)?

这是相当大的:约10K×10K点。我知道它可以很容易地绘制为二维色彩图像(例如,在PyQtGraph中),但我想以某种方式将它绘制为曲面(以演示圆形地球的效果)。

有没有人已经绘制这样的大表面?你是如何对付他们的?

+0

100M分的确是一个很大的数字。你确定你确实需要这个级别的精度,为什么? – hidefromkgb

+0

那么,AFAIK,一些3D引擎可以省略多余的点数?只有当一个区域放大时,才需要完全精确度,而不是整个表面。 – Felix

+2

是的。但构建LOD是一项几乎不适合运行时间的任务。 – hidefromkgb

回答

2

LoD是你必须实现的东西。对于高程数据来说很简单;四叉树是完成此任务的完美搭配,您可以使用高质量的滤波器内核。由于四叉树中的细化遵循几何级数,因此总内存需求收敛到2×原始数据集。

三角形球体有几点注意事项:你总是会出现两极或不连续;当使用球面坐标时,你有两个极差面元素退化的极点,这是你想避免的。

更好的方法是将球体表示为基于立方体的6边的映射;即假设立方体的面被细分为期望的分辨率并且该网格的每个顶点投影到基球的表面上。这样做的一个好的副作用是,您实际上可以将您的高度图数据存储在立方贴图纹理图像中,并完成滤波的LoD级别。在顶点着色器中,您可以对数据进行采样以取代网格。

网格LoD可以通过多种方式实现。但是,这里有一个有趣的建议:从屏幕空间中的网格开始,将其投影到要采样的球体上。这样,您将生成的顶点恰好只是实际可见的球体部分;因为您要取代顶点,所以需要添加一点点的边距以达到较好的效果。在地平线上方的顶点将会错过球体;很容易将这些顶点剪切到水平线(找到二次方程的根)。您可以在顶点着色器中执行所有这些操作,并使用镶嵌阴影着色以在适用的情况下优化网格。

关于10k×10k网格分辨率的注释。除非您要在至少20k×20k像素的显示器上显示,否则有限的显示分辨率实际上会对导致频率混叠的网格进行二次采样(参见奈奎斯特定理)。