5

それぞれ数百の球体を含む 2 つのシーンを描画し、これらのシーンを切り替える機能を提供するとします。これを行う最適な方法は何ですか?

現在、スイッチごとにすべての球を削除、作成、および描画しているため、スイッチには約 4 ~ 5 秒かかります。以下は、シーン スイッチで実行されるコードの例です。

clearObjects();
resetCamera();  

for(var i = 0; i < 500; i++) {
    var geometry = new THREE.SphereGeometry(radius, 50, 50);
    var material = new THREE.MeshLambertMaterial({color: 0xFFCC33});
    var sphere = new THREE.Mesh(geometry, material);
    sphere.position.set(randX, randY, randZ);

    scene.add(sphere);
    objects.push(sphere);   
}
4

1 に答える 1

6

繰り返しになりますが、1 つのシーンを使用して 2 つの部分に分割し、カメラの FOV (視野) を設定して、一度に 1 つのシーン パーツだけを表示できるようにしてから、カメラの位置を移動してください...より効率的に聞こえませんか?

2 つのシーンを使用する特別な理由がない場合は、いつでも 1 つのシーンだけでコードを実装できます。上記の方法を試すか、2 つのシーンを使用する理由を説明してください。

編集: 2 つのコンテナーを使用THREE.Object3Dして 2 つのシーンを表すこともできます。ここでは、特定のシーン オブジェクトをすべて格納し、一度にコンテナーの 1 つを表示/非表示にすることができます。を使用してコンテナのすべてのコンテンツを操作する方法よりもyourContainer.children[n].

したがって、一般的に、それがあなたがしたいことです:

var scene1Container = new THREE.Object3D();
var scene2Container = new THREE.Object3D();

scene1Container.add(firstObjectFromScene1);
//.....
scene1Container.add(nObjectFromScene1);

scene2Container.add(firstObjectFromScene2);
//.....
scene2Container.add(nObjectFromScene2);

これで、一度に 1 つのコンテナーを表示/非表示にすることができますscene1Container.visible = true/false;(そしてscene1Container.traverse、オブジェクトのすべての子に可視性の変更を適用することができます)。

于 2012-12-09T22:07:27.313 に答える