Мы просто позволим этому одному скользить ...

Purple Nugget # 2: Керлинг Ёжик

Вдохновленный спортивными смайликами XKCD. Теперь вы можете завивать своих ежиков в 3D! (При создании этой демонстрации не использовались настоящие ежи)

Готовая демонстрация и код

Вы можете посмотреть демо здесь и получить код здесь. Эта демонстрация будет работать только на устройстве, имеющем как соединение Bluetooth, так и браузер, поддерживающий веб-соединение Bluetooth. Вы можете включить Web Bluetooth в интернет-браузере Samsung с помощью флажка.

Самородок цель

Этот фиолетовый самородок сочетает в себе WebVR и Web Bluetooth и показывает, как мы можем взаимодействовать с объектами в нашей виртуальной среде из внешнего мира.

Ингредиенты

  • Текстовый редактор (VS Code, Sublime Text, глюк,…)
  • Способ обслуживания вашего самородка по HTTPS (я использую глюк)
  • Устройство с подключением Bluetooth (например, мобильный телефон, планшет)
  • Контроллер Daydream (или контроллер с поддержкой Bluetooth по вашему выбору).
  • Браузер с включенным веб-Bluetooth (в Samsung Internet 6+ он находится под флагом или Chrome)

Метод

Web Bluetooth позволяет нам подключаться, отправлять и получать данные с периферийных устройств с поддержкой Bluetooth прямо из нашего браузера. Это означает, что нашим пользователям не нужно загружать отдельное приложение, чтобы подключиться к устройству. WebVR позволяет отображать трехмерную среду в браузере, создавая увлекательный и захватывающий опыт.

Их сочетание дает нам возможность взаимодействовать с трехмерным объектом, перемещая объект в реальном мире.

Мы можем разделить работу на четыре части. Создание сцены, стилизация сцены, написание правил физики и управление сценой.

WebVR - Создание сцены

Мы можем использовать A-Frame, фреймворк JavaScript для создания опыта виртуальной реальности в Интернете, чтобы помочь нам настроить сцену. В документации A-Frame есть код для начала, или вы можете переделать стартер A-Frame на Glitch.

Наш каток состоит из длинной плоской коробки с четырьмя длинными узкими коробками с каждой стороны. Вы можете удалить формы, указанные в стартовом элементе A-frame, и заменить их ими.

<a-box color="aaa" width="20" depth="60" height="1" position="0 -0.6 -21"></a-box>
<a-box color="#aaa" width="0.25" height="0.2" depth="50" position="-3 0 -21"></a-box>
<a-box color="#aaa" width="0.25" height="0.2" depth="50" position="3 0 -21"></a-box>
<a-box color="#aaa" width="6" height="0.2" depth="0.25" position="0 0 4.13"></a-box>
<a-box color="#aaa" width="6" height="0.2" depth="0.25" position="0 0 -46"></a-box>

Вы можете использовать инструменты проверки A-Frame, которые помогут вам изменить положение и размер полей, нажав Ctrl + Alt + i.

Дальше нам нужен наш ёжик! Я использовал эту модель от Sketchfab.

Загрузите выбранную вами модель ежа и разместите ее там же, где вы будете размещать свою сцену. Мы можем добавить 3D-модель объекта в нашу сцену A-Frame с помощью элемента ‹a-entity› и добавления актива.

<a-assets>
  <a-asset-item id="hedgy-obj" src="https://example.com/hedgy.obj">
  </a-asset>
<a-assets>
<a-entity id="hedgehog" obj-model="obj: #hedgy-obj;"></a-entity>

WebVR - стилизация сцены

На данный момент это выглядит немного скучновато. Добавляем к ней цвет и текстуры банок с помощью материалов. Это файлы изображений, которые добавляются как активы, а затем могут быть переданы в наши блоки или объекты с атрибутом material. Вы можете создавать свои собственные текстуры для своей сцены или использовать те, которые представлены в примере вверху. Я сделал это изображение и установил его в качестве материала для пола катка.

Добавьте изображение в качестве ресурса в раздел ресурсов, а затем передайте его в коробку на полу катка.

<a-assets>
  <a-asset-item id="hedgy-obj" src="https://example.com/hedgy.obj">
  </a-asset>
  <img id="rink-skin" src="https://example.com/rink.png"/>
<a-assets>
...
<a-box id="rink" material="src: #rink-skin;" width="20" depth="60" height="1" position="0 -0.6 -21" static-body></a-box>

Вы можете создать синий градиент для элемента a-sky и проделать то же самое.

Настройте физику

