2013-07-18 40 views
0

我目前正在为球体几何体的每个球体面加载一个不同的纹理,此刻它从上往下加载纹理。无论如何,开始加载纹理,说,球体的中间,并继续向外?您可以按特定顺序加载纹理吗?

仅供参考,这是我当前如何分配纹理每个球面

var sphere = new THREE.SphereGeometry(250, geo_width, geo_height); 

var materials = []; 
for(var y = 0; y < geo_height; y++){ 
    for(var x = 0; x < geo_width; x++){ 
     materials.push(loadTexture('getImage.php?x=' + x + '&y=' + y + '&zoom=2&type=' + type)); 
    } 
} 

for(var i = 0; i < sphere.faces.length; i++){ 
    sphere.faces[ i ].materialIndex = i; 
} 

回答

1

是的,你可以做到这一点。 首先,你应该开始按你想要显示的顺序加载纹理。在你的情况下,你需要改变你的循环,首先加载在球体中间的纹理。

var materials = new Array(geo_height*geo_width); 
// loading middle part of textures 
for(var y = yFrom; y < yTo; y++){ 
    for(var x = xFrom; x < xTo; x++){ 
     materials[y * geo_width + x] = loadTexture('getImage.php?x=' + x + '&y=' + y + '&zoom=2&type=' + type); 
    } 
} 
// loading other textures 
for(var y = 0; y < geo_height; y++){ 
    for(var x = 0; x < geo_width; x++){ 
     if (materials[y * geo_width + x] == undefined) 
      materials[y * geo_width + x] = loadTexture('getImage.php?x=' + x + '&y=' + y + '&zoom=2&type=' + type); 
    } 
} 

有时,如果您想确保某些纹理加载到其他纹理之前,您可以使用加载回调函数同步它们。为此,使用Imageutils.loadTexture(url,mapping,onLoad,onError)。例如,通过打包加载纹理:

function loadTexturesPack(texturesPack, cb) { 
    var count = 0, 
     textures = [], 
     onLoad = function() { 
      count++; 
      if (count == texturesPack.length) 
       cb(textures); 
     }; 
    for (var i = 0; i < texturesPack.length; i++) { 
     textures.push(Imageutils.loadTexture(texturesPack.url, null, onLoad));   
    } 
} 

function loadPacks(packs) { 
    var i = 0; 
     onLoad = function(textures) { 
      i++; 
      // do something with loaded textures 
      // ...  
      // load next texture pack 
      if (i < packs.length) { 
       loadTexturesPack(pack[i]); 
      } 
     }; 
    loadTexturesPack(pack[0]); 
} 
相关问题