如何绘制一个大的3D表面(10 000 x 10 000点)?

时间:2017-04-25 13:37:28

标签: qt opengl plot

我的表面为r[i, j]phi[i, j]theta[i, j](球面坐标系中的高度贴图)。

它相当大:x 10K点大约10K。

我知道它可以很容易地绘制成2D色彩映射图像(例如,在PyQtGraph中),但我想以某种方式将其绘制为曲面(以展示圆形地球的效果)。

有没有人已经绘制了如此大的表面?你是怎么对付他们的?

1 个答案:

答案 0 :(得分:2)

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

三角测量球时有一些注意事项:你总是会遇到极点或不连续点;当使用球面坐标时,你有两个极点,差分表面元素退化,这是你宁愿避免的。

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

Mesh LoD可以通过多种方式实现。但是这里有一个有趣的建议:从屏幕空间中的网格开始,将其投影到要采样的球体上。这样你就可以生成顶点,这些顶点恰好只是实际可见的球体部分;添加一点保证金以获得良好的衡量标准,因为您将取代顶点。在地平线上方顶点将错过球体;将这些顶点精确地剪切到地平线(找到二次方程的根)很容易。您可以在顶点着色器中执行所有这些操作,并使用tesselation着色对其进行调整以在适用的情况下优化网格。

关于10k×10k网格分辨率的说明。除非您要在至少20k×20k像素的显示器上显示它,否则有限的显示分辨率实际上会对网格进行二次采样,从而产生频率混叠(参见Nyquist定理)。