【问题标题】:ThreeJS assign array materialsThreeJS 分配数组材质
【发布时间】:2015-07-01 22:08:31
【问题描述】:

如果我将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
}

在这里创建场景很有趣:

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

【问题讨论】:

  • 为什么你的材料是字符串?是不是打字错误?

标签: javascript three.js


【解决方案1】:

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

所以你有两个解决方案:

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

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

    • 如果整个对象只有一种材质,请这样写:createScene(...,..., materials);

    • 如果你有多个对象的材料,这样:createScene(....,....,new THREE.MeshFaceMaterial(materials);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2023-03-24
    • 2021-08-08
    • 2015-08-16
    • 2018-07-01
    相关资源
    最近更新 更多