如果我将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] );
}
答案 0 :(得分:0)
您的代码含糊不清:首先定义一个名为materials
的数组,然后使用JSONLoader的第二个参数,并将其命名为materials
以捕获json文件中的纹理,最后使用{ {1}}在网格创建时传递材质。哪一个 ?虽然第一个数组仍然用字符串填充,但json可以有一个材料数组而不是只有一个,更糟糕的是,在这一个中可能不存在所有等级materials[id]
。
所以你有两个解决方案:
如果要独立创建材质,只需保留第一个数组并添加将字符串转换为材质的缺失函数。只需删除JSONLoader的第二个参数。
如果要使用JSON文件中提供的材料,则数组[id]
无用,可能会导致其他错误。那么有两种选择:
如果您有整个对象的一种材料,请按以下方式编写:materials
如果对象有多种材质,请这样:createScene(...,..., materials);