1

我正在编写一个 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);

}
4

1 回答 1

2

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

于 2013-02-13T18:57:47.313 回答