На катках низкое трение, мы хотим, чтобы наш ежик скользил, мы также хотим, чтобы он в конце концов замедлялся и отскакивал, если ударялся о стену катка (хорошо, так что это не то, как настоящий керлинг, позвольте мне взять маленькая поэтическая лицензия).

Во-первых, мы собираемся включить библиотеку компонентов набора событий A-Frame.

<script src="https://unpkg.com/[email protected]/dist/aframe-event-set-component.min.js"></script>

Это позволяет вам прослушивать события, а затем редактировать свойства ваших компонентов A-Frame.

Мы хотим придать нашему ежу новые свойства, в первую очередь скорость (скорость в одном направлении). Мы можем зарегистрировать новый компонент, называемый скоростью

AFRAME.registerComponent('velocity', {
  schema: {type: 'vec3'},
init: function() {
    console.log('Velocity');
  },
  
  decelerate: function() {
    this.data.x *= deceleration;
    this.data.y *= deceleration;
    this.data.z *= deceleration;
  },
  
  tick: function() { 
    var x = this.data.x;
    var y = this.data.y;
    var z = this.data.z;
    
    this.el.object3D.position.add({x, y, z});
    this.decelerate();
  }
});

Мы устанавливаем переменную замедления, которая будет зависеть от того, насколько скользкой мы хотим, чтобы наш каток был. Я установил свой на 0,99, что давало реалистично выглядящий слайд. На каждом тике мы обновляем значения положения элемента, к которому мы применяем эту скорость, что означает, что он будет перемещаться внутри сцены.

Далее нам нужно настроить обнаружение столкновений для стен катка: если ежик ударяется о стену, мы хотим, чтобы он отскочил обратно на каток. Сначала нам нужно определить, какие компоненты А-образной рамы являются стенами. Это делается путем присвоения каждому из них класса стены в HTML. Затем этот класс используется как селектор в JS коллизии. Я использовал библиотеку reset-on-collision Ричарда Кеннарда, но вместо того, чтобы сбрасывать положение элемента, мы собираемся изменить его скорость при столкновении.

Интернет через Bluetooth - управление сценой

Для этой демонстрации я использовал контроллер Daydream, потому что эта библиотека от MrDoob делает подключение контроллера к вашему браузеру очень доступным.

Включите библиотеку в свой HTML

<script src="daydreamcontroller.js"></script>

Мы можем проверить, поддерживает ли браузер пользователя Web Bluetooth, выполнив проверку if ('bluetooth' in navigator). В этом случае я добавил в свой HTML-код абсолютно позиционированный оверлей с кнопкой «Подключить», для которого установлено значение display: none, если браузер не поддерживает Bluetooth. Если браузер поддерживает Bluetooth, мы можем начать с ним работать! При нажатии кнопки «Подключиться» мы создадим новый экземпляр DaydreamController и подключимся к контроллеру. Библиотека DaydreamController.js использует navigator.bluetooth.requestDevice(), в котором появится всплывающее диалоговое окно с вопросом, к которому пользователь хочет подключиться, и позволит ему выбрать контроллер Daydream.

Библиотека также дает нам доступ к углу, под которым удерживается контроллер, а также к его текущему ускорению в направлениях X, Y и Z. Мы можем использовать эти значения, чтобы изменить направление и скорость, с которой мы выпускаем нашего ежа.

Мы также можем узнать, когда нажимаются кнопки на контроллере, поэтому мы можем установить атрибут скорости на ежике и отправить его в путь.

Чтобы следовать за нашим ежом по трассе, нам нужно применить скорость и к камере. Это можно сделать с помощью элемента A-Frame <a-animation>, который можно добавить внутри компонентов A-Frame, чтобы заставить их двигаться. Вам понадобится по одному для каждого атрибута, который вы хотите изменить. Вы присваиваете ему атрибуты to, duration и ease вместе с необязательным delay для создания желаемого движения. Вы можете вызвать анимацию с помощью element.emit('startAnimation'). Затем анимацию камеры можно запустить одновременно с заданием скорости ежу нажатием кнопки.

Вы можете увидеть полный пример настройки WebBluetooth в этом примере.

Дополнительно

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

Надеюсь, вам понравится делать свой собственный керлинг ежика или другую игру с помощью веб-Bluetooth и WebVR! Доступно множество библиотек с открытым исходным кодом для подключения к вашему браузеру множества различных устройств: дрон, управляемые лампочки, принтер, комплекты разработки и некоторые менее безопасные для рабочих устройств. Также существует множество сайтов с бесплатными 3D-моделями, доступными для скачивания. Это должно дать вам много очков, чтобы начать смешивать физический и цифровой миры!

Если вам понравился этот самородок, почему бы не попробовать Purple Nugget # 1 - Controlling SVG with the Gamepad API.