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