Three.js Raycaster intersectObjects太慢了?

时间:2013-02-13 18:57:47

标签: three.js

我正在编写一个Three.js原型,用于使用Leap Motion与对象进行交互。每个帧(或者无论如何),我想检查用户手指的表示是在场景中对象的上方还是下方。

我已经使用下面的代码完成了这项工作,但是,即使只是测试一个对象,intersectObject调用也需要大约200毫秒。这导致动画变慢并变得非常生涩(我已经尝试过这样做,例如每20帧而不是每帧一次,但是它仍然每20帧抖动一次)。

有没有办法更快地完成这项工作?难道我做错了什么?其他人如何处理这个?

谢谢!

代码:

...

var filepath = '../models/Scissors.js';

loader.load(filepath, function(geometry, materials) {

  scissors = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial(materials) );
  scene.add( scissors );

});

...


function update() {

  ...

  // NB. Sphere1 has been positioned to represent the user's index finger 
  // in 3D space

  var vector = sphere1.position.subSelf( camera.position );

  var ray = new THREE.Raycaster( camera.position, vector.clone().normalize() );

  var start = new Date().getTime();

  var collisions = ray.intersectObjects( [scissors] );

  // Takes about 200ms
  console.log('Took ' + (new Date().getTime() - start) + ' ms' );

  if( collisions.length > 0 ) {
    console.log('HIT!');
  }

  ...

  requestAnimFrame(update);

}

1 个答案:

答案 0 :(得分:2)

愚蠢的我,当然它之所以慢,是因为剪刀对象是一个非平凡的模型。现在我将它包含在一个不可见的立方体中,然后对其进行测试。它现在超级快(0-1毫秒): - )