You are on page 1of 27

РОЗДІЛ 3.

РОЗРОБКА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ ДЛЯ


ЗМЕНШЕННЯ ЕФЕКТУ ХВОРОБИ ВР
Тут буде вступ

3.1. Опис та налаштування інструментів, використаних під час


розробки програми
3.1.1. Налаштування середовища Unity та Oculus до розробки і супроводу
Для того, щоб почати розробку застосунку ВР потрібно мати движок
(обрано Unity) та SDK. Вибір середовища розробки обґрунтований у розділі
2. Для кращого розуміння процесу створення додатка потрібно дати
визначення пов'язаним поняттям:
- Game Engine (або ж движок). Платформа розробки, що містить в собі
всі аспекти гри.
- SDK. Набір із засобів розробки, утиліт і документації, який дозволяє
користувачам створювати прикладні програми за визначеною
технологією або для певної платформи.
- Unity HUB - це система керування, яка дозволяє супроводжувати всі
проєкти в Unity та завантажені файли. Використовується для багатьох
установок до Unity Editor, разом з пов’язаними компонентами, також
для створення нових проєктів та відкриття наявних [1].
Для того, щоб обрати належну версію SDK, існує програма Unity HUB. Щоб
розпочати розробку, потрібно запустити її [5]. Для коректного розгортання
застосунків у ВР необхідно встановити наступні модулі у вікні інсталяції
Unity HUB (рис. 3.1):
- Dev tools: Microsoft Visual Studio Community 2019.
- Platforms: Android Build Support, OpenJDK, Android SDK & NDK Tools.
Рис. 3.1. Вікно опцій інсталяції Unity Hub.

Android Build Support - це модуль створення та запуску середовища для


Android, який потребує Software Development Kit (SDK) та Native
Development Kit (NDK) щоб писати та виконувати будь-який код на пристрої.
За замовчуванням Unity встановлює Java Development Kit на основі OpenJDK.
Наступним етапом є створення пустого проєкту. У відповідному вікні
потрібно натиснути на «create project», обираючи встановлену версію
редактора, назвавши проєкт, взявши 3D - шаблон (для ВР розробки) та
визначивши місце зберігання на локальному диску (рис. 3.2).

Рис. 3.2. Вікно створення проєкту Unity Hub.


Також, для подальшого налагодження програми (debugging) та її тестування
варто під’єднати та налаштувати Oculus за нижченаведеними кроками:
- Встановити з офіційного сайту Oculus Link застосунок Link Cable у
відповідності версії шолома [2];
- Завантаживши додаток, необхідно авторизуватись та дозволити запуск
програм, які не були перевірені Oculus (див. Додаток-А.1);
- Перевести Oculus в режим розробки (development mode) у застосунку
Meta Quest (див. Додаток-А.2);
- Під’єднати шолом до Oculus Link, дозволивши USB Debugging у вікні,
що з’явилось;
- Запустити шолом у режимі link з меню налаштувань (див. Додаток-
А.3).
Налаштувавши шолом, перейдемо до самого проєкту. Спочатку
імпортуємо необхідні пакети. Для цього скористаємось Window - Package
Manager. У вікні, що з’явилось додаємо XR Plugin Management, XR Interaction
Toolkit та його дочірній пакет Starter Assets (рис. 3.3).

Рис. 3.3. Вікно Package Manager, встановлення пакету XR Plugin Management,


XR Interaction Toolkit та Starter Assets.
На даному етапі повинно розуміти зміст імпортованих пакетів. Опис
встановлених компонент:
- XR Plugin Management - пакет, який забезпечує просте керування
плагінами XR. Спрямовує та пропонує допомогу із завантаженням,
ініціалізацією, налаштуваннями та підтримкою збірки плагінів XR [3].
- XR Interaction Toolkit - високорівнева компонентна система взаємодії
для підтримання застосунків віртуальної та доповненої реальностей.
Вона надає структуру, яка робить доступними 3D та UI взаємодії з
подій введення в Unity. Ядром цієї системи є набір базових
компонентів Interactor і Interactable, а також менеджер взаємодії, який
об’єднує ці два типи компонентів. Він також містить компоненти, які
слід використовувати для пересування та малювання візуальних
елементів [4].
- Сам XR - це є батьківський модуль, що містить функції підтримки
пов’язаних платформ VR і AR [6].
Після успішного встановлення XR Plugin Management в Edit - Project Settings
буде доступне налаштування провайдерів плагіну. Потрібно позначити
Oculus для вкладки Android (рис. 3.4) та OpenXR для Windows, Linux, Mac
опцій (рис. 3.5). Це дозволить коректно запускати застосунок на відповідних
платформах.

