Javascript 指定数组材质

Javascript 指定数组材质,javascript,three.js,Javascript,Three.js,如果我将framemat指定给createScene(ID,geometry,1,framemat)它工作正常,如果我指定createScene(ID,geometry,1,materials[ID])它不工作 var jsonLoader = new THREE.JSONLoader(), paths = [ "obj/jgd/GALD-JGD-frame.json", "obj/jgd/GALD-JGD-logo.json",

如果我将
framemat
指定给
createScene(ID,geometry,1,framemat)
它工作正常,如果我指定
createScene(ID,geometry,1,materials[ID])
它不工作

    var jsonLoader = new THREE.JSONLoader(),
    paths = [
        "obj/jgd/GALD-JGD-frame.json", 
        "obj/jgd/GALD-JGD-logo.json", 
        "obj/jgd/GALD-JGD-light.json"
    ],

    materials = [
        "framemat", 
        "logomat", 
        "lightmat"
    ],                  

    objNum = paths.length; // Cache obects.length

for ( var id = 0; id < paths.length; id++ ) {

    (function(){ // IIFE start

        jsonLoader.load( paths[id], function( geometry, materials ) { 

                createScene( id, geometry, 1, materials[id] ) 
            }
        );

    })(); // IIFE end
}

您的代码是不明确的:首先定义一个名为
materials
的数组,然后使用JSONLoader的第二个参数并将其命名为
materials
以捕获json文件中的纹理,最后使用
materials[id]
在网格创建时传递材质。是哪一个?尽管第一个数组仍然充满字符串,但json可以有一个材质数组而不是一个,更糟糕的是,这个数组中可能不存在秩
[id]

因此,您有两种解决方案:

  • 如果要独立创建材质,请仅保留第一个数组,并添加缺少的将字符串转换为材质的函数。只需删除JSONLoader的第二个参数

  • 如果您想使用JSON文件中提供的材料,那么数组
    materials
    是无用的,可能会导致其他错误。那么有两种选择:

    • 如果整个对象只有一种材质,请按以下方式编写:
      createScene(…,…,materials)

    • 如果对象有多个材质,请按如下方式:
      createScene(………,新的三个.meshfaceMeterial(材质);


为什么您的材料是字符串?是打字错误吗?
function createScene( id, geometry, scale, material ) {
    geometry.computeTangents();
    objects[id]= new THREE.Mesh( geometry, material );
    objects[id].scale.x = objects[id].scale.y = objects[id].scale.z = scale;
    scene.add( objects[id] );
}