Python 球面上UV映射的变换单纯形映射

Python 球面上UV映射的变换单纯形映射,python,three.js,map-projections,uv-mapping,simplex-noise,Python,Three.js,Map Projections,Uv Mapping,Simplex Noise,我想动态生成一个基于单纯形的图像,它将很好地映射到three.js中的球体上,但是我在极点处有失真的问题。以下是初始地图代码: def generate_map(seed,width=WIDTH,height=HEIGHT,xoffset=0.0,yoffset=0.0,zoom=1.0): """ Return a simple matrix of simplex noise from 0-255.""" mapdata = [] random.seed(seed)

我想动态生成一个基于单纯形的图像,它将很好地映射到three.js中的球体上,但是我在极点处有失真的问题。以下是初始地图代码:

def generate_map(seed,width=WIDTH,height=HEIGHT,xoffset=0.0,yoffset=0.0,zoom=1.0):
    """ Return a simple matrix of simplex noise from 0-255."""
    mapdata = []
    random.seed(seed)
    zoom=zoom * 100.0
    for x in xrange(height):
        row=[]
        for y in xrange (width):
            xparam=merc_x(float((x+xoffset)/zoom))
            yparam=merc_y(float((y+yoffset)/zoom))
            noisevalue=snoise2(xparam, yparam,  NOISEOCTAVES, 0.52,2.0, height/zoom*2, width/zoom, float(seed) )
            #convert 1.0...-1.0 to 255...0
            pixel=int((noisevalue+1)/2*PIXEL_DEPTH-1)
            cell={'height': pixel, 'x':x, 'y':y }

            row.append( cell )
        mapdata.append(row)

    return mapdata
这将生成数据,创建一个横向平铺的贴图,但不在顶部和底部平铺(这是理想的)

在three.js中将其映射到球体上时会出现问题:

return new THREE.Mesh(
    new THREE.SphereGeometry(radius, segments, segments),
    new THREE.MeshPhongMaterial({
        map:         THREE.ImageUtils.loadTexture('/worldmap.png?seed='+seed),
    })
);
由于发生了UVMapping,最终会在极点附近发生挤压:

我怀疑解决挤压问题的最简单方法是在源图像上使用墨卡托变换,但就我而言,我不知道如何实现它

有人有什么建议吗?如果您想尝试一下,可以找到项目的完整源代码

更新:
结合wikipedia上的便利图表和,我认为这是一个很好的开始…

google“球体上的柏林噪声”。示例:大多数示例的问题是,对于应用程序的其他部分,我仍然需要一个平面图,因此我不能跳过这一步,直接转到3d simplex noise。