Контрольно-пропускные пункты и вид камеры - PullRequest
0 голосов
/ 09 апреля 2020

Я использую рамку для проекта VR, который я делаю, и использую контрольную точку на земле, чтобы вести пользователя вокруг трехмерного пространства. Ранее я получал помощь о том, как создать контрольную точку здесь

Вот ссылка на самую последнюю итерацию моего проекта -> https://museum-exhibit-demo.glitch.me/webVR.html

Возможно ли, чтобы анимация, ведущая вас к цилиндру, также меняла вид и высоту камеры? Обычно, когда я нажимаю на цилиндр, чтобы вернуть меня в положение, он также привязывает мой взгляд к тексту на стене, даже если это не высота глаза

1 Ответ

0 голосов
/ 18 апреля 2020

Отличная демоверсия. Я подготовил подходящее решение для глюк ( приложение ). Это решение изменяет высоту камеры и горизонтальное направление / рыскание камеры. Это не меняет шаг камеры. В идеале любое приложение AR / VR минимизирует принудительное изменение ориентации камеры. Если вы принудительно измените угол наклона камеры, это все равно, что навсегда наклонить пол пользователя. Если вы просто измените рыскание, то это навсегда изменит горизонтальное направление их взгляда. Изменение высоты звука может быть сделано, но я думаю, что с точки зрения пользователя, это может вызвать больше проблем, чем оно того стоит, изменение рыскания - это почти нормально. Подобные рекомендации были упомянуты ранее в { ссылка }.

. Я разбью код решения по тому, как он решает ваши две проблемы, чтобы изменить анимацию, которая приводит вас к цилиндру. высота камеры и отдельно, как она может изменить вид / направление? Я добавлю в строке ссылки на решение, которые были актуальны.

  • Измените высоту, чтобы она соответствовала высоте текста
    Сначала вы должны знать высота текста, связанного с цилиндром контрольной точки. Один из способов сделать это - предоставить id связанной сущности a-text компоненту goto. Для этого я добавил новое свойство компонента textId в ваш компонент goto (L79). Затем в каждом из мест, где вы использовали компонент goto, было установлено свойство textId. Например, для цилиндра контрольной точки, связанного с текстом Welcome!, компонент goto был изменен на goto="textId: welcome" (L298).

    id соответствующего Доступ к элементу a-text можно получить из методов компонента goto, используя this.data.textId, который будет отличаться для каждого компонента goto. Используя эту информацию внутри компонента, можно найти положение объекта a-text аналогично тому, как вы нашли положение rig, найдя элемент a-text с document.querySelector L83 и затем нахождение позиции L93.

    let text = document.querySelector(`#${this.data.textId}`);
    text.object3D.getWorldPosition(textPos);
    

    Обратите внимание, что вместо использования text.getAttribute("position") вместо этого используется метод getWorldPosition. Это потому, что вы завернули свои элементы a-text в элементы a-entity, которые также имеют установленные позиции. getAttribute("position") дает вам только позицию относительно родительской сущности, но для этого решения требуется абсолютная / мировая позиция текста. Конечно, другие решения могут сделать что-то другое, и также возможно изменить структуру HTML вашей демонстрации, чтобы вы могли использовать getAttribute("position"). getWorldPosition - это метод из ТРИ. js (на котором основан A-кадр), который сохраняет положение в переменной textPos. Вы можете использовать textPos так же, как rigPos. Вместо rigPos.y теперь вы можете сделать textPos.y, чтобы получить высоту текста в качестве конечной точки анимации положения, чтобы изменить высоту камеры.

    Обратите внимание, что 1.6 убрано из высоты в решении. Высота камеры по умолчанию в A-Frame - 1.6. Вы справились с этим, уменьшив положение камеры на -1,1 в сущности #pov.

  • Измените направление камеры в соответствии с направлением текста

    Сначала нам нужно узнать направление текста относительно соответствующего цилиндра контрольной точки. Поскольку теперь у нас есть доступ к положению цилиндра, можно рассчитать вектор направления между цилиндром и текстом (L111). Из этого можно рассчитать азимутальный угол или угол рыскания направления от цилиндра контрольной точки к тексту (L115). Чтобы сделать это вычисление, была создана функция getYaw (L46) для вычисления угла поворота.

    Поскольку вы уже применили поворот на 90 градусов к вашей сущности #pov, которая окружает вашу a-camera сущность, угол рыскания рассчитывается по отрицательной оси z (0, 0, -1).

    Теперь, когда у вас есть направление текста от цилиндра контрольной точки, вам нужно знать направление рыскания, на которое в данный момент указывает камера. Это можно узнать по компоненту rotation объекта a-camera. Как и при поиске позиции любой сущности, вы можете найти элемент a-camera с document.querySelector (L84) и найти угол его рыскания camera.getAttribute("rotation").y (L116). Затем вы можете рассчитать целевой угол рыскания, для которого вы должны установить rig, рассчитав относительный угол от объекта camera к объекту text, который в решении называется targetRigYaw (L117).

    Обратите внимание, что существует множество приложений функции mod. Это просто гарантирует, что все углы рыскания всегда положительны и находятся между [0, 360], что помогает упростить вещи при применении углов.

    Теперь вы можете использовать targetRigYaw в качестве угла, чтобы установить вашу буровую установку для изменения посмотреть направление, чтобы посмотреть на текст. Однако в зависимости от углов поворота направления текста и направления камеры этот угол может быть больше 180 градусов. Вы можете представить, что можете вращаться влево или вправо, чтобы в конечном итоге смотреть в определенном направлении. Если направление, в котором вы хотели бы смотреть, не находится непосредственно позади вас, одно из направлений будет закороченным вращением, чем другое. L120-123 измените угол targetRigYaw так, чтобы вы всегда вращались в кратчайшем направлении angular, чтобы в конечном итоге посмотреть на текст.

    Чтобы анимировать рывок так же, как вы анимировали положение, в которое вы можете добавить второй компонент к сущности #pov. В решении это называется animation__rotation (L144). Документы A-Frame описывают, как вы можете добавить несколько анимаций, используя __ нотацию https://aframe.io/docs/1.0.0/components/animation.html#multiple -анимаций .

    Затем мы можем установить компонент animation__rotation для выполнения анимации: rotation сущности #pov аналогично position. Компонент animation__rotation устанавливается с помощью setAttribute для поворота от текущего угла рыскания rig к углу targetRigYaw, а продолжительность анимации устанавливается на ту же длину, что и анимация положения.

Надеюсь, это поможет решить ваши два вопроса. Пожалуйста, дай мне знать, если возникнут какие-либо вопросы. Я добавил комментарий к коду, однако я добавил несколько фрагментов, которые могут быть не совсем очевидны.

...