Детка, это просто космос!

Чёрная дыра в виртуальной реальности

1 этап – Сбор информации

Чёрная дыра – это один из самых популярных объектов в космосе, а после фильма «Интерстеллар» его популярность выросла ещё больше. Почему бы не заглянуть в неё, используя современные технологии?!

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

Чтобы создать черную дыру, нужно было определиться, что она собой представляет, из чего состоит и как работает. Чёрной она называется потому что обладает огромной массой и, как следствие, такой сильной гравитацией, которая притягивает даже свет, фотоны, из-за чего сам объект становится неразличимо-чёрным, а пространство вокруг него искажается.

Чёрная дыра с аккреционным диском из фильма «Интерстеллар»
Чёрная дыра с аккреционным диском из фильма «Интерстеллар»

Чтобы добиться такого эффекта, нужно было показать у объекта чёрной дыры в виртуальной реальности:

– горизонт событий/радиус Шварцшильда,

– аккреционный диск,

– искажение пространства-времени

2 этап – Реализация

Весь процесс поиска решения задачи проходил в Unity.

Сначала мы решили воссоздать чёрную дыру, используя шейдер граф (специальный плагин Unity, который позволяет писать шейдеры нодами, а не кодом). С созданием первой части – эффекта искажения – все прошло гладко, он хорошо работал в VR. Но вот добавить к нему аккреционный диск уже стало проблемой. Когда мы смотрели прямо в центр чёрной дыры, то он был похож на то, что нужно, но как только отводили взгляд, - все ломалось.

Верхнее искажение диска не отрисовывается
Верхнее искажение диска не отрисовывается

Были попытки исправить этот недочёт, но стало понятно, что придётся использовать Raymarching, чего мы пытались изначально избежать, так как Raymarching - довольно ресурсозатратная техника рендеринга и не самая простая для VR. Про него довольно хорошо переведена статья на Хабр.

Дело пошло. Но встала проблема, как подружить VR и Raymarching в Unity. Сначала мы хотели cделать так, чтобы пространство рэймарчинга рендерилось в текстуру, которая бы проецировалась на камеру. Но такой подход «кушал» слишком много ресурсов, и поэтому было решено сделать всё через обычный стерео-проходный шейдер, создать материал и кинуть его на сферу. По сути получалось то же самое, если мы просто влетим в сферу.

Скайбокс млечного пути на сфере
Скайбокс млечного пути на сфере

Существует довольного много вариаций чёрных дыр, написанных с помощью рэймарчинга. На том же ShaderToy их порядка 40, но с разными аккреционными дисками. У таких решений один и тот же принцип - искривление луча в зависимости от того, насколько близко он к чёрной дыре.

Основным руководством, после многочисленных экспериментов, для нас стала статья «Kelvin van Hoorn Supermassive black hole tutorial», в которой довольно хорошо описаны все этапы воссоздания чёрной дыры.

Чуть модернизировав и оптимизировав шейдер применительно к VR, мы пришли к решению, которое нас устроило. Команда TITABIT представляет готовый результат:

Детка, это просто космос!
Детка, это просто космос!

Протестировав несколько цветовых вариантов, команда оставила золотистый оттенок аккреционного диска, как наиболее общеизвестный при визуализации чёрной дыры.

Чтобы избежать эффекта укачивания и упростить пользовательский опыт в VR-среде, мы реализовали поворот объекта чёрной дыры с помощью контроллера. Такой поворот показывает все эффекты и искажения, которые мы хотели получить. Отдельно сделано передвижение по сцене в виде плавных пролетов для приближения или отдаления от объекта чёрной дыры.

В итоге мы создали близкую к математической модель чёрной дыры в виртуальной реальности. Немного проявив воображение, можно в полной мере почувствовать себя героем фильма «Интерстеллар».

Доступно для Meta Quest/Quest2 через Link-кабель.

66
Начать дискуссию