[英]ThreeJS assign array materials
如果我將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] );
}
您的代碼含糊不清:首先定義一個名為materials
的數組,然后使用JSONLoader的第二個參數,並將其命名為materials
以捕獲json文件中的紋理,最后在網格創建時使用materials[id]
傳遞材質。 哪一個 ? 盡管第一個數組仍填充有字符串,但json可以具有一個材料數組,而不是僅一個材料數組,更糟糕的是,所有排名[id]
可能不存在。
因此,您有兩種解決方案:
如果要獨立創建材質,請僅保留第一個數組並添加將字符串轉換為材質的缺失函數。 只需刪除JSONLoader的第二個參數即可。
如果要使用JSON文件中提供的材料,則數組materials
是無用的,並且可能導致其他錯誤。 然后有兩個選擇:
如果整個對象只有一種材質,則可以這樣編寫: createScene(...,..., materials);
如果對象有幾種材質,則采用這種方式: createScene(....,....,new THREE.MeshFaceMaterial(materials);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.