Для создания воксельной местности
(а) Распространенным методом является создание карты высот с использованием шума Перлина. Карта высот в основном представляет собой монохромное изображение, представляющее разную высоту в зависимости от темноты или яркости его пикселей.
Вы посмотрите на отдельные пиксели в этой карте высот, чтобы создать «стопки» вокселей вплоть до разных высот (ось z) в разных (x, y) местах в соответствии с яркостью этого пикселя в изображении карты высот. Поскольку изображение шума Перлина является гладким (без острых краев света на темном фоне), в результате вы получите плавно вращающийся ландшафт.
(б) Вы можете построить его постепенно, создавая ландшафт из разных многогранников. Создайте многогранную векторную фигуру, которая приближается к нужной вам форме вокселя. Используя любой метод 3D-точка-многогранник (чаще всего, точка-выпуклый корпус), проверьте, какие точки вашей сетки мира попадают в этот многогранный объем. Например, определите пирамиду в пространстве. После проверки каждой точки в локальной области вашего мирового пространства по этому пирамидальному объему, вы будете знать, какие точки попадают в него, и вы можете установить эти ячейки как «настоящие», то есть они станут вокселями, а не пустым пространством. Теперь у вас есть воксельная пирамида в вашем пространстве. Таким образом, вы можете продолжать добавлять фигуры любого вида, пока не сформируете ландшафт.
(c) (Действительно так же, как и b ) Написать инструмент моделирования. Воксатрон покажет, как это будет выглядеть. Это просто создание воксельных форм в замещающем мире (редактор), а затем их импортирование в реальный игровой мир времени выполнения. Я полагаю, что у Voxlap был первый редактор с открытым исходным кодом для вокселей. Вы можете размещать отдельные воксели или использовать «кисть» вокселей с различными формами / объемами для рисования вокселей в вашем мире.
Что вам нужно, чтобы создать свою собственную игру на основе вокселей
Я включил этот раздел, потому что дорога с вокселями не из легких, по крайней мере, в настоящее время. В последнее время крупные игроки снова проводят много исследований в области воксельных движков в области рендеринга и физических приложений.
Простота может быть проблемой, потому что динамическое построение мира из необработанных вокселей является процедурным подходом к построению мира, и это не просто по своей природе . Извините, здесь будет несколько технических терминов. Написание воксельного движка - довольно серьезное мероприятие, требующее знаний во многих областях разработки игрового движка, особенно с точки зрения пространственных понятий, и это означает понимание математики трехмерного вектора, матриц и базового исчисления до некоторого разумного уровня.
Сказав это, ваше «поколение воксельной местности» требует контекста для работы, так как воксельные движки не очень широко распространены. Перейдем к базовому описанию того, как работает воксельный движок.
Воксели - это основные строительные блоки вашего мира. Их позиции определяются целочисленной трехмерной сеткой (массивом), а не непрерывным пространством с плавающей точкой (как используется в векторных трехмерных играх). Это будут «атомы» вашего мира. Они могут иметь высоту 3 фута, как в играх, подобных Minecraft, или они могут быть меньше, чем может видеть глаз вашего виртуального персонажа, если только они не сгруппированы вместе в большом количестве - немного больше похоже на молекулы. Есть два вида:
- Воксели на основе кубической сетки ( пример ) - это более новый вид, используемый для простоты и легко используемый в сочетании с современной технологией графики. Используется в таких играх, как MineCrat и Dungeon Keeper.
- Точка вокселей ( пример , пример ) - исходный воксель. Каждый из них представляет собой отдельную, встречную точку в пространстве, хотя он может быть окружен сферическим ограничивающим объемом. Они проще, так что вы можете иметь их намного больше в своем мире, и таким образом вы можете сделать их меньше, что, как правило, выгодно. Две игры, которые использовали их, были Comanche и римейк 1990-х годов Lords of Midnight.
В любом случае, ваш подход к манипулированию вокселями в вашем мире почти такой же, как изложено ниже.
Для создания и перемещения объектов в вашем мире вам понадобятся математические инструменты, упомянутые выше. Например, чтобы создать стену: Постройте коробку соответствующих размеров в трехмерном пространстве, используя векторы. Используйте матричную математику, чтобы преобразовать вашу коробку в нужное вам вращение и положение в трехмерном мире (в непрерывном векторном пространстве). Для механизма вокселей дополнительным шагом является использование алгоритма трехмерной точки в многограннике, чтобы определить, какие из ваших вокселей попадают в это повернутое пространство.
По сути, именно так вы бы построили большинство объектов в своем мире. Кроме того, вы можете написать свои собственные инструменты для «моделирования» персонажа, как, скажем, Maya или 3DS Max. Но так как вы моделируете свой персонаж из вокселей, а не точек, ребер и граней, ваши методы будут существенно другими. Если вы решили затем повернуть эти объекты в своем мире, вам потребуется аналогичным образом использовать матричные преобразования для этого.
Разрушаемая местность так же проста, как или удаление одного вокселя за раз в соответствии с выбранным вами методом, или использование операций CSG (Constructive Solid Geometry) на больших объемах вокселей для их удаления в соответствии с каким-то предопределенным объемом; Например, если вы стреляете лазерным лучом через камень, вы можете использовать цилиндрический объем, чтобы вычесть вокселы, когда луч проходит через камень. CSG является относительно простым процессом, использующим трехмерные пространственные сетки, которые формируют ваш воксельный мир, и проверкой каждой ячейки в разделе базовой сетки (в данном случае скалы) по другой сетке (в данном случае, лазерному лучу)
Чтобы материальные «потоки» (как намекал Вигил в своем комментарии к песку) вам понадобятся для изучения динамики жидкости и клеточных автоматов. Они были использованы автором Dwarf Fortress Тарном Адамсом в том, что по сути также является воксельным миром (хотя в этом случае вокселы намного больше, сравнимые с Dungeon Keeper, принцип остается тем же). Это актуальные темы, и они не являются необходимыми для воксельных движков, как это определено, поэтому я оставлю это как «заглушку» для ваших собственных исследований.
CSG и динамика жидкости подводят меня, наконец, к оптимизации. Воксельные движки, которые в настоящее время разрабатываются, почти исключительно используют разреженные воксельные октреи (SVO), что является методом разделения пространства вокселей на различные разрешения, как показано в этом видео, демонстрирующем грядущий движок Atomontage. Использование октодеревьев / SVO является скорее необходимостью, чем выбором оптимизации из-за накладных расходов, связанных с обработкой одной массивной, однородной сетки. Октрое дерево - это, по сути, дерево (ориентированный ациклический граф), где каждый узел имеет 8 или ноль дочерних узлов в зависимости от того, содержит ли пространство, которое он представляет, какие-либо физические тома. Диаграммы, показывающие, как октреи делят пространство для формирования вокселей, приведены здесь .
Лучшая воксельная реализация с открытым исходным кодом, о которой я знаю, - это Voxlap Engine Кена Сильвермана , который использовался для Voxelstein3D. Он написан на C ++ и реализует операции CSG для деформации местности.