Aframe / Three. js как найти точку на расстоянии по raycast - PullRequest
0 голосов
/ 08 мая 2020

Я работаю над реализацией функции перетаскивания для перетаскивания объектов с отслеживаемыми элементами управления движением от кончика лазера в сцене 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 в случайных направлениях. Какие есть решения для правильного расчета, где луч будет на определенном расстоянии? Полагаю, я просто где-то использую неправильные триггерные функции. Спасибо

...