До списку уроків
8A · Урок 15 з 16

Ігри, 3D і занурення: VR / AR / MR

виконано0%
Крок 1

Що робимо сьогодні

Тема 8 · урок 1 з 2 · 120 хвилин

Сьогодні на парті лежать окуляри, і кожен приміряє їх по черзі.

Усередині — намальована кімната. Повертаєш голову — вона повертається разом із тобою.

Ми розберемо цю кімнату на частини. Виявиться, що вона складена з точок, трикутників і картинки, натягнутої зверху.

А наприкінці ти сам збереш сцену з трьох фігур і покладеш її у теку ~/www/lesson-08/.

Наступного уроку ця сцена стане прототипом твоєї гри.

Чого навчишся за цей урок

Слова «полігон», «меш», «паралакс» і «6DoF» поки нічого не означають. Розберемо їх по черзі.

Хід уроку

ЕтапХвЩо робимо
Демонстрація окулярів15По черзі приміряємо, решта заповнює таблицю VR/AR/MR
Шкала занурення15Де закінчується AR і починається MR
Анатомія 3D-об'єкта20Вершини, полігони, меш, матеріал, UV
Перерва10
Переглядач і полігони15Крутимо фігуру, дивимося на лічильники
Кадри й кіберхвороба1590 fps, 20 мс, чому стає зле
Стерео і DoF10Два зображення, міжзіниця, 3DoF проти 6DoF
Перша сцена A-Frame15Локально, потім по FTP
Підсумок і ДЗ5Задум гри, перевірка себе
Разом120
Тека зветься lesson-08, а урок — п'ятнадцятий Це не помилка. Теки на сервері названі за темою, а не за номером уроку. Тема 8 — це уроки 15 і 16. Обидва складають роботу в ~/www/lesson-08/. Теки lesson-15 немає.
Крок 2

Шкала занурення: реальність, AR, MR, VR

Три букви, які плутають навіть у рекламі

Уяви лінійку. На одному її кінці — кімната, у якій нічого не намальовано. На другому — світ, у якому намальовано геть усе. Між ними — усе решта.

Саме так у 1994 році описали це Пол Мілґрем і Фуміо Кішіно. Не три окремі коробки, а суцільна шкала.

Шкала «реальність — віртуальність» за Мілґремом і Кішіно (1994) змішана реальність (MR) — усе, що між краями реальність AR · доповнена реальність AV · доповнена віртуальність VR вікно, парта, твоя рука Pokémon GO, Google Lens, стрілка навігатора на лобовому склі віртуальна студія, куди камера завела твої справжні руки і твій стіл Beat Saber, Half-Life: Alyx, тренажер пілота 0% намальованого 100% намальованого
MR у первісному сенсі — це не точка на шкалі, а весь проміжок між краями. У рекламі це слово вживають вужче. Там MR — це окуляри з наскрізним відео, у яких віртуальні предмети знають форму твоєї кімнати.

Як розрізнити на практиці

Що бачишЧи знає система, де стілПриклад поза іграми
ARреальний світ плюс намальоване зверхуздебільшого ні: картинка «плаває» і заходить у стінипереклад вивіски камерою, розмітка деталей у сервісі, приміряння кросівок
MRреальний світ, у якому віртуальне поводиться як справжнєтак: будує карту кімнати, віртуальне ховається за реальним диваномхірург бачить знімок КТ поверх пацієнта, монтажник — схему поверх верстата
VRтільки намальоване, реального не видно взагалізнає межі, щоб ти не врізався в шафутренажер пілота й машиніста, репетиція операції, віртуальна екскурсія музеєм

Ось проста перевірка. Закоти віртуальний м'яч під справжнє крісло. У MR він за кріслом зникне, як зник би справжній. Це вміння зветься оклюзія.

А якщо м'яч завжди зверху й проходить крізь меблі — це AR. Хоч би що писали на коробці.

Питання

Додаток міряє, як диван стане у твоїй кімнаті. Дивишся в телефон — диван ніби на підлозі. Але коли обходиш його, він трохи «пливе» і краєм заходить у стіну. Що це насправді?

Крок 3

З чого зроблений 3D-об'єкт

Шість шарів, які легко переплутати між собою

Усередині гри немає «м'ячика». Є список точок із координатами. Є список, як ці точки з'єднати. І є опис, як поверхня поводиться зі світлом.

Найближча побутова річ — картонна коробка. Кутики, склейки, стінки і наліпка зверху. Розбираємо по шарах саме так.

