Я пишу прототип Three.js для взаимодействия с объектами с помощью Leap Motion. Каждый кадр (или регулярно в любом случае), я хочу проверить, находится ли представление пальца пользователя выше или ниже объекта в сцене.Three.js Raycaster intersectObjects слишком медленно?
Я сделал это с помощью кода ниже, но вызов 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);
}
Вы могли бы разместить ссылку на рабочий пример или написать пример кода для использования невидимого куба? Я сталкиваюсь с теми же проблемами, и я пытаюсь найти разные методы, которые дают мне лучший общий результат. – SeeDoubleYou
Прошу прощения, это был внутренний прототип, который мы можем использовать только в нашей компании. (Я могу поделиться видео http://labs.pearson.com/prototypes/virtualassist/, но не с реальным приложением). Дайте мне знать, если я могу помочь вам с любыми конкретными вопросами (peter [dot] oshaughnessy [at] gmail.com, если вы хотите направить меня по электронной почте). – poshaughnessy