1

ライトがあり、ある時点でそれを削除した後、再度追加したいとします。

アニメーション関数によって呼び出され続けるレンダリング関数で追加と削除を行います。

チェックボックスがオンになっているかどうかを確認し、(scene.add(light)) を追加し、そうでない場合は (scene.remove(light)) を削除します。

この場合、レンダー関数でチェック ボックスがオンになっていると、多くのオブジェクト (ライト) を追加しますが、パフォーマンスへの影響はありますか? 追加し続けないようにフラグまたはカウンターを追加することもできますが、isInstanceof のチェックなど、他にできることはありますか?

4

1 に答える 1

0

canvas/threejs レンダラーのサーバー側制御については、これらのオブジェクトを配列に格納するだけでよいことがわかりました。ローダーまたは他のメッシュを使用する場合は、それに名前を追加するだけです。

これにより、(私の場合) オブジェクトが既にシーンにあるかどうかを簡単に確認できます。

例:

var AllObject = []; // <-- the array that holds all objects in the scene.

var scene = new THREE.Scene(), // <-- creates basic threejs scene
    camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ),
    renderer = new THREE.WebGLRenderer();  //<-- creates WebGL renderer
renderer.setSize( window.innerWidth, window.innerHeight ); //<-- set the size of the canvas
document.body.appendChild( renderer.domElement ); //<-- add canvas to body

/* now the part that i use to check if an object is already in scene. */
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
AllObject[NAMEOFOBJECT] = new THREE.Mesh( geometry, material ); //<-- here comes the trick, insted of making a new var object just put it into an array with [] not {}!
scene.add( cube );

以下の if ステートメントを使用すると、オブジェクトを見つけることができ、if ステートメントは配列のindexOf位置番号をチェックします。

if(~AllObjects.indexOf("NAMEOFOBJECT"){
 // you could remove the object by using scene.reomve(AllObjects.NAMEOFOBJECT);
// or just say for example console.log("Object already in the scene");
}else{
 // here you can make the object if it doesn't exists.
}

NAMEOFOBJECT任意の名前にすることができます。

于 2016-03-02T20:00:43.580 に答える