Від точок до поверхні вершини 5 точок ребра 8 відрізків полігон одна грань меш 6 трикутників матеріал як блищить текстура картинка по UV
Піраміда: 5 вершин, 8 ребер, 5 граней. Перевір формулу Ейлера для опуклого тіла: 5 − 8 + 5 = 2. Відеокарта все одно ріже кожну грань на трикутники. Квадратна основа стає двома — разом 6 трикутників.
ШарЩо цеДе ти це вже бачив
Вершина
vertex
точка з трьома числами: x, y, zкутик коробки
Ребро
edge
відрізок між двома вершинамисклейка коробки
Полігон
face
плоска ділянка, обмежена ребрами; майже завжди трикутник, бо через три точки завжди проходить рівно одна площинастінка коробки
Меш
mesh
усі вершини й полігони разом — це і є «форма» об'єктасама коробка без наліпок
Матеріалправило, як поверхня взаємодіє зі світлом: колір, шорсткість, металевість, прозорістьрізниця між матовим і глянцевим папером
Текстуразвичайна картинка (PNG, JPG, WebP — усе з теми 4), натягнута на мешналіпка на коробці

Меш задає форму. Матеріал і текстура — вигляд.

Звідси практичний висновок. Додаси полігонів — напис на коробці різкішим не стане. Різкість напису живе в розмірі картинки-текстури, а не в кількості трикутників.

Як пласку картинку натягують на об'ємну форму

Розберемо на коробці. Розріж її по ребрах і поклади на стіл — вийде пласка викрійка з шести прямокутників.

З мешем роблять так само. Поверхню ріжуть по ребрах і розкладають на площині. Отримана викрійка зветься UV-розгортка.

Кожна вершина отримує ще два числа: u і v. Це її місце на картинці, від 0 до 1. Літери взяли такі просто тому, що x, y і z уже зайняті.

Куб розрізають по ребрах і розкладають на площині 2 1 4 меш у просторі розрізаємо по ребрах 213 456 0 U 1 0 V 1 кожна вершина отримує пару чисел u, v — адресу на картинці
Одна й та сама розгортка працює з будь-якою текстурою. Заміни картинку — і куб стане цеглиною, ящиком або кубиком Рубіка. Жодна вершина при цьому не змінюється.
Питання

Товариш каже: «Я підняв кількість полігонів на ящику — і напис на ньому став різкіший». Що сталося насправді?

Крок 4

Сцена: камера і світло

Об'єкти самі по собі невидимі

Сцена — це список того, що є у світі, і де воно стоїть.

Двох речей у цьому списку не видно ніколи. Це камера і світло. Прибери будь-яку з них — і на екрані не буде взагалі нічого.

Що є у сцені, крім самих об'єктів поле зору камери камера 0 1.6 0 об'єкти сцени поза полем зору — не малюється взагалі спрямоване світло X Y Z
Усе, що не потрапило в поле зору, відкидається ще до малювання. Цей крок звуть frustum culling. Тому об'єкти позаду камери коштують майже нічого. А от кожен об'єкт у кадрі коштує завжди.
ЩоЗа що відповідаєЩо буває, коли не так
Камеразвідки і куди дивимося, наскільки широкий кутоб'єкт усередині камери або позаду неї — екран порожній
Розсіяне світло
ambient
рівне підсвічування звідусільбез нього затінений бік об'єкта чорний, як діра
Спрямоване світло
directional
сонце: паралельні промені з одного напрямку, дає тіні й об'ємбез нього все пласке, як наліпка
Небо / фонщо видно там, де немає об'єктівпорожнеча кольору за замовчуванням
КоординатиX — вправо, Y — вгору, Z — на тебе; отже «вглиб екрана» це мінус Zпоставив куб на 0 0 3 — він за спиною
Камера за замовчуванням стоїть на висоті очей У A-Frame це точка 0 1.6 0. Тобто приблизно 1,6 метра над підлогою — зріст дорослої людини. Об'єкт у 0 0 0 опиниться просто під ногами. Об'єкт у 0 1.6 0 — усередині твоєї голови. Став приблизно так: 0 1.5 -3. Це три метри вглиб.
Питання

Ти додав у сцену куб, відкрив сторінку — і бачиш порожнє небо. Помилок у консолі немає, колір заданий. Що перевіряєш першим?

Крок 5

Живий 3D-переглядач

Тут немає жодної бібліотеки — тільки вершини, трохи тригонометрії й SVG

Фігура нижче зібрана прямо на цій сторінці. Браузер бере список тривимірних точок. Повертає їх. Ділить на відстань до камери.

Виходять пласкі координати — куди саме малювати на екрані. Цей крок зветься проєкція. У справжній грі його робить відеокарта, мільйони разів за секунду.