Рис. 3.4. Зміна налаштувань для Android (Edit - Project Settings - XR Plugin
Manager).
Рис. 3.5. Зміна налаштувань для Windows, Linux, Mac (Edit - Project Settings -
XR Plugin Manager).

Додамо також профілі взаємодії до встановленого OpenXR (рис. 3.6),


які визначатимуть доступні вхідні налаштування, отримані від контролерів.
Oculus Touch Controller Profile є основним в межах даної роботи, через
специфіку використаних контролерів до Oculus Quest.

Рис. 3.6. Додавання профілів взаємодії (Edit - Project Settings - XR Plugin


Manager - OpenXR).

Після проведених вищезазначених операцій, Unity може комунікувати з


шоломом та перетворювати вхідні дані у дії, у ВР застосунку.
Повернувшись до проєкту, можемо бачити, що з’явились зразки
налаштувань, їх потрібно додати до стандартних налаштувань, обравши
опцію «Add to ActionBasedContiniousMoveProvider default» (рис. 3.7).
Рис. 3.7. Додавання налаштувань за замовчуванням до постачальника руху.

Для ActionBaseController скрипту у вікні Edit - Project Settings - Preset


Manager варто додати фільтри right та left, щоб Unity могла коректно
розпізнавати вхідні параметри. У XR Interaction Manager об’єкті (за
замовчуванням у вкладці SampleScene) визначаємо налаштування Action
Assets (рис. 3.8).

Рис. 3.8. Встановлений XRI Default Input Actions як елемент Action


Assets у XR Interaction Manager об’єкті.
Останнім кроком є додавання XR Origin (Action-based) об’єкту до
проєкту і для його опції «XR Interaction Manager» встановлюємо XRI Default
Input Actions. Запустивши програму та одягнувши шолом, можна буде
спостерігати в середовищі сцену в режимі реального часу. Отже, можна
вважати, що підключення виконано успішно.

3.1.2. Налаштування основи інтерактивності проєкту


Перед початком розробки застосунку, потрібно підготувати систему
розпізнавання викликів з контролера та шолома.
Input System (система введення) - це основа інтерактивності проєктів із
контентом реального часу. Завдяки цій системі можна з легкістю
налаштувати керування для різних платформ, від мобільних пристроїв до ВР.
Цікавим фактом є те, що система Unity стандартизує методи реалізації
управління та забезпечує розширену функціональність, недосяжну для
базових рішень. Наприклад, достатньо прив'язати дії до логіки коду, а потім
увімкнути різні пристрої та варіанти керування у візуальному інтерфейсі
вікна Input Action і розроблена функціональність буде в робочому стані.
Система введення також має власне API. Сам пакет Input System доступний
для інсталяції у Package Manager вікні (авторизований для Unity 2019 LTS та
новіших версій).
Для початку роботи з Unity Input System, потрібно перевірити чи
коректно налаштований шолом та контролери. Звіримо, чи наявні прив’язки
до клавіш та доступні Input Actions за замовчуванням під час запуску
застосунку.
З встановленого пакету XR Interaction Toolkit можна переглянути XRI
Default Input Actions (рис. 3.9). Усі схеми для контролерів повинні бути
заповненими.
Рис. 3.9. XRI Default Input Action налаштування.

Запустивши проєкт разом із підключеним шоломом, у вікні XR


Interaction Debugger (Window - Analysis - XR Interaction Debugger) [7],
спостерігаємо зміну значень при взаємодії з контролерами та шоломом (рис.
3.10).

Рис. 3.10. Вікно XR Interaction Debugger.


Таким чином, звіривши налаштування у проєкті та у режимі запуску
програми, можна підтвердити, що шолом та контролери комунікують з
середовищем Unity.
Для наявного відображення коректно налаштованої системи Input
Actions створено пустий об'єкт, для показу рук аватара (користувача на сцені)
і додано новий компонент (скрипт) HandPresence (див. Додаток-Б).
У скрипті, методи Update() та Start() є за замовчуванням:
- Update() - викликається на кожний кадр в застосунку.
- Start() - викликається один раз, на етапі запуску застосунку.
У коді імпортовано UnityEngine.XR пакет (модуль містить функції
підтримки пов’язаної платформи VR і AR) та додано метод TryInitialize()
через потенційну проблему з NullreferenceException [7] для отримання
InputDevices на етапі запуску програми (метод Start()). Помилка може
виникати для деяких шоломів та вирішується шляхом пере ініціалізації
вхідних пристроїв після запуску сцени (метод Update()).
Запустивши застосунок маємо відповідний вивід логування у консоль
(рис. 3.11).

