Има над 30 игри с допълнително пространствено измерение, почти пълният списък на които е даден в Уикипедия, които по най-различни начини визуализират и се опитват да направят достъпна за разбиране четвъртата координата. Но в нито една от тези игри, няма такава, която да съчетава следните важни фактори:
- Изглед от първо лице
- Възможност за свободно движение и преместване във всички направления, без да има твърдо зададени траектории и ъгли на завиване
- Несложна стандартна графика с текстури и добро осветление
- Да не са добавени излишни елементи на геймплея и повече внимание да е отделено на изследването на четириизмерения свят
Освен това, имах желание самостоятелно да направя нещо подобно и реших да създам минималната версия на подобна игра – процедурно генериран четириизмерен лабиринт с визуализацията на 3D сеченията. Нека да погледнем какво се е получило
Сечение срещу проекция
Като за начало, нека да отделим малко време за начините за визуализиране на 4D пространството. Сред тях можем да обособим два основни метода – метода на сечението и метода на проекциите, което е по-лесно да бъдат показано с техните 3D аналози.
Сечения на куба в 2D пространството:
Ето така изглежда проекцията на куба в 2D:
По абсолютно същия начин можем да покажем сеченията на тесеракта, който е аналог на триизмерния куб, но в четириизмерното пространство, в трите стандартни измерения:
(разбира се, това също са 2D проекции на 3D обектите, но всичко е вярно)
А това е проекцията на тесеракта в 3D пространството:
От гледна точка на информативността и представянето на структурата на обекта, проекциите явно са по-добре, но този метод има един фатален недостатък – прекалено многото информация силно затруднява създаването на сложни цени, които са невероятно трудни за възприемане от потребителите. Така например, проекцията на възможно най-опростения 4D коридор се превръща в неразбираем за неподготвения човек набор от линии (скрийншотът е взет от играта 4D Maze Game):

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

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

По-нататък тези ефекти се демонстрират върху конкретните елементи на лабиринта.
Текстурите
Всеки тесеракт има осем хипер страни, всяка от които си има своя 3D текстура (16 х 16 х 16 точки), по аналогия с триизмерния клуб, който има шест страни с 2D текстури. Всяка хипер страна на тесеракта си има свой цвят, който може да се види, когато тя е обърната към наблюдателя.
Това са страните на обикновения куб, образуван чрез 3D сечения на тесеракта:
След завъртането на тесеракта на 90 градуса в плоскостта ZW, видимите хипер страни +-Z се заменят съответно с +-W:
А това е анимацията на въртенето на тесеракта по шестте плоскости:
Тъй като всяка текстура има голяма черна граница по краищата, то понякога възниква странна на пръв поглед ситуация, когато 3D сечението се изравнява точно по тези граници и цялото изображение има само един цвят:

Осветлението
Във всяка стая на нашия четириизмерен лабиринт има източник на светлина, който може и да не се вижда в текущото 3D помещение, заради което ще ни се струва, че стените се осветяват сякаш отникъде.
Ето как изглежда анимация на завъртането в плоскостта XW, когато източникът на светлина е разположен на хипер страната -Y:
Скритите коридори
Играчът трябва непрекъснато да помни, че някои стени от тези четириизмерни стаи, могат и да не се виждат от неговото текущо 3D сечение и завоят в допълнителното измерение дава възможност да бъдат открити скритите коридори.
Така изглежда анимацията на две последователни завъртания, първоначално в плоскостта ZW, а след това в YW:
Генериране на четириизмерния свят
Лабиринтът се генерира с помощта на рекурсия, като за този алгоритъм е налична една великолепна визуализация. Ето кои са основните точки на този алгоритъм:
- Целият лабиринт се запълва със стени, като най-далечното от нулевите координати на лабиринта помещение се задава като текущо
- Текущото помещение се отбелязва като посетено
- Докато текущото помещение има непосетени съседи:
- По случаен начин се избира който и да е от непосетените съседи
- Премахват се стените между текущото помещение и избраното съседно
- По този начин помещението става текущо и се повтаря точка 2
След това за всяко помещение се избира случайна стена и на нея се поставя източник на светлина, която се разпространява рекурсивно във всички направления, като намалява интензитета си с единица при всеки следващ блок от помещенията. Светлината се разпространява дотогава, докато интензивността не намалее до нулата или не се появи помещение с по-голяма интензивност от текущата, или помещението не е празно.
Рендирането
Тъй като готови енджини за рендиране на четириизмерни обекти не съществуват (или поне аз не намерих такива), то аз написах свой собствен софтуерен рендер. Производителността не бе приоритет и затова бе избран най-лесният за реализиране метод на рендиране – рей кастинг (Ray casting), който може лесно да бъде описан с помощта на няколко основни стъпки на алгоритъма:
- От позицията на геймъра се излъчват множество лъчи по такъв начин, че да образуват правоъгълна област, което на практика е неговото поле на зрение
- За всеки лъч, с помощта на цикъл се извършва последователна проверка за преминаване със стъпка един блок от всяко помещение
- Ако при поредната стъпка лъчите срещнат плътен блок, то
- Изчислява се индекс на страната и съответстващата ѝ 3D текстура, както и нивото на нейната осветеност
- Според разстоянието до съответния блок се определя координатата в текстурата, от която се получава цвета на пиксела. След получаването цвета на този пиксел цикълът прекъсва
Тъй като всеки лъч и формира един пиксел, то в резултат на обработката на всички лъчи ще бъде формирано готово изображение, което остава само да бъде изведено на екрана.
Производителността на подобна реализация без всякакви оптимизации е изключително ниска, но при малка резолюция е достатъчна за получаване на сравнително комфортен брой кадри на секунда. При тестовете използвах резолюция 1280х720 пиксела, при която процесорът AMD Ryzen 5 2600 даваше стабилни 60 FPS.
Ето три скрийншота, които показват работата на моя рендер:
Заключение
В крайна сметка се получи не толкова пълноценна четириизмерна игра, колкото една много добра демонстрация на 4D пространството в интерактивна форма. Ако продължа да развивам този проект, възнамерявам да ускоря рендера, да реализирам Ray casting на шейдърите (или изобщо да се откажа от лъчите и вместо тях да използвам алгоритми за растеризация). Може да бъде добавено и генерирането на по-естествени структури, на обекти с произволна форма, на разнообразни цели и игрова механика. Считам че по този начин би могъл да се получи един доста добър четириизмерен Minecraft.
Сорс кодът на всичко показано дотук може да бъде изтеглен от GitHub, a изпълнимият файл за операционната система Windows, оттук.
Авторът е използвал следните материали:
Статията предизвика много голям интерес, като и досега не стихват споровете, дали да се използват 3D или 4D патрони, ако бъде реализирана и стрелба в този четириизмерен гейм лабиринт.