Что я буду иметь?
Я легко переключаю события мыши с курсора мыши, когда не в режиме VR, на курсоры взгляда в режиме VR. См. Также псевдокод ниже:
Example 1
scene.addEventListener('enter-vr', function() {
// use gaze cursors to toggle mouse events
});
scene.addEventListener('exit-vr', function() {
// use mouse cursor to toggle mouse events
});
Почему?
Благодаря исследованиям, которые я видел, люди, впервые использующие виртуальную реальность, предпочитают курсоры мыши. При входе в режим VR этот курсор недоступен, и, согласно дальнейшим исследованиям, лучшим вариантом является курсор. С контроллерами от HTC, Oculus, GearVR и Daydream пользователи не умеют ими пользоваться.
Вывод:
- Внутри режима VR: курсоры взгляда - лучший вариант.
- Вне режима VR: курсоры мыши - лучший вариант.
Что я сделал
Исследовательская работа
Я нашел в документации по смене камеры:
Когда активное свойство переключается, компонент уведомляет систему камеры об изменении текущей камеры, используемой средством визуализации:
var secondCameraEl = document.querySelector('#second-camera'); secondCameraEl.setAttribute('camera', 'active', true);
Мой код
Вот мой код, который я сделал
Example 2
var scene = document.getElementById('scene');
scene.addEventListener('enter-vr', function() {
var secondCameraEl = document.querySelector('#vr-camera');
secondCameraEl.setAttribute('camera', 'active', true);
});
scene.addEventListener('exit-vr', function() {
var fistCameraEl = document.querySelector('#pc-camera');
fistCameraEl.setAttribute('camera', 'active', true);
});
var box = document.getElementById('box');
box.addEventListener('click', function() {
alert('click');
});
<script src="https://aframe.io/releases/0.5.0/aframe.min.js"></script>
<a-scene id="scene">
<a-box id="box" class="clickable" position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box>
<a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere>
<a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
<a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
<a-sky color="#ECECEC"></a-sky>
<a-entity id="camera">
<a-camera id="vr-camera">
<a-entity position="0 0 -1" geometry="primitive: ring; radiusOuter: 0.07;radiusInner: 0.05;" material="color: red; shader: flat" cursor="maxDistance: 1; fuse: true" raycaster="objects: .clickable">
<a-animation begin="click" easing="ease-in" attribute="scale" fill="backwards" from="0.1 0.1 0.1" to="1 1 1" dur="150"></a-animation>
<a-animation begin="fusing" easing="ease-in" attribute="scale" fill="forwards" from="1 1 1" to="0.1 0.1 0.1" dur="1500"></a-animation>
</a-entity>
</a-camera>
<a-camera id="pc-camera" active="true"></a-camera>
</a-entity>
</a-scene>
Щелкните картонный значок, чтобы войти в VR, или Escape, чтобы выйти из VR.
Проблемы и рабочие вещи
Итак, вы можете видеть, что в моем коде есть несколько ошибок:
- Первая активная камера -
#vr-camera
. Это должно быть#pc-camera
- Когда вы выходите из VR,
#pc-camera
не запускает события мыши от указателя мыши. - Курсор
#vr-camera
остается видимым при выходе из режима VR. - См. Пункт 7.
Это работает:
- Измените камеру обратно на
#pc-camera
при выходе из VR. - Курсор взгляда
#vr-camera
.
Вопрос
Можно ли переключать курсоры (взгляд мыши) в зависимости от того, находитесь вы в режиме VR или нет?
Обновлять
Возьмите ответ @Piotr, используя только одну камеру, и измените свойство fuse
на true
при входе в VR и измените на false
при выходе из VR. Из его anwser я сделал код ниже.
Example 3
var scene = document.getElementById('scene');
var camera = document.querySelector('#camera')[0];
scene.addEventListener('enter-vr', function() {
camera.setAttribute('cursor', 'maxDistance: 1; fuse: true');
});
scene.addEventListener('exit-vr', function() {
camera.setAttribute('cursor', 'maxDistance: 1; fuse: false');
});
var box = document.getElementById('box');
box.addEventListener('click', function() {
alert('click');
});
<script src="https://aframe.io/releases/0.5.0/aframe.min.js"></script>
<a-scene id="scene">
<a-box id="box" class="clickable" position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box>
<a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere>
<a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
<a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
<a-sky color="#ECECEC"></a-sky>
<a-camera id="camera">
<a-entity position="0 0 -1" geometry="primitive: ring; radiusOuter: 0.07;radiusInner: 0.05;" material="color: red; shader: flat" cursor="maxDistance: 1; fuse: false" raycaster="objects: .clickable">
<a-animation begin="click" easing="ease-in" attribute="scale" fill="backwards" from="0.1 0.1 0.1" to="1 1 1" dur="150"></a-animation>
<a-animation begin="fusing" easing="ease-in" attribute="scale" fill="forwards" from="1 1 1" to="0.1 0.1 0.1" dur="1500"></a-animation>
</a-entity>
</a-camera>
</a-scene>
Ошибка здесь:
- Когда курсор стоит на желтом цилиндре, событие щелчка синего куба не срабатывает. Вы должны установить курсор на синий куб, чтобы вызвать событие щелчка (также происходит во втором примере).
- Продолжая с 7, когда вы заменяете курсор и помещаете его обратно, событие щелчка запускается напрямую.
- В режиме VR нет
fuseTimeout
, по умолчанию он должен быть 1500 миллисекунд.