2013-02-13 95 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