ThreeJS分配阵列材料

时间:2015-06-30 15:21:42

标签: 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", 
        "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
}

这里的CreateScene乐趣:

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] );
}

1 个答案:

答案 0 :(得分:0)

您的代码含糊不清:首先定义一个名为materials的数组,然后使用JSONLoader的第二个参数,并将其命名为materials以捕获json文件中的纹理,最后使用{ {1}}在网格创建时传递材质。哪一个 ?虽然第一个数组仍然用字符串填充,但json可以有一个材料数组而不是只有一个,更糟糕的是,在这一个中可能不存在所有等级materials[id]

所以你有两个解决方案:

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

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

    • 如果您有整个对象的一种材料,请按以下方式编写:materials

    • 如果对象有多种材质,请这样:createScene(...,..., materials);