Живое отображение данных о криптовалюте в виртуальной среде в Интернете
Своеобразный «биржевой VR-центр для криптовалют».
Вы видели в предыдущих статьях, что я решительно выступаю за веб-программирование на стороне клиента. От короткого JavaScript-кода для выравнивания наборов 3D-точек в пространстве до JavaScript-библиотек для расчетов в веб-браузерах, которые я потом использовал для запуска, например, PCA online; и от приложений дополненной реальности для обучения химии, которые работают как веб-страницы до инструментов машинного обучения, которые отслеживают ваши руки в веб-браузерах и кода JavaScript для получения данных о криптовалюте в режиме реального времени.
Цель этой новой статьи — показать, как легко можно комбинировать различные технологии в сложные футуристические программы, которые запускаются прямо в веб-браузерах компьютеров, смартфонов, планшетов и даже устройств виртуальной реальности. Без установки какой-либо программы или приложения, просто получая доступ к веб-странице с помощью имеющегося у вас устройства, распространяемого только через Интернет, и с помощью одного фрагмента кода, который правильно отображается на всех устройствах.
В частности, здесь я покажу вам основы веб-приложения, которое отображает исторические данные и данные о криптовалюте в реальном времени в графическом интерфейсе, который работает на всех этих устройствах, включая высококачественные VR-гарнитуры, где опыт становится полностью захватывающим… биржевой центр только тем, что он специфичен для криптовалюты и полностью виртуален!
Посмотрите, как это веб-приложение работает слева направо на моем ноутбуке, смартфоне (до входа в режим виртуальной реальности и в режиме виртуальной реальности для картонных очков ниже) и на устройстве виртуальной реальности Oculus:
Хотите просто поиграть с ним? Откройте эту ссылку в браузере вашего устройства, каким бы оно ни было:
https://lucianoabriata.altervista.org/tests/cryptogames/cryptoVR/index.html?apikey=ВАШAPIKEYЗДЕСЬ
Короткая ссылка для быстрого ввода в VR-устройствах (если предварительно загружен API-ключ): https://bit.ly/3ckORFr
Ключевые компоненты
Хотя вы можете увидеть точный код по ссылке выше, позвольте мне дать вам обзор того, как все это работает. Два ключевых компонента этого веб-приложения: API-интерфейс cryptocompare для получения данных о криптовалюте и WebXR для обработки представлений webVR, совместимых на разных устройствах.
API криптосравнивания
Я уже представил этот API и как его вызывать в этой статье:
Здесь мы дважды вызываем API. Первый раз, чтобы получить исторические данные за последние 6 часов (getBtcDataHistoryMinute):
//look inside var response = await fetch(‘https://min-api.cryptocompare.com/data/v2/histohour?fsym=BTC&tsym=USD&limit=360&toTs=-1&api_key=' + apikey );
А затем раз в минуту для получения обновленной цены (getBtcData):
fetch(‘https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD')
Некоторые подробности:
1- Обратите внимание, что вызовы API являются асинхронными. Они начинаются с:
var getBtcData = async () => { ... var getBtcDataHistoryMinute = async () => {
2- Из-за этого, а также поскольку нам нужно быть уверенным, что исторические данные отображаются первыми, нам нужно использовать вспомогательную переменную, которая указывает, были ли уже извлечены и показаны исторические данные или нет. Переменная historydone инициируется как false и становится истинной только в конце процедуры getBtcDataHistoryMinute:
var historydone=false ... var getBtcData = async () => { if (historydone==true) { fetch(‘https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD') ... } var getBtcDataHistoryMinute = async () => { var response = await fetch('https://min-api.cryptocompare.com/data/v2/histohour?fsym=BTC&tsym=USD&limit=360&toTs=-1&api_key=' + apikey ); ... historydone = true ... }
3- Как вы видели в ссылках для проверки веб-приложений и в приведенных выше фрагментах кода, API-интерфейс cryptocompare вводится в качестве аргумента: https://cryptovr.glitch.me/?apikey=replacethiswitapikey
Веб-приложение захватывает ключ со строками, которые говорят:
const urlParams = new URLSearchParams(window.location.search); var apikey = urlParams.get(‘apikey’)
4. То, что цена BTC обновляется каждую минуту, контролируется timeOffset = 60 и elapsedTime часов Three.js.
WebXR для отображения виртуальной реальности на разных устройствах
WebXR позволяет использовать дополненную, виртуальную и смешанную реальности на разных устройствах; а наличие сети означает, что ее можно очень легко интегрировать с множеством других функций, которые может предложить сеть.
Элементы виртуальной реальности для отображения данных
Основной «экран» на самом деле представляет собой черную плоскость, а данные отображаются с использованием геометрии прямоугольника (BoxGeometry). Размеры x и z этих полей фиксированы, тогда как размер y зависит от числа, которое мы хотим отобразить, и фактически вычисляется как абсолютное значение разницы между предыдущей и текущей ценой: Math.abs(y- предыд.). Затем нам нужно разместить его в пространстве, которое мы основываем на yprev, если цена выросла, или на y, если цена выросла. Вот основная часть кода:
const geometry = new THREE.BoxGeometry( 0.005, Math.abs(y-yprev), 0.005 ); const cube = new THREE.Mesh( geometry, tmpMaterial ); plot1.add( cube ); if (yprev < y) { cube.position.set(x,yprev,0.005) }else{ cube.position.set(x,y,0.005) }
В этом фрагменте кода x увеличивается таким образом, что измеряет время, прошедшее с момента первой точки. Для исторической части диаграммы, которая отображается при загрузке, это одна точка данных в минуту за последние 6 часов (360 точек).
Цвет бара зависит от того, пошла ли цена вверх или вниз с момента последнего шага:
if (prices[i] < prices[i-1]) { //price went down, so red var tmpMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000 } ); }else{ //price went up, so green var tmpMaterial = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); }
Текст в WebXR
Это было очень сложно, особенно потому, что мне нужно, чтобы текст менялся каждый раз, когда обновляется цена BTC. Я обнаружил (неэффективный, но достаточно практичный) способ сделать это — создать группу, в которую я добавляю и удаляю объекты textMesh. Например, в начале скрипта я использую это для инициализации текста (на самом деле он не отображается, потому что быстро заменяется первой ценой BTC):
var group = new THREE.Group(); scene.add(group); var textMesh; //For fonts, I got Roboto from Google Fonts and then //converted it into three.js-compatible json with https://gero3.github.io/facetype.js/ //Then just load it and use it like this: var loader = new THREE.FontLoader(); loader.load(“./Roboto_Bold.json”, function(font) { var textGeo = new THREE.TextGeometry(“BTC data here”, { font: font, size: 0.2, height: 0.01, curveSegments: 12, bevelEnabled: true, bevelThickness: 0.02, bevelSize: 0.01, bevelOffset: 0, bevelSegments: 2 }); var textMat = new THREE.MeshLambertMaterial({color: 0xFFFFFF}); textMesh = new THREE.Mesh(textGeo, textMat); textMesh.position.z = -1.4; textMesh.position.y = 0.5; textMesh.position.x = -1.9; textMesh.rotation.x = -Math.PI/8; group.add(textMesh); });
Как поясняется в комментарии, я получил шрифт в формате JSON с помощью этого инструмента: https://gero3.github.io/facetype.js/ на файлах, полученных из шрифтов Google. По какой-то странной причине конвертация не была идеальной, и, как вы видите, некоторые функции шрифтов отображаются недостаточно хорошо…
Приведенный выше код создает первый фрагмент текста и помещает его в группу. Но позже, каждый раз, когда нам нужно обновить цену BTC, мы сначала должны удалить textMesh из group, создать новую textMesh и, наконец, добавить обратно в группу:
loader.load(“./Roboto_Bold.json”, function(font) { var textGeo = new THREE.TextGeometry(‘1 BTC = ‘ + lastprice.toString() + ‘ USD’, { font: font, size: 0.2, height: 0.01, curveSegments: 12, bevelEnabled: true, bevelThickness: 0.02, bevelSize: 0.01, bevelOffset: 0, bevelSegments: 2 }); group.remove(textMesh); var textMat = new THREE.MeshLambertMaterial({color: 0xFFFFFF}); textMesh = new THREE.Mesh(textGeo, textMat); textMesh.position.z = -1.4; textMesh.position.y = 0.5; textMesh.position.x = -1.9; textMesh.rotation.x = -Math.PI/8; group.add(textMesh); });
Конечно, весь этот код можно оптимизировать, но это основы. Кроме того, есть и другие более подходящие способы размещения текста, который будет меняться в процессе выполнения программы.
Надеюсь, вам понравится играть с виртуальной реальностью и криптовалютой. и не стесняйтесь обращаться ко мне, если вам нужна помощь или вы хотите попросить о небольших работах, адаптированных к вашим потребностям!
Я увлекаюсь природой, наукой, технологиями, программированием и самоделками. Биотехнолог и химик, в мокрой лаборатории и с компьютерами. Пишу обо всем, что входит в широкую сферу моих интересов. Проверьте мои списки для большего количества историй. Стать участником Medium, чтобы получить доступ ко всем его историям, и подписаться на получение моих новых историй по электронной почте (оригинальные партнерские ссылки платформы, за которые я получаю небольшой доход без особые расходы для вас). Пожертвуйте здесь различными способами. Свяжитесь со мной здесь.
Для консультаций по поводу небольших вакансий (по программированию, оценке биотехнологических и биоинформационных проектов, научной работе + общению, анализу и проектированию молекулярных данных, молекулярной графике, фотографии, учебным пособиям по moleculARweb, преподаванию и репетиторству по естественным наукам и т. д. .) проверьте мою страницу услуг здесь.