我正在编写一个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);
}
答案 0 :(得分:2)
愚蠢的我,当然它之所以慢,是因为剪刀对象是一个非平凡的模型。现在我将它包含在一个不可见的立方体中,然后对其进行测试。它现在超级快(0-1毫秒): - )