2

我想加载多个 JSON 文件并控制其网格的可见性。为此,我将它们与它们的 JSON 文件名相关联。我得到了它的工作,但解决方案并不让我满意。

我修改了 THREE.JSONLoader 并将一个新参数传递给回调函数。因此,对于 three.js 的每个新版本,我都必须再次修补 three.js 文件。

这是我的工作解决方案(客户端)。请参阅 loader.load(filename, callback, meshname) 的新第三个参数。

有没有更好的解决方案,不需要打补丁的three.js 库?

谢谢

// Load the JSON files
var meshes = new Object();
var jsonFileNames = ['assembly/part1.json', 'assembly/part2.json', 'assembly/part3.json'];
for(var i = 0; i < jsonFileNames.length; i++){
    var loader = new THREE.JSONLoader();
    var meshName = jsonFileNames[i].split("/")[1].split(".")[0];
    loader.load(jsonFileNames[i], function(geometry, meshName){
        mesh = new THREE.Mesh(geometry, new THREE.MeshPhongMaterial({vertexColors: THREE.FaceColors}));
        mesh.scale.set(0.2, 0.2, 0.2);
        mesh.doubleSided = true;
        scene.add(mesh);
        meshes[meshName] = mesh;
    }, meshName);
}

// ....

// Access their meshes
meshes[meshName].visible = true;
4

2 回答 2

2

您可以创建一个如下所示的回调工厂。当在循环内创建时,它将解决闭包问题。

function makeHandler(meshName) {
    return function(geometry) {
        mesh = new THREE.Mesh(geometry, new THREE.MeshPhongMaterial({vertexColors: THREE.FaceColors}));
        mesh.scale.set(0.2, 0.2, 0.2);
        mesh.doubleSided = true;
        scene.add(mesh);
        meshes[meshName] = mesh;
    };
}

// Load the JSON files
var meshes = new Object();
var jsonFileNames = ['assembly/part1.json', 'assembly/part2.json', 'assembly/part3.json'];
for(var i = 0; i < jsonFileNames.length; i++){
    var loader = new THREE.JSONLoader();
    var meshName = jsonFileNames[i].split("/")[1].split(".")[0];
    loader.load(jsonFileNames[i], makeHandler(meshName));
}

// ....

// Access their meshes
meshes[meshName].visible = true;
于 2012-10-02T11:52:53.473 回答
0

Tapio 出色答案的变体。这种变体避免了创建和管理meshes对象的需要。它通过直接在制作的处理程序函数中创建具有所需对象名称的每个新网格对象来做到这一点。和以前一样,每个网格所需的名称meshName由用户定义并传递给处理程序。但随后使用 javascripteval函数以所需名称创建新网格。

function makeHandler(meshName) {
    return function(geometry) {
        material = new THREE.MeshPhongMaterial({vertexColors: THREE.FaceColors})
        eval (meshName + "= new THREE.Mesh(geometry, material);" );  //***NEW ***
        eval ( "var mesh = " + meshName +";" ); //*** NEW ***
        mesh.scale.set(0.2, 0.2, 0.2);
        mesh.doubleSided = true;
        scene.add(mesh);
        //*** NOT REQUIRED *** meshes[meshName] = mesh;
    };
}

// Load the JSON files
var meshes = new Object();
var jsonFileNames = ['assembly/part1.json', 'assembly/part2.json', 'assembly/part3.json'];
for(var i = 0; i < jsonFileNames.length; i++){
    var loader = new THREE.JSONLoader();
    var meshName = jsonFileNames[i].split("/")[1].split(".")[0];
    loader.load(jsonFileNames[i], makeHandler(meshName));
}

// ....

随后(加载完成时)可以通过其对象名称引用各种网格:-

// Access the meshes
    //*** OLD *** meshes["part1"].visible = true;
    //*** OLD *** meshes["part2"].visible = true;
    //*** OLD *** meshes["part3"].visible = true;
    part1.visible = true;//*** NEW ***
    part2.visible = true;//*** NEW ***
    part3.visible = true;//*** NEW ***
于 2015-04-06T14:24:10.833 回答