three.js:如何检查某个对象是否已从场景中添加或删除?

时间:2013-06-11 01:39:05

标签: object runtime three.js add

假设您有一个灯,并且在某些时候您将其删除,然后您想再次添加它。

你可以在渲染函数中添加和删除,这些函数会被动画函数调用。

检查是否选中了复选框,添加(scene.add(light),否则删除(scene.remove(light)。

因此,在这种情况下,当我们在渲染功能中选中复选框时,我们是否添加了很多对象(灯光),是否有任何性能影响?我们可以添加一个标志或计数器以不继续添加,但是我们还能做些什么来检查isInstanceof?

1 个答案:

答案 0 :(得分: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可以是您想要的任何名称。