在python的3D表面上覆盖纹理

时间:2014-01-14 08:32:24

标签: python opengl matplotlib

我的目标是在表面上绘制纹理(即图像),并使用python以3D形式显示它。该应用程序正在通过DEM查看正射摄影,我使用gdal导入我的数据(图像和DEM)。我尝试使用matplotlib中的plot_surface,但似乎我无法在表面添加纹理。

这是当前的代码:

from osgeo import gdal
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
import numpy as np

ds = gdal.Open('MyDEM.cub')
dem = ds.ReadAsArray()

do = gdal.Open('MyOrtho.cub')
or = do.ReadAsArray()

xres = gt[1]
yres = gt[5]

X = np.arange(gt[0], gt[0] + dem.shape[1]*xres, xres)
Y = np.linspace(gt[3], gt[3] + dem.shape[0]*yres, ds.RasterYSize)

X, Y = np.meshgrid(X, Y)

fig, ax = plt.subplots(figsize=(16,8), subplot_kw={'projection': '3d'})

surf = ax.plot_surface(X,Y,dem,rstride=1, cstride=1,linewidth=0, antialiased=True,cmap=plt.cm.RdYlBu_r)


fig.colorbar(surf, shrink=0.4, aspect=20)

plt.show()

我如何使用或数组作为纹理(例如,或者可以具有与dem不同的分辨率/大小,但稍后我将对此进行管理),我想首先使用具有纹理的愚蠢3D表面。这在Matlab中很容易,但如何用Python做到这一点?有什么想法吗?

2 个答案:

答案 0 :(得分:4)

Yeah Mayavi会这样做。您可以在gdal中打开DEM文件,然后将图像作为纹理拉入TVTK。最后,您可以使用mlab.surf()命令将其包装在表面上。这是一个很好的例子的链接。

Example

答案 1 :(得分:3)

来自the matplotlib docs

  

Axes3D.plot_surface(X, Y, Z, *args, **kwargs)

     

创建表面图。

     

默认情况下,它会以纯色的阴影着色,但它也通过提供cmap参数来支持颜色映射。

因此,似乎matplotlib不支持在曲面图上使用任意图像。您需要确定另一个提供此功能的库(快速搜索表明mayavi可能会执行您想要的操作)。