Четириизмерен лабиринт с изглед от първо лице

Оригиналът е на IronLynx

0
1087

Има над 30 игри с допълнително пространствено измерение, почти пълният списък на които е даден в Уикипедия, които по най-различни начини визуализират и се опитват да направят достъпна за разбиране четвъртата координата. Но в нито една от тези игри, няма такава, която да съчетава следните важни фактори:

  • Изглед от първо лице
  • Възможност за свободно движение и преместване във всички направления, без да има твърдо зададени траектории и ъгли на завиване
  • Несложна стандартна графика с текстури и добро осветление
  • Да не са добавени излишни елементи на геймплея и повече внимание да е отделено на изследването на четириизмерения свят

Освен това, имах желание самостоятелно да направя нещо подобно и реших да създам минималната версия на подобна игра – процедурно генериран четириизмерен лабиринт с визуализацията на 3D сеченията. Нека да погледнем какво се е получило

Сечение срещу проекция

Като за начало, нека да отделим малко време за начините за визуализиране на 4D пространството. Сред тях можем да обособим два основни метода – метода на сечението и метода на проекциите, което е по-лесно да бъдат показано с техните 3D аналози.

Сечения на куба в 2D пространството:

Ето така изглежда проекцията на куба в 2D:

По абсолютно същия начин можем да покажем сеченията на тесеракта, който е аналог на триизмерния куб, но в четириизмерното пространство, в трите стандартни измерения:

(разбира се, това също са 2D проекции на 3D обектите, но всичко е вярно)

А това е проекцията на тесеракта в 3D пространството:

От гледна точка на информативността и представянето на структурата на обекта, проекциите явно са по-добре, но този метод има един фатален недостатък – прекалено многото информация силно затруднява създаването на сложни цени, които са невероятно трудни за възприемане от потребителите. Така например, проекцията на възможно най-опростения 4D коридор се превръща в неразбираем за неподготвения човек набор от линии (скрийншотът е взет от играта 4D Maze Game):

Отляво проекцията на 3D коридор, а отдясно – на 4D коридор

Именно поради тази причина бе избран методът за визуализация на 3D сеченията, който от своя страна също не е идеален, понеже значителна част от обекта остава извън пределите на полето на виждане. За да разберем по-добре този ефект е най-добре да се възползваме от аналогията с обикновеното триизмерно пространство, като мислено заменим 4D с 3D, а двумерното изображение на 3D сечението – с едномерна линия, получена чрез плосък разрез:

Поставете се на мястото на едно двуизмерно същество, което изучава нашия свят с помощта на едноизмерно зрение

Ето как ще изглеждат двуизмерните проекции на 3D сечението на тесеракта. Внасяните изкривявания са аналогични на предишния пример:

Сега самите ние сме в ролята на това непълноценно същество

По-нататък тези ефекти се демонстрират върху конкретните елементи на лабиринта.

Текстурите

Всеки тесеракт има осем хипер страни, всяка от които си има своя 3D текстура (16 х 16 х 16 точки), по аналогия с триизмерния клуб, който има шест страни с 2D текстури. Всяка хипер страна на тесеракта си има свой цвят, който може да се види, когато тя е обърната към наблюдателя.

Това са страните на обикновения куб, образуван чрез 3D сечения на тесеракта:

След завъртането на тесеракта на 90 градуса в плоскостта ZW, видимите хипер страни +-Z се заменят съответно с +-W:

А това е анимацията на въртенето на тесеракта по шестте плоскости:

Тъй като всяка текстура има голяма черна граница по краищата, то понякога възниква странна на пръв поглед ситуация, когато 3D сечението се изравнява точно по тези граници и цялото изображение има само един цвят:

Представете си двуизмерен жител, който е насочил едномерния си поглед си точно в процепа между две тухли в една хипотетична стена на този 4D лабиринт

Осветлението

Във всяка стая на нашия четириизмерен лабиринт има източник на светлина, който може и да не се вижда в текущото 3D помещение, заради което ще ни се струва, че стените се осветяват сякаш отникъде.

