Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Three.TextureLoader未加载图像文件_Javascript_Node.js_Google Chrome_Three.js - Fatal编程技术网

Javascript Three.TextureLoader未加载图像文件

Javascript Three.TextureLoader未加载图像文件,javascript,node.js,google-chrome,three.js,Javascript,Node.js,Google Chrome,Three.js,因此,我一直在处理THREE和Node,直到现在,我一直在使用TextureLoader类加载纹理,如下所示: var loader = new THREE.TextureLoader; loader.crossOrigin = ''; function createSphere ( radius , segments , rings ) { var geometry = new THREE.SphereGeometry(radius , segments , rings); va

因此,我一直在处理THREE和Node,直到现在,我一直在使用TextureLoader类加载纹理,如下所示:

var loader = new THREE.TextureLoader;
loader.crossOrigin = '';

function createSphere ( radius , segments , rings ) {

  var geometry = new THREE.SphereGeometry(radius , segments , rings);

  var material = new THREE.MeshPhongMaterial({

        map: loader.load('./images/...'),
        bumpMap: loader.load('./images/...'),
        ect...

  });

  return new THREE.Mesh ( geometry, material )
}
它工作正常,然后我决定在创建材质时不加载纹理,而是预加载所有纹理,因此我制作了一个小实用程序来实现这一点:

var loader = new THREE.TextureLoader;
loader.crossOrigin = '';

var textureMap = {

earthTex : {file : 'earth_no_ice_clouds.jpg', message : 'Loading Global Land Masses'},
earthBumpTex : {file : 'earth_bump.jpg', message : 'Loading Global Depth'},
earthSpecTex : {file : 'earth_specular.png', message : 'Loading Water'},
earthCloudTex : {file : 'earth_clouds.png', message : 'Loading Clouds'},
earthCultureTex : {file : 'earth_cultural.png', message :'Loading Country Borders'},
earthLookUpTex : {file : 'earth_lookup.jpg', message :'Loading Country Projections'},
moonTex : {file : 'moon.jpg', message :'Loading Lunar Surface'},
moonBumpTex : {file : 'moon_bump.jpg', message : 'Loading Lunar Depth'},
skyDomeTex : {file : 'galaxy_3.png', message : 'Loading Galaxy'}

};

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
}

function loadTextures(  ) {

    var path = "./images/";
    var size = Object.size(textureMap);
    var count = 0;

    for(var key in textureMap) {
        var textureItem = textureMap[key];
        var texture = loader.load(path + textureItem.file);
        console.log(texture);
    }
}

loadTextures();
每当我在浏览器(Chrome)中打开开发工具运行此操作时,最终被记录的THREE.texture对象的image属性设置为“undefined”,src属性设置为“”。我不明白为什么会发生这种情况,而且我没有更改.png或.jpg文件的任何路径,也没有更改使用TextureLoader的文件的位置

当我试图在上面运行第一段代码时,也会发生错误,现在我似乎无法将任何纹理加载到我的应用程序中

如果您能帮助我们理解为什么会突然发生这种情况,我们将不胜感激

编辑

我编辑了第一个代码块,试图使我的问题更清楚。我以前没有使用过承诺或回电之类的东西。我刚刚调用了我的“createSphere”函数和场景初始化函数中的类似函数。它过去工作得很好,我加载纹理时没有问题


现在,使用与以前相同的程序结构,第一个代码块不起作用。

您没有正确调用它
TextureLoader.load()
立即返回(带有一个空的、仍有待填充的
THREE.Texture
对象…它仅在请求完成时填充),并且不等待加载图像

相反,正如您在其文档中所看到的,您可以为其提供回调方法,这些方法将在加载完成、完成或正在进行时调用

以文档中的示例为例:

// instantiate a loader
var loader = new THREE.TextureLoader();

// load a resource
loader.load(
    // resource URL
    'textures/land_ocean_ice_cloud_2048.jpg',
    // Function when resource is loaded
    function ( texture ) {
        // do something with the texture
        var material = new THREE.MeshBasicMaterial( {
            map: texture
         } );
    },
    // Function called when download progresses
    function ( xhr ) {
        console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
    },
    // Function called when download errors
    function ( xhr ) {
        console.log( 'An error happened' );
    }
);
如果要等待加载所有纹理,这将变得更加复杂。一种方法是使用承诺,下面是我以前提出的一个非常类似的问题的答案: