Я работаю над реализацией функции перетаскивания для перетаскивания объектов с отслеживаемыми элементами управления движением от кончика лазера в сцене Aframe. Когда пользователь наводит курсор на объект со своим лазером и удерживает триггер, вызывается функция перетаскивания, которая должна использовать начальную точку пересечения лучей, расстояние от точки пересечения до центра объекта (смещение пересечения), длину луча в точке пересечения; а также источник, длину и направление объекта лучевого вещания, чтобы вычислить, куда следует переместить объект.
drag(intersectionOffset, intersection) {
if (this.state.selected) {
let element = this.state.selected.detail.el;
let raycaster = this.state.selected.detail.el.getAttribute('raycaster');
let newPos = new THREE.Vector3(0, 0, 0);
// newPos.add(raycaster.direction);
newPos.add(element.getAttribute('rotation'));
// I'm guessing this is around where the miscalculation is
console.log(newPos);
newPos.setX(Math.sin(THREE.MathUtils.degToRad(newPos.x)));
newPos.setY(Math.sin(THREE.MathUtils.degToRad(newPos.y)));
newPos.setZ(Math.sin(THREE.MathUtils.degToRad(newPos.z)));
newPos.multiplyScalar(intersection.distance);
newPos.add(raycaster.origin);
newPos.add(intersectionOffset);
this.state.selected.target.setAttribute('position', intersection.point.x + " " + newPos.y + " " + intersection.point.z);
setTimeout(function() {this.drag(intersectionOffset, intersection)}.bind(this), 10);
}
}
handleRaycasterIntersection = (e) => {
this.state.intersected = e;
}
handleRaycasterCleared = (e) => {
this.state.intersected = null;
}
handleRightTriggerDown = (e) => {
if (this.state.intersected) {
this.state.selected = this.state.intersected;
let intersection = this.state.selected.detail.getIntersection(this.state.selected.target);
let intersectionOffset = new THREE.Vector3(0, 0, 0);
intersectionOffset.subVectors(this.state.selected.target.getAttribute("position"), intersection.point);
this.drag(intersectionOffset, intersection);
}
}
handleRightTriggerUp = (e) => {
this.state.selected = null;
}
Проблема в том, что это не работает, поскольку, похоже, не вычисляется правильное местоположение вдоль луча. Вместо того, чтобы двигаться туда, где находится конец луча, он просто кажется go в случайных направлениях. Какие есть решения для правильного расчета, где луч будет на определенном расстоянии? Полагаю, я просто где-то использую неправильные триггерные функции. Спасибо