Ето как изглежда анимация на завъртането в плоскостта XW, когато източникът на светлина е разположен на хипер страната -Y:

Скритите коридори

Играчът трябва непрекъснато да помни, че някои стени от тези четириизмерни стаи, могат и да не се виждат от неговото текущо 3D сечение и завоят в допълнителното измерение дава възможност да бъдат открити скритите коридори.

Така изглежда анимацията на две последователни завъртания, първоначално в плоскостта ZW, а след това в YW:

Генериране на четириизмерния свят

Лабиринтът се генерира с помощта на рекурсия, като за този алгоритъм е налична една великолепна визуализация. Ето кои са основните точки на този алгоритъм:

  1. Целият лабиринт се запълва със стени, като най-далечното от нулевите координати на лабиринта помещение се задава като текущо
  2. Текущото помещение се отбелязва като посетено
  3. Докато текущото помещение има непосетени съседи:
    1. По случаен начин се избира който и да е от непосетените съседи
    2. Премахват се стените между текущото помещение и избраното съседно
    3. По този начин помещението става текущо и се повтаря точка 2

След това за всяко помещение се избира случайна стена и на нея се поставя източник на светлина, която се разпространява рекурсивно във всички направления, като намалява интензитета си с единица при всеки следващ блок от помещенията. Светлината се разпространява дотогава, докато интензивността не намалее до нулата или не се появи помещение с по-голяма интензивност от текущата, или помещението не е празно.

Рендирането

Тъй като готови енджини за рендиране на четириизмерни обекти не съществуват (или поне аз не намерих такива), то аз написах свой собствен софтуерен рендер. Производителността не бе приоритет и затова бе избран най-лесният за реализиране метод на рендиране – рей кастинг (Ray casting), който може лесно да бъде описан с помощта на няколко основни стъпки на алгоритъма:

  • От позицията на геймъра се излъчват множество лъчи по такъв начин, че да образуват правоъгълна област, което на практика е неговото поле на зрение
  • За всеки лъч, с помощта на цикъл се извършва последователна проверка за преминаване със стъпка един блок от всяко помещение
  • Ако при поредната стъпка лъчите срещнат плътен блок, то
    • Изчислява се индекс на страната и съответстващата ѝ 3D текстура, както и нивото на нейната осветеност
    • Според разстоянието до съответния блок се определя координатата в текстурата, от която се получава цвета на пиксела. След получаването цвета на този пиксел цикълът прекъсва

Тъй като всеки лъч и формира един пиксел, то в резултат на обработката на всички лъчи ще бъде формирано готово изображение, което остава само да бъде изведено на екрана.

Производителността на подобна реализация без всякакви оптимизации е изключително ниска, но при малка резолюция е достатъчна за получаване на сравнително комфортен брой кадри на секунда. При тестовете използвах резолюция 1280х720 пиксела, при която процесорът AMD Ryzen 5 2600 даваше стабилни 60 FPS.

Ето три скрийншота, които показват работата на моя рендер:

Заключение

В крайна сметка се получи не толкова пълноценна четириизмерна игра, колкото една много добра демонстрация на 4D пространството в интерактивна форма. Ако продължа да развивам този проект, възнамерявам да ускоря рендера, да реализирам Ray casting на шейдърите (или изобщо да се откажа от лъчите и вместо тях да използвам алгоритми за растеризация). Може да бъде добавено и генерирането на по-естествени структури, на обекти с произволна форма, на разнообразни цели и игрова механика. Считам че по този начин би могъл да се получи един доста добър четириизмерен Minecraft.

Сорс кодът на всичко показано дотук може да бъде изтеглен от GitHub, a изпълнимият файл за операционната система Windows, оттук.


Авторът е използвал следните материали:

Статията предизвика много голям интерес, като и досега не стихват споровете, дали да се използват 3D или 4D патрони, ако бъде реализирана и стрелба в този четириизмерен гейм лабиринт.