簡體   English   中英

ThreeJS分配數組材料

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM