BSP-дерево и индексация объектов игрового уровня

Кубическое BSP-дерево в Unity

В этом топике я хочу немного поразмышлять над практическим применением BSP-дерева для индексации игрового пространства для дальнейшего осуществления быстрого поиска игровых объектов, определения коллизий и других полезных вещей.

За примерами далеко ходить не надо — в бесплатной версии Unity нету встроенного механизма Occlusion Culling (автоматического отсечения перекрытых объектов). Если вы создаете город, и камера смотрит на какой-либо квартал, то рендерится будут не только ближайшие дома, но и дома, расположенные за ними, даже если они полностью закрыты близлежащими строениями. Владельцам Unity Pro беспокоиться на этот счет не стоит, но не у каждого есть лишняя пара тысяч долларов на лицензию. Использование же BSP-дерева позволит самостоятельно реализовать механизм Occlusion Culling и сэкономить немалые деньги :)

Но, как я уже писал ранее, применение BSP-дерева не ограничивается реализацией алгоритма Occlusion Culling и быстрым поиском столкновений между объектами. В частности, без индексации игрового пространства невозможна программная генерация уровней. Да и вообще, трудно блуждать в потемках без карты :)


( Читать дальше )

Редактор шейдеров Strumpy Shader Editor в Unity

Редактор шейдеров Strumpy для UnityВ движке Unity 3D версии 3.5 нет встроенного редактора материалов, такого, как, например, в UDK. Но на помощь игроделам пришли коллеги по цеху и создали бесплатный инструмент, который позволяет в визуальном редакторе создавать свои собственные шейдеры (shaders) для Unity без необходимости разбираться с языком написания шейдеров. Инструмент этот называется Strumpy Shader Editor (редактор шейдеров Strumpy), который доступен бесплатно в Unity Asset Store.

Однако хороших примеров и документации по Strumpy, к сожалению, нету. Есть одна огромная ветка на форуме Unity, но там чаще всего выкладывают шейдеры с вопросом «Подскажите, где у меня тут ошибка?», поэтому приходится разбираться самому.

Тут я постараюсь немного осветить самые часто задаваемые (мною) вопросы по созданию шейдеров в Strumpy Shader Editor. Это и создание эффекта свечения (Light Shafts — такие красивые лучики), и имитация объемного локализованного тумана (Fog Volume). А начнем мы, пожалуй, с самого простого — создания прозрачного материала.


( Читать дальше )

Экспорт из Blender в Unity: расположение осей

При экспорте персонажа из Blender в Unity обнаружил, что когда я это делал в прошлый раз, то мне просто повезло с правильным расположением осей, и этого вопроса не возникало. Теперь же повторил процесс снова и наткнулся на грабли: импортировал модель из Blender в Unity, повесил на нее стандартный скрипт Third Person Controller, и обнаружил, что персонаж идет задом наперед.

Правильное расположение осей показано на картинке: при этом стандартный контроллер направляет персонажа в нужную сторону (идет лицом вперед).

Экспорт из Blender в Unity

Как видно из рисунка, +Z в Unity соответствует -Y в Blender'е; +X в Unity соответствует -X в Blender'е; и Y в Unity соответствует Z в Blender'е.
Речь идет о прямом использовании .blend-файлов в Unity, т.к. Unity отлично их поддерживает без какой-либо необходимости в экспорте из Blender.

По поводу единиц измерения — они в Blender и Unity совпадают.

Нормали вершин и рендеринг в 3D играх

Швы при освещении модульных конструкций
Занявшись модульным моделированием игровых локаций, я еще в Unity столкнулся с проблемой наложения освещения на блочные конструкции. Проблема в том, что при рендере блоки отчетливо видны, хотя в теории должны образовывать единую конструкцию. Это отчетливо видно на рисунке в верхней части кирпичной стенки.

Все, на что у меня хватило ума в тот раз — это отказаться от использования освещения в Unity и применять Unlit-шейдеры, да и вообще, отказаться от Unity и перейти на UDK:), в котором на первый взгляд таких проблем с модульными конструкциями не наблюдалось. Потом, правда, оказалось, что и в UDK эта проблема имеет место быть, в частности при создании травы. Теперь же хочу поделиться решением этой проблемы, да и вообще, немного погрузиться в теорию нормалей вершин в рендере 3D движков.


( Читать дальше )

Поиск в BSP-дереве: поиск соседей

BSP-ячейка с соседямиВ последнее время очень часто ловлю себя на мысли: «А ведь я это уже когда-то делал!» Начинаешь рыться в исходниках предыдущих проектов, но тщетно! Напишу-ко я сюда :)

Продолжая тему применения BSP-деревьев, хочу рассказать немного о поиске пути в BSP-дереве. В том виде, в котором оно сейчас (каждый элемент содержит массив вложенных элементов), его применение для поиска путей является трудоемким: для каждой следующей точки при построении варианта пути придется делать новый поиск от самого корня дерева, чтобы проверить, есть ли рядом точка.

Поиск соседей в BSP-дереве
Гораздо оптимальнее было бы хранить для каждой точки ссылки на своих соседей. Тогда нам не придется каждый раз для соседней точки начинать поиск сначала. Но что делать с объемом выделяемой памяти? Неужели придется для каждого соседа отводить по целому 32-х разрядному числу? Если учесть, что у каждой ячейки в пространстве может быть 26 соседей, то размер дерева вырастет на ужасающую величину!

Нет! Мы так делать не будем, потому что нам поможет справиться с задачей бинарная упаковка. Далее немного исходников на ActionScript 3. Да, я занимаюсь прототипированием работы BSP-дерева на Flash-е :) Очень, кстати, удобно и наглядно получается.


( Читать дальше )

Применение BSP-деревьев для индексации игровых локаций

BSP-дерево для индексации игровых локаций
Продолжая тему генерации уровней, хочу немного рассказать о индексации игрового пространства при помощи бинарных деревьев. В англоязычных источниках это называется BSP-tree (BSP-дерево), а процесс разбиения пространства называется Binary Space Partitioning (бинарное разбиение пространства).

Бинарные деревья позволяют создавать пространственные базы данных для осуществления быстрого поиска пространственной информации. К типичным задачам, которые решает пространственная база данных, относятся:

  • Поиск ближайших соседей (наиболее близко расположенных объектов)
  • Как следствие первого пункта — поиск путей между объектами
  • Поиск столкновений объектов — определение занятости области карты другими объектами
  • Определение видимости и перекрытия объектов для оптимизации рендеринга


( Далее немного подробнее )

DLLBind и C# в UDK

UDK DLLBind и C#
Думал, что меня это как-то обойдет стороной, ан нет! В общем, назрела необходимость в подключении к UnrealScript через DLLBind внешней DLL-библиотеки. Писать на стандартном C++ как-то совершенно не улыбается, ведь на данный момент есть нечто более развитое и дружелюбное по отношению к программисту, как то C#, например. Кроме того, работая с движком Unity, я более-менее освоил этот язык. Особенно легко на него переходить после знакомства с Java.

Как же заставить UDK DLLBind работать с DLL-библиотеками, написанными на C#? Есть занятная реализация экспорта DLL из C# в пригодную для DLLBind библиотеку, но у меня этот способ не заработал, хоть я и бился над ним два дня. По прошествии двух дней у меня заработал-таки другой способ, который предлагает нам корпорация Microsoft в качестве стандартного решения — это C++/CLI.


( Теперь обо всем по порядку )

Генератор уровней

Генерируемый уровень в UDK
По мере приближения к необходимости вплотную заняться созданием арта для игры, меня все больше пугает объем работ, который предстоит осилить в одиночку. Чтобы сделать игру продолжительностью хотя бы в 2 часа, нужно воссоздать целый город или по крайней мере несколько полноценных кварталов. Можно, конечно, максимально замедлить передвижение персонажа, создав на пути кучу ловушек, головоломок и препятствий, но игрок может устать от однотипного пейзажа местности или просто надоест месить одних и тех же супостатов. Да и ловушек разнообразных тоже столько не придумать… Все упирается в контент.

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



( Читать дальше )
  • 0
  • 15 ноября 2012, 12:55
  • dimanjy
  • 7

Создаем Locomotion систему в UDK

Locomotion системаПродолжая работать над постановкой стоп персонажа в UDK через инверсную кинематику (IK), мы плавно переходим к созданию так называемой Locomotion-системы для UDK. Вечно меня тянет в те области, в которых я вообще не разбираюсь! ;)

В чем же заключаются недостатки обычной IK-системы для постановки стоп?

Во-первых, она работает пост-фактум. Т.е. корректировка стопы осуществляется уже после того, как в анимации стопа поставлена на землю. А учитывая неровность поверхности — поставлена изначально неправильно. Стопа проваливается в землю и только после получения сигнала из анимации корректируется IK-контроллером. Смотрится это, честно говоря, не айс!

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

А в чем же заключается отличие Locomotion-системы от постановки стоп при помощи IK-контроллеров?


( Читать дальше )
  • +1
  • 05 ноября 2012, 14:20
  • dimanjy
  • 1

Полезные инструменты в UDK

Здесь я попробую собрать кое-какие полезные инструменты из UDK, о которых я раньше не знал.

Как посмотреть FPS в UDK?
Есть такой инструмент — Remote Control. Вызывается консольной командой rc или remotecontrol. Вот о нем на официальном сайте:

Также можно подробно следить за расходом памяти и других ресурсов. Кто бы мог подумать, что такое есть в UDK? :)