2

複数の JSON ファイルをロードして、それらのメッシュの可視性を制御したいと考えています。これを実現するために、それらを JSON ファイル名に関連付けました。私はそれを機能させましたが、解決策は私を喜ばせません。

THREE.JSONLoader を変更し、新しいパラメーターをコールバック関数に渡しました。そのため、three.js が新しくリリースされるたびに、three.js ファイルに再度パッチを適用する必要がありました。

これが私の実用的なソリューションです(クライアント側)。loader.load(filename, callback, meshname) の新しい 3 番目のパラメーターを参照してください。

パッチを適用した 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

タピオの素晴らしい答えの変形。このバリアントを使用すると、meshesオブジェクトを作成および管理する必要がなくなります。これは、作成されたハンドラー関数で直接目的のオブジェクト名を使用して、新しいメッシュ オブジェクトをそれぞれ作成することによって行われます。前と同様に、各メッシュの目的の名前meshNameはユーザーによって定義され、ハンドラーに渡されます。evalしかしその後、javascript関数 を使用して、新しいメッシュが目的の名前で作成されます。

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 に答える