Как изготавливаются воксельные двигатели повышенной проходимости?

53

Несколько дней назад я обнаружил нечто, называемое вокселами, и думаю, что они довольно крутые. Но я не знаю, что их порождает. Вы моделируете это в своем программном обеспечении для моделирования или используете что-то вроде карты высот? Я читал в википедии, что воксели похожи на трехмерные или объемные пиксели.

Как я могу взять эти вокселы и сделать их разрушаемыми / копаемыми после того, как я сделаю ландшафт вокселов ?


Я выберу лучший ответ на основе:

  1. код и алгоритмы. предпочтительно на основе C #
  2. объяснения. Я новичок в алгоритмах, но я очень хорошо знаком с объектно-ориентированным программированием.
  3. пошаговые демонстрации. Не только концепция, но и направление.
  4. диаграммы / иллюстрации. Нет, не скриншоты других движков.


Я знаю, что это сложный вопрос. Но спасибо за любую помощь!

Нет, я не пытаюсь сделать клон майнкрафт.


редактировать

Спасибо всем за вашу большую помощь (особенно Ник Виггилл)! Это то, что мне удалось сделать (работа в процессе).

Даниэль Пендергаст
источник
[единство] и C ? Это ... не имеет большого смысла.
Мартин Сойка
Я понимаю C.
Даниэль Пендергаст
8
У вас есть большая вера в сообщество с такой смелой просьбой. Я имею в виду, полный документ о полностью динамической воксельной местности для современного оборудования с хорошим FPS, это должно быть легко, верно? Ну, тема такая широкая и сложная, я сомневаюсь, что вы увидите общее решение, и даже в этом случае оно может быть совершенно бесполезным для вашего случая. Но кто знает, это может быть выполнимо в зависимости от вашего образца для подражания. Вы хотите воксельный ландшафт Crysis 2 или Delta Force ? Может быть, вы делаете клон Майнкрафта или просто нуждаетесь в имитации песка для игры в копание? Определите сферу, пожалуйста.
достаточно
2
Проверьте это промежуточное ПО: forum.unity3d.com/threads/… . В частности, демоверсия
Тетрад
1
В графическом процессоре Gems 3 есть глава о ландшафте вокселей: http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Тамши,

Ответы:

58

Для создания воксельной местности

(а) Распространенным методом является создание карты высот с использованием шума Перлина. Карта высот в основном представляет собой монохромное изображение, представляющее разную высоту в зависимости от темноты или яркости его пикселей.

введите описание изображения здесь

Вы посмотрите на отдельные пиксели в этой карте высот, чтобы создать «стопки» вокселей вплоть до разных высот (ось 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 для деформации местности.

инженер
источник
Изменения в вики сообщества постоянны, отменить их невозможно. Вам нужно будет удалить и воссоздать ваш ответ (конечно, пожертвовав имеющимися у вас голосами)
Джесси Дорси
meta.stackexchange.com/questions/2974/… утверждает, что модераторы могут удалить его. Не знаю, изменились ли вещи, хотя. Спасибо, что изучили это так или иначе.
инженер
1
Пойди разберись, будь осторожен в следующий раз.
Джесси Дорси
2
Первый - это дискретное пространство, где сущности могут лежать только непосредственно в клетке. Как идеально расположенные фигуры на шахматной доске, они не могут лежать «между» ячейками или перекрывать границы. Принимая во внимание, что непрерывное пространство встречается в большинстве физических движков, т.е. оно основано на числах с плавающей запятой и, следовательно, является непрерывным, а не квантованным. Ваша сущность может сидеть в любой произвольной позиции в выбранном вами пространстве - как в реальной жизни.
инженер
1
Текстурирование неявно. Реальные воксели, независимо от того, основаны они на сетке или нет, имеют чистый цвет. Вышеупомянутые подходы просто создают более реалистичные детали и позволяют использовать комбинированный сеточный подход (google Unity VoxelForm). Чем мельче ваши воксели, тем мельче детализация текстур. Пример: смоделируйте русло реки как камень (серый). Преобразуйте каждый пиксель на расстоянии x от поверхности в песок, установив для этих вокселей значение material = "sand"; затем они могут быть представлены как песочного цвета. Кроме того, это также может повлиять на их физическую интерактивность, поэтому песок может быть перемещен водой или выкопан.
инженер
33

Лучший способ создать интересную воксельную местность - использовать карту плотности шума Perlin. Вместо использования 2D-карты шума Perlin, определяющей высоту трехмерного мира, используйте 3D-карту шума Perlin. Взвесьте карту так, чтобы значения ближе к дну были более твердыми, а значения ближе к вершине определенно были бы воздушными. Это дает вам высоту вашего мира, но также учитывает выступы и пещеры, подобные ландшафту Майнкрафта , как показывает этот вид сбоку участка местности:

Мир с свесами

Отсюда вы можете проверить плавающие острова или добавить пещерные системы, используя фрактальный шум:

Мир с пещерной системой

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

dlras2
источник
4

Другие ответы здесь превосходны, но я выбрал немного другой подход.

Я создаю среду в инструменте моделирования (3DSMAX) и строю из него разреженную октре. Каждый кубический непустой листовой узел является вокселем. Во время рендеринга я использую raycasting (реализованный в HLSL), чтобы определить, какой воксел занимает какой пиксель, и задаю для пикселя цвет, сохраненный в узле, который я рассчитал при генерации дерева путем усреднения значений текстуры из исходной модели.

Это дает вам много приятных преимуществ - обнаружение столкновений для бесплатного, изменяемого LOD, выборка пространства просмотра и т. Д. - и, кроме raycaster, - его легко реализовать.

К сожалению, практически невозможно опубликовать образец кода с телефона.

3Dave
источник
+1 за альтернативу. Хотя это не невозможно реализовать с разумной производительностью, плюсы намного перевешивают минусы. Voxel raytracing накладывает огромный расход на GPU. Арифметика и условные обозначения, необходимые для этого, очень дороги, когда те же самые циклы графического процессора могут применять ряд впечатляющих эффектов экранного пространства, например. SSAO. Самая большая проблема заключается в том, что лучевое вещание выглядит лучше всего с несколькими отражениями, обнаруживаемыми в радиозависимости, - нецелесообразно для сцены, которая состоит из миллионов или миллиардов вокселей и где каждый сегмент луча требует значительных усилий для отскока и компоновки.
инженер
... Вот почему я упомянул скайтинговое радиовещание только в качестве отступления в своем ответе (VoxLap) - даже это трудно реализовать хорошо. Если вы можете добиться работоспособности вертикальной развертки, затраты на порядок меньше, чем трассировка лучей на пиксель, поскольку вы сократили размерность процесса рендеринга с 3D до 2D. Я до сих пор придерживаюсь этого подхода, хотя он исключает возможность применения сложных световых решений с вашим традиционным RTRT.
инженер