Рис. 3.11. Результат виконання скрипта HandPresence після запуску


застосунку.
Було знайдено три пристрої для вхідних дій, Head Tracking та два
контролери. Отже, інтерактивність в проєкті налаштована успішно. Це
означає, що у проєкту є основа для подальшої розробки.
3.2. Реалізація методу телепортації Blink Teleport для зменшення
ефекту хвороби ВР
3.2.1. Підготовка сцени для взаємодії
Для того, щоб протестувати розробку телепортації та анімації для системи
введення потрібно створити ряд об’єктів на сцені з різною логікою взаємодії.
Це допоможе користувачу потренуватися з розробленим функціоналом. Для
підготовки сцени було додано такі об’єкти:
- Plane - звичайна земля, по якій користувач буде рухатись. До об’єкту
доданий матеріал Ground, який використовує кастомізовані текстури.
- Table - імітатор стола, щоб надавати користувачу об’єкти для взаємодії.
До об’єкту доданий матеріал Ground, який використовує кастомізовані
текстури.
- Kinematic, Instantaneous, Velocity Tracking - об’єкти типу сфера, з
компонентом XR Grab Interactable (дозвіл на взаємодію) з відповідними
значеннями для Movement Type. Шар взаємодії встановлений як
interactable left (тільки для лівої руки) зі звичайними матеріалами.
- PistolSilencer - багатокомпонентний складний об’єкт з доданим Audio
Source, Attach Point, та FireBullet скриптом (див. Додаток-В), що
використовує простий об’єкт Bullet взаємодії та відтворює постріл.
Щоб підготувати віртуальний аватар створено моделі рук, як складні об’єкти
та додано контроллери, які були попередньо анімовані (див. Додаток Г-1/2/3).
3.2.2. Розробка телепортації
Телепортація - гіпотетичне перенесення матерії чи енергії з однієї
точки простору в іншу, без проходження фізичного простору між ними.
Переважно розглядається в сфері фантастики [8]. Тобто у VR застосунку, це
переміщення без застосування руху аватару, чи об’єкту.

Для того щоб ефективно працювати з механізмом телепортації потрібно


вміти:

- Налаштовувати процес переміщення в просторі;


- Мати навички у використанні телепортаційних зон та якорів
(Teleporting Area/Anchor);
- Вміти змінювати логіку телепортації за допомогою скриптів.

Для налаштування процесу переміщення, додамо новий об’єкт Locomotion


System (надає систему телепортації, рис. 3.12), що містить в собі такі опції як
Teleportation Provider скрипт (надає функції які допомагають телепортувати
гравця), та Snap Turn Provider (налаштування дозволяє повертатись гравцеві
по активації контроллера).
Рис. 3.12. Налаштування створеної Locomotion System.

Наступним кроком додамо Ray Interactor об’єкти для двох


контроллерів. Interactor (той, що сприяє співдіянню) використовується для
взаємодії з об’єктами на відстані. [9]. Залишається додати місце, куди
можлива буде телепортація. Це робиться за допомогою застосування
Teleportation Area/Anchor на сцену, саме з цим об’єктом буде взаємодіяти
доданий interactor на відстані для виконання телепорту.
Teleportation Area (рис. 3.13) - це пункт призначення телепортації, який
телепортує користувача в його зазначене місце на поверхні при співдіянні.
Рис. 3.13. Teleportation Area на сцені.

З налаштувань (див. Додаток Ґ-1) було додано матеріал, що


використовує кастомізовані текстури для кращого візуального представлення
та встановлено опцію Layer (шар співдіяння) на Teleport, щоб в подальшому
забороняти телепортуватись при взаємодії з іншими об’єктами. Також додано
TeleportReticle об’єкт (див. Додаток Ґ-2) до налаштувань Custom Reticle у
Teleportation Area опціях. Custom Reticle - це прицільна сітка, що
відображатиметься на кінці променя телепортації.
У Teleportation Anchor все налаштовано по аналогії до Teleportation Area,
крім того що є окремо налаштування Teleport Anchor Transform (рис. 3.14),
яке означає що телепортація завжди відбуватиметься в центр цієї області.
Рис. 3.14. Teleportation Anchor на сцені.

