Детка, это просто космос!
Чёрная дыра в виртуальной реальности
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-кабель.