сфера · 3 сегменти світло згори-зліва
Малює це не відеокарта, а звичайний JavaScript у браузері. Тому «важко» тут стає в сотні разів раніше, ніж у справжній грі. А правило те саме: більше трикутників — більше роботи на кожен кадр.
деталізація: 3 сегменти по колу фігура: сфера
поворот: 30° нахил: 18°
вершин5
ребер9
трикутників6
видно граней3решта відвернута від камери
у сцені з 50 таких300трикутників на кадр
бюджет Quest 30,0%від 1,3 млн трикутників
кадр у цьому SVG— мсрахує браузер, не відеокарта

Що видно на лічильниках

Скільки трикутників можна собі дозволити Meta наводить бюджети на один кадр. Quest 1 — 350–500 тисяч трикутників. Quest 2 і Quest Pro — від 750 тисяч до мільйона. Quest 3 — 1,3–1,8 мільйона. Для VR на комп'ютері — 1–2 мільйони. Цей бюджет ділиться на всю сцену: і на дерева, і на персонажів, і на інтерфейс.
Питання

Ти витягнув повзунок деталізації на максимум, увімкнув обертання — і фігура почала смикатися. Що саме подорожчало?

Крок 6

Кадри, затримка й кіберхвороба

Чому 30 кадрів на телевізорі — нормально, а в окулярах — погано

Ти повернув голову в окулярах. За цей час система має встигнути чотири речі. Зчитати датчики. Порахувати нове положення. Намалювати два кадри — по одному на око. Вивести їх на екран.

Увесь цей ланцюжок звуть motion-to-photon, «від руху до фотона».

Прийнято тримати його менше 20 мс. Довше — і мозок починає помічати, що світ відстає від голови.

Скільки часу є на один кадр 120 fps 8,3 мс 90 fps 11,1 мс 72 fps 13,9 мс 60 fps 16,7 мс 30 fps 33,3 мс 05 1015 2025 3035 40 мілісекунди на один кадр поріг ≈ 20 мс: далі затримку помічає мозок
Час кадру — найбільший доданок затримки, але не єдиний. До нього додається опитування датчиків і вивід на екран. Тому 11 мс на кадр ще не означають 11 мс від руху до фотона. А 33 мс на кадр виводять за поріг гарантовано.
ЧастотаЧас кадруДе трапляється
120 Гц8,3 мсрежим із запасом на Quest 3 і PSVR2
90 Гц11,1 мсзвична цільова частота у VR
72 Гц13,9 мсмінімум, який Meta вимагає від інтерактивних застосунків
60 Гц16,7 мскіно, відео, звичайні ігри на моніторі
30 Гц33,3 мснормально на телевізорі, зле в окулярах

Звідки береться кіберхвороба

Згадай, як стає зле в машині від читання. Очі втупилися в книжку й кажуть «нерухомо». А вухо відчуває, що машину трясе й хилить.

За це відчуття відповідає вестибулярний апарат у внутрішньому вусі. Він ловить прискорення й нахили.

В окулярах виходить те саме, тільки навпаки. Очі бачать, що ти мчиш уперед. Вухо повідомляє, що ти сидиш на стільці.

Мозок отримує два несумісні звіти. І реагує на них, як на отруєння: нудота, піт, головний біль. Це і зветься кіберхвороба.

У VR конфлікт підсилює ще й затримка. Світ повертається на кілька десятків мілісекунд пізніше за голову.

Що зменшує кіберхворобуЧому працює
Телепорт замість плавного ходіннянемає штучного прискорення — немає конфлікту з вестибулярним апаратом
Поворот ривками по 30°плавний поворот камери мишею — найсильніший подразник у VR
Віньєтка: краї темніють у русіприбирає рух із бічного зору, який найчутливіший до нього
Нерухома точка опори в кадрікабіна, ніс корабля, руль дають очам «нерухомий» орієнтир
Стабільні 72–90 fps без просіданькожне просідання — це стрибок затримки, а стрибки помітніші за саму затримку

Чому VR узагалі такий важкий

Порахуймо чесно. Quest 3 малює 2064 × 2208 пікселів на кожне око. Це 4 557 312 пікселів на око, або 9 114 624 на кадр. При 90 кадрах за секунду виходить близько 820 мільйонів пікселів щосекунди.

Тепер звичайний монітор. 1920 × 1080 при 60 кадрах — це 2 073 600 × 60 ≈ 124 мільйони пікселів за секунду.

Різниця приблизно у 6,6 раза. І все це має влізти в окуляри, які працюють від акумулятора й гріються у тебе на обличчі.

Питання

Гонки на телевізорі при 30 fps тобі нормальні, а та сама швидкість в окулярах через дві хвилини робить зле. Чому саме в окулярах?

Крок 7

Як мозок збирає глибину з двох картинок

Два майже однакові зображення — і різниця між ними

Перевір прямо зараз. Витягни палець перед собою і закривай очі по черзі.

Палець стрибає туди-сюди, а дальня стіна — майже ні. Так виходить тому, що очі рознесені на кілька сантиметрів і бачать світ із двох різних точок.

Цей стрибок зветься паралакс. Саме він і несе відомості про відстань: що ближчий предмет, то сильніше він стрибає.

Один світ, два зображення вид згори міжзіниця ≈ 63 мм близько — великий кут між променями далеко — кут майже нульовий що потрапляє на кожен екран ліве око праве око паралакс: цей зсув і є відстань Далекий предмет — майже в тому самому місці обох кадрів, близький — помітно зсунутий. Мозок міряє зсув і бачить глибину.
Окуляри не показують «об'ємну картинку». Вони показують дві пласкі, по одній на око. Пара таких кадрів зветься стереопарою. Об'єм із неї добудовує вже мозок.

Міжзіниця — і чому її треба налаштовувати

Відстань між центрами зіниць у дорослих у середньому близько 63 мм. У переважної більшості — від 50 до 75 мм. У дітей від п'яти років вона починається приблизно від 40 мм. Скорочено цю відстань звуть IPD.

Тому в окулярах є регулювання. У Quest 2 це три фіксовані положення: 58, 63 і 68 мм. У Quest 3 — плавний повзунок: лінзи їздять приблизно в межах 58–70 мм. Підтримуваний діапазон виробник називає ширшим — близько 53–75 мм.

Якщо центр лінзи не збігається з центром зіниці, картинка мутніє по краях. Вона двоїться і швидко втомлює очі.

Це не «окуляри погані». Це неправильно виставлена міжзіниця, і виправляється вона за десять секунд.

Чому очі втомлюються навіть при ідеальному налаштуванні У житті все просто. Дивишся на близький предмет — очі одночасно зводяться до нього й наводять різкість на його відстань. В окулярах зводяться вони по-справжньому. А різкість наводять завжди на екран, який за кілька сантиметрів від ока. Ці два сигнали розходяться, і мозку доводиться жити з протиріччям.
Питання

Ти дав окуляри молодшій сестрі. Вона каже, що все двоїться і болять очі, хоча тобі в тих самих окулярах чітко. Що перевіряєш першим?

Крок 8

3DoF проти 6DoF

Головна різниця між дешевими й дорогими окулярами

Порахуй, скількома способами можна ворухнутися. Обертань у просторі рівно три: кивнути, покрутити головою, нахилити її до плеча. Переміщень теж три: вбік, угору-вниз, уперед-назад. Разом шість.

Ці способи звуть ступенями свободи, англійською degrees of freedom. Звідси й скорочення DoF. Питання одне: скільки з шести пристрій уміє помітити.

3DoF — тільки повороти 6DoF — повороти плюс переміщення поворот yaw нахил · pitch крен · roll телефон у картонному тримачі, гіроскоп вліво вправо вгору вниз вперед і назад камери на корпусі бачать кімнату
3DoF знає, куди ти дивишся. 6DoF знає ще й де ти стоїш. Різниця тут не в якості картинки. Різниця в тому, чи можеш ти нахилитися й зазирнути за предмет.
3DoF6DoF
Що вимірюєтри обертання головитри обертання плюс переміщення по трьох осях
Чим вимірюєгіроскоп і акселерометр — вони є в будь-якому телефонікамери на корпусі, що впізнають кімнату (inside-out), або зовнішні датчики (outside-in)
Що можнакрутити головою й роздивлятися навколоприсідати, нахилятися, обходити предмет, зазирати за нього
Прикладикартонний тримач для телефона, старі Gear VR і DaydreamMeta Quest, PSVR2, Apple Vision Pro, шоломи для комп'ютера
Що добре360°-відео, віртуальні екскурсії, панорамиусе, де треба дотягтися рукою або зайти за ріг

Тому 360-градусне відео чудово працює і в найдешевшому тримачі. Підходити там усе одно нікуди: картинку знято з однієї точки.

А от гра, де треба обійти колону, у 3DoF неможлива взагалі. Річ не у слабкому процесорі. Річ у тім, що система не знає, що ти зрушив з місця.

Питання

В окулярах за 2000 грн ти крутиш головою і все чудово роздивляєшся. Але нахилитися й зазирнути за колону не виходить: картинка не змінюється. Чому так?

Крок 9

Практика: задум гри і перша сцена

Кроки 2—5 — у себе на комп'ютері, кроки 6—8 — у кабінеті на сервері. Крок 1 лише питає сервер, чи бібліотека вже на місці. Галочки зберігаються — сторінку можна закрити.

Що де живе Сцену збираєш і налагоджуєш у себе на комп'ютері. Працюй з нею, поки в консолі не лишиться помилок. На сервер по FTP іде тільки легке: index.html і game-design.json. Бібліотеку aframe.min.js учитель уже розклав по кабінетах. Ти її не завантажуєш — вона близька до ліміту 2 МБ. Посилатися на чужі сайти теж не можна: чекер такі посилання шукає й перевірку не пропустить.

Каркас сцени, який ти сьогодні збираєш

index.html — мінімальна сцена
<!doctype html> <html lang="uk"> <head> <meta charset="utf-8"> <title>Моя перша сцена — Прізвище Ім'я</title> <script src="assets/aframe.min.js"></script> </head> <body> <a-scene> <a-sky color="lightskyblue"></a-sky> <a-light type="ambient" intensity="0.6"></a-light> <a-light type="directional" position="-1 3 2" intensity="0.8"></a-light> <a-plane position="0 0 -4" rotation="-90 0 0" width="20" height="20" color="seagreen"></a-plane> <a-box position="-1 0.5 -3" color="tomato"></a-box> <a-sphere position="0 1.25 -5" radius="1.25" color="steelblue"></a-sphere> <a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="gold"></a-cylinder> <a-camera position="0 1.6 0"></a-camera> </a-scene> </body> </html>

Три примітиви — це мінімум. Ім'я в <title> постав своє, позиції поміняй. Якщо сцена збігатиметься з шаблоном один-в-один, учитель на наступному уроці попросить переробити її під свій задум.

Чернетка задуму гри

Сьогодні заповнюєш три ключі з семи. Решту чотири — вдома.

assets/game-design.json — чернетка
{ "title": "Ліфт на дах", "genre": "головоломка від першої особи", "goal": "Гравець опинився в шахті ліфта і має піднятися на дах, натискаючи кнопки в правильному порядку" }
Пастка з кодуванням Зберігай JSON у редакторі як UTF-8 без BOM. Створиш файл через echo … > game-design.json у Windows PowerShell 5.1 — вийде UTF-16. Тоді чекер із jq скаже «невалідний JSON», хоч очима все правильно. У PowerShell пиши так: … | Out-File -Encoding utf8 game-design.json. А найнадійніше — просто зберегти з редактора.

Крок 10

Автоперевірка

Чекер відкриє сторінку справжнім браузером без вікна і подивиться, що в ній сталося. Спроби не обмежені.

Демонстраційний режим: результат згенеровано для показу. На сервері ця кнопка викликає POST /api/check, який запускає check 08 від імені учня.

Що вчитель дивиться на екрані

Крок 11

Шкала виконання

Це те, що бачить учитель, коли виставляє оцінку.

СкладникВагаРезультат
Виконано
0%
Рекомендований бал за 12-бальною

Чотири речі, які треба винести з уроку

  1. Об'єм — це сітка з трикутників. Вершини задають точки, полігони — грані між ними. Усе разом зветься мешем. Блиск і колір додає матеріал, а картинку зверху кладуть по UV-розгортці.
  2. У VR головне число — час одного кадру. 90 кадрів за секунду — це 11 мс на кадр. Коли картинка наздоганяє голову довше ніж 20 мс, мозок помічає розсинхрон. Звідси й кіберхвороба.
  3. 3DoF знає, куди ти дивишся. 6DoF знає ще й де ти стоїш. Тому присісти, обійти предмет і зазирнути за нього можна тільки в 6DoF.
  4. AR домальовує поверх світу, MR вписує в нього, VR замінює його весь. Перевірка одна: чи знає система, де в кімнаті стоїть стіл. Якщо знає — віртуальний м'яч закотиться за стіл, а не крізь нього.

Домашнє завдання

Доповни game-design.json до повних семи ключів. Додай mechanics — щонайменше три пункти, кожен окремим реченням. Додай controls, win_condition і target_device.

У полі target_device напиши чесно, 3DoF це чи 6DoF. А в controls поясни, як гравець рухається. Одне залежить від іншого — саме про це й був сьогоднішній урок.

Джерела

Звідки взяті числа й формулювання

Наукові статті, документація виробників і специфікації. Перевіряти дозволено й корисно.

Повний список із поясненнями, що саме звідки взято і які числа є ілюстративними, — у файлі urok-15-джерела.md поруч із цією сторінкою.