По сути, в моей сцене у меня есть существо с лазерным управлением и raycaster в следующей структуре:
<a-scene>
<a-entity laser-controls raycaster ...>
<!--<a-entity id="inventory" ...> Could be inserted here-->
</a-entity>
<!--<a-entity id="inventory" ...> Could be inserted here-->
</a-scene>
Моя цель - вызвать инвентарь в текущем положении лазерной линии x, y, у меня уже есть доступ к точке, соответствующей концу лазерной линии. Я не хочу, чтобы инвентарь снова перемещался с этой позиции. Если я сделаю инвентарь дочерним для заклинателя, он всегда будет двигаться по линии. Если я установлю, что инвентарь является дочерним по отношению к сцене, а его положение соответствует мировым координатам точки, в которой он должен находиться, он просто не работает.
Подходы, которые я пробовал и потерпел неудачу:
- Начало инвентаризации в роли ребенка от Raycaster и смена родителя на сцене и применение мировой матрицы Raycaster
- Хранение инвентаря как ребенка-рейкастера, захват его начальной матрицы мира и установка той же самой матрицы мира на каждом тике
И, наконец, мой текущий подход (с кодом), который все еще не работает
1. Преобразование локальных координат конца линии в мировые координаты
2. Добавление инвентаря к сцене
3. Преобразование мировых координат от конца строки в локальные координаты сцены
4.Применение позиции в 3 к инвентарю
let v = this.emptyVec
v.copy(this.raycaster.components.line.data.end)
this.raycaster.object3D.localToWorld(v);
this.el.appendChild(inventoryNode) //this.el is the scene
this.el.object3D.worldToLocal(v);
const {x,y} = v
inventoryNode.object3D.position.set(x,y,inventoryZDistance)
TLDR: Как установить объект в положение конца линии raycaster в тот момент, когда я добавляю его в сцену и оставляю его в этом положении навсегда