Остаточним етапом є написання скрипта, для активації режиму


телепортації та повернення у звичайний. На сцені це виглядатиме як поява
телепортаційного променю з анімованих пальців рук та зникнення його
відповідно по натисканню запрограмованих Input Actions для контроллерів.
Для цієї функціональності було створено та перевикористано для обох
Left/Right Teleporting Ray TeleportationController скрипт (див. Додаток-Д).
3.2.3. Аналіз отриманих результатів
Після застосування набутих навчикок під час практики, було отримано
сцену з різними об’єктами, з якими можна взаємодіяти. Анімовані руки-
контроллери які при активації телепортують аватар, та при деактивації
переходять у режим звичайної взаємодії з об’єктами Grab Interactable.
Телепортацію можна виконувати лише у Teleportation Area/Anchor(див.
Додаток Е-1/2). Заборона телепортації на всіх інших об’єктах підсвічується
червоним кольором(див. Додаток Е-3). Додатково було налаштовані звуки
анімації та вібрації контролерів.
3.3. Рекомендації для подальших покращень проєкту
3.3.1. Розміщення влсаної бібліотеки на open source
3.3.2. Опис можливих конфігурацій розробленого додатку
3.4. Висновки до розділу
Список використаної літератури
1. How to avoid the effect of motion sickness in VR - vrscout [Електронний
ресурс] // VRScout. – Режим доступу: https://vrscout.com/news/avoid-
motion-sickness-developing-for-vr/ (дата звернення: 29.09.2022). – 1.
2. Unity - manual: xR [Електронний ресурс] // Unity - Manual: Unity User
Manual 2021.3 (LTS). – Режим
доступу: https://docs.unity3d.com/Manual/com.unity.modules.xr.html (дата
звернення: 29.09.2022). – 2.
3. Unity - manual: installing the unity hub [Електронний ресурс] // Unity -
Manual: Unity User Manual 2021.3 (LTS). – Режим
доступу: https://docs.unity3d.com/2020.1/Documentation/Manual/GettingSt
artedInstallingHub.html#:~:text=The%20Unity%20Hub%20is
%20a,Projects,%20and%20open%20existing%20Projects (дата звернення:
29.09.2022). – 3.
4. Kundu R. K. A study on sensor system latency in VR motion sickness
[Електронний ресурс] / Ripan Kumar Kundu, Akhlaqur Rahman, Shuva
Paul // Journal of sensor and actuator networks. – 2021. – Т. 10, № 3. –
С. 53. – Режим доступу: https://doi.org/10.3390/jsan10030053 (дата
звернення: 29.09.2022). – 8.
5. Unity - manual: XR plugin management [Електронний ресурс] // Unity -
Manual: Unity User Manual 2021.3 (LTS). – Режим
доступу: https://docs.unity3d.com/Manual/com.unity.xr.management.html (
дата звернення: 29.09.2022). – 5.
6. Unity - manual: xR [Електронний ресурс] // Unity - Manual: Unity User
Manual 2021.3 (LTS). – Режим
доступу: https://docs.unity3d.com/Manual/com.unity.modules.xr.html (дата
звернення: 29.09.2022). – 6.
7. Virtual reality sickness: a review of causes and measurements
[Електронний ресурс] // Taylor & Francis. – Режим
доступу: https://www.tandfonline.com/doi/full/10.1080/10447318.2020.177
8351 (дата звернення: 29.09.2022). – 7.
8. Unity - manual: installing the unity hub [Електронний ресурс] // Unity -
Manual: Unity User Manual 2021.3 (LTS). – Режим
доступу: https://docs.unity3d.com/2020.1/Documentation/Manual/GettingSt
artedInstallingHub.html#:~:text=The%20Unity%20Hub%20is
%20a,Projects,%20and%20open%20existing%20Projects (дата звернення:
29.09.2022). – 8.
9. XR ray interactor | XR interaction toolkit | 2.0.3 [Електронний ресурс] //
Unity - Manual: Unity User Manual 2021.3 (LTS). – Режим
доступу: https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit
@2.0/manual/xr-ray-interactor.html - 9

ДОДАТКИ
Додаток А
(налаштування шолому)

Рис. А-1. Опція Unknown Sources у вкладці Settings.


Рис. А-2. Опція режим розробки у застосунку Meta Quest (знімок з екрану
смартфона).

Рис. А-3. Запуск шолому у режимі link (знімок з середовища VR).


Додаток Б
(лістинг скрипта HandPresence)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;
public class HandPresence : MonoBehaviour
{
private List<InputDevice> devices = new List<InputDevice>();
// Start is called before the first frame update
void Start()
{
TryInitialize();
}
// Update is called once per frame
void Update()
{
if(devices.Count == 0)
{
TryInitialize();
}
}
private void TryInitialize()
{
InputDevices.GetDevices(devices);
if (devices.Count == 0)
{
return;
}
foreach (var item in devices)
{
Debug.Log("My log, item name: " + item.name + " item characteristics: " +
item.characteristics);
} }}
Додаток В
(лістинг скрипта FireBullet)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class FireBullet : MonoBehaviour


{
public float speed = 50f;
public GameObject bulletObj;
public Transform frontOfGun;

public static event Action GunFired;


public void Fire()
{
GetComponent<AudioSource>().Play();
GameObject spawnedBullet = Instantiate(bulletObj, frontOfGun.position,
frontOfGun.rotation);
spawnedBullet.GetComponent<Rigidbody>().velocity = speed *
frontOfGun.forward;
Destroy(spawnedBullet, 5f);
GunFired?.Invoke();
}
}
Додаток Г
(робота з анімацією складного об’єкта)

Рис. Г-1. Комплексний об’єкт – рука.

Рис. Г-2. Одиничний об’єкт – складова руки.

Рис. Г-3. Знімок анімацій станів об’єкту руки.


Додаток Ґ
(налаштування телепортації)

Рис. Ґ-1. Приклад налаштувань зони телепортації

Рис. Ґ-2. Вигляд створеного TeleportReticle об’єкту.


Додаток Д
(лістинг скрипта Hand)

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;
 
public class Hand : MonoBehaviour
{
//Stores handPrefab to be Instantiated
public GameObject handPrefab;
 
//Stores what kind of characteristics we're looking for with our Input Device
when we search for it later
public InputDeviceCharacteristics inputDeviceCharacteristics;
 
//Allows for hiding of hand prefab if set to true
public bool hideHandOnSelect = false;

//Stores the InputDevice that we're Targeting once we find it in InitializeHand()


private InputDevice _targetDevice;
private Animator _handAnimator;
private SkinnedMeshRenderer _handMesh;

public void HideHandOnSelect()


{
if(hideHandOnSelect)
{
_handMesh.enabled = !_handMesh.enabled;
}
}
 
private void Start()
{
InitializeHand();
}
 
private void InitializeHand()
{
List<InputDevice> devices = new List<InputDevice>();
//Call InputDevices to see if it can find any devices with the characteristics
we're looking for
InputDevices.GetDevicesWithCharacteristics(inputDeviceCharacteristics,
devices);
 
//Our hands might not be active and so they will not be generated from the
search.
//We check if any devices are found here to avoid errors.
if (devices.Count > 0)
{
 
_targetDevice = devices[0];
 
GameObject spawnedHand = Instantiate(handPrefab, transform);
_handAnimator = spawnedHand.GetComponent<Animator>();
_handMesh =
spawnedHand.GetComponentInChildren<SkinnedMeshRenderer>();
}
}
 
// Update is called once per frame
private void Update()
{
//Since our target device might not register at the start of the scene, we
continously check until one is found.
if (!_targetDevice.isValid)
{
InitializeHand();
}
else
{
UpdateHand();
}
}
 
private void UpdateHand()
{
//This will get the value for our trigger from the target device and output a
flaot into triggerValue
if (_targetDevice.TryGetFeatureValue(CommonUsages.trigger, out float
triggerValue))
{
_handAnimator.SetFloat("Trigger", triggerValue);
}
else
{
_handAnimator.SetFloat("Trigger", 0);
}
//This will get the value for our grip from the target device and output a
flaot into gripValue
if (_targetDevice.TryGetFeatureValue(CommonUsages.grip, out float
gripValue))
{
_handAnimator.SetFloat("Grip", gripValue);
}
else
{
_handAnimator.SetFloat("Grip", 0);
}
}
}
Додаток Е
(приклади запрограмованої телепортації)

Рис. Е-1. Можливість телепортації в межах Teleportation Anchor.

Рис. Е-2. Можливість телепортації в межах Teleportation Area.

Рис. Е-3. Неможливість телепортації у заборонених зонах.

You might also like