Компонент «иди сюда». Так, что 2-й объект может найти 1-й объект и оживить его независимо от того, куда пользователь помещает 1-й объект - PullRequest
0 голосов
/ 23 января 2019

Как я могу создать компонент «иди сюда».Так, что 2-й объект может найти 1-й объект и анимировать его независимо от того, куда пользователь помещает 1-й объект.

У меня есть кнопка, которая путешествует с пользователем, она там при вызове, она не перемещаетсяс камерой он исчезает перед телепортом, и идея о том, что я хочу добавить к этой функции, заключается в том, что когда пользователь нажимает эту кнопку (идентификатор объекта: один), он будет говорить «иди сюда» к другому объекту (идентификатор объекта: два) сущность два прослушивает щелчок сущности 1, а затем сущность получает координаты сущности 1, а затем сущность 2 перемещается к сущности 1.

Более подробное описание того, что я пытаюсь сделать: Ранее я писал:«Как бы я написал функцию« приходи ко мне », когда одна сущность вызывает другую на новом месте.Допустим, у меня есть перетаскиваемая сущность, включены супер руки, и пользователь перетаскивает куб в новое место.Хорошо, тогда пользователь нажимает на куб, и сфера летит к позиции куба, но ее z (координата позиции z) относительно куба равна -1.Затем пользователь перетаскивает куб в другое новое место, щелкает куб своим лазером, и та же самая сфера до этого вылетает в новое место куба, но по-прежнему z-1 относительно куба.Как мне это написать?Каковы возможные подходы?Какой эффективный способ сделать это в рамке?я создал бы невидимую дочернюю сущность в кубе, который имеет позицию -1 z?Есть ли способ найти глобальную позицию дочерней сущности и затем сказать сферной сущности обновить свою позицию, чтобы она соответствовала позиции дочерних сущностей?Я бы суммировал это как функцию «приходи ко мне», когда одна сущность вызывает другую на свое новое место.

То, что я пытался: мне было предложено взглянуть на две вещи 1. Компонент поиска пути в дополнительных элементах кадра, которыепозволяет NPC перемещаться по мешу во время анимации, но для этого примера подойдет простая анимация.2. Следующий компонент (которому 2 года).Следующий компонент слишком абстрактен для моего текущего уровня понимания кода aframe.Я не понимаю, что следует, или как отредактировать это, чтобы заставить его делать то, что я хочу.

Что еще я попробовал: Потом я наткнулся на «Интерактивную сетку изображений в WebVR с A-рамкой» https://ottifox.com/prototype/2017/09/25/interactive-image-grid-in-webvr.html это заставляет камеру искать местоположение изображения, а затем переходить к нему при нажатии.Ну, я подумал, может быть, я смогу заменить камеру на коробку и заставить коробку переместиться на другую коробку вместо изображения.Ну, я попробовал это, и пока он ничего не делает.

Мой код здесь: https://comehere.glitch.me https://glitch.com/edit/#!/comehere Можете ли вы помочь мне решить, как заставить сущность искать позицию?другой сущности, а затем анимировать ему новое местоположение, чтобы пользователь мог обновлять позицию новой сущности, а при щелчке вторая сущность всегда может перемещаться в любое место, куда пользователь хочет ее перемещать, в зависимости от того, куда пользователь помещаетпервая сущность.

1 Ответ

0 голосов
/ 23 января 2019

Вы можете вручную переместить объект к цели, как я сделал здесь (нажмите на сферу).
Идея проста:

1) получить целевую позицию в локальном пространстве

targetPos = someEl.object3D.worldToLocal(target.object3D.position.clone())

2) переместить одну сущность в сторону

someEl.object3D.translateOnAxis(targetPos, someDistance)

3) повторять до тех пор, пока объект не окажется достаточно близко

var distanceFromTarget = currentPosition.distanceTo(target.object3D.position); 
if (distanceFromTarget > 1) { 
    someEl.object3D.translateOnAxis(targetPos, distance);
}

Вы можете бросить его в рамочный компонент:

AFRAME.registerComponent('foo', {
  init: function() {
     this.target = document.querySelector("#target")
  },
  tick: function(t, dt) {
     var currentPosition = this.el.object3D.position;
     var distanceToTarget = currentPosition.distanceTo(target.object3D.position);
     if (distanceToTarget < 1) return;

     var targetPos = this.el.object3D.worldToLocal(target.object3D.position.clone())
     var distance = dt*this.data.speed / 4000;      
     this.el.object3D.translateOnAxis(targetPos, distance);
  }
}

и использовать его так:

<a-box foo></a-box>
<a-box id="target"></a-box>

Вы можете использовать компонент animation, как вы это сделали, заново установив атрибут to:

 // on some event:
 this.el.setAttribute("animation", "to", newTargetPosition)
 this.el.emit("startAnimation")

Но это усложняется, если цель движется, поскольку не только выпотребуется получить новую позицию, но также и начальную (from) позицию.

...