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