2013-02-13 220 views
1

我正在写一个Three.js原型,使用Leap Motion与对象交互。每一帧(或经常),我想检查用户手指的表示是否在场景中的对象之上或之下。Three.js Raycaster交叉物体太慢?

我已经完成了下面的代码,但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); 

} 

回答

2

我傻,当然它的速度慢的原因是因为剪刀对象是一个不平凡的模型。现在我将它包含在一个不可见的多维数据集中,并对其进行测试。现在速度非常快(0-1毫秒):-)

+0

你能发布一个链接到一个工作示例或使用不可见的多维数据集的示例代码吗?我遇到了同样的问题,我正在尝试不同的方法来查看哪个给了我最好的总体结果。 – SeeDoubleYou 2013-12-13 09:41:45

+0

对不起,我们只能在公司内部共享一个内部原型。 (我可以分享视频http://labs.pearson.com/prototypes/virtualassist/,但不是实际的应用程序)。如果我可以帮助你解决任何具体问题,请告诉我(如果你想给我发电子邮件,请联系peter [dot] oshaughnessy [at] gmail.com)。 – poshaughnessy 2013-12-13 13:25:04