Несколько дней назад я обнаружил нечто, называемое вокселами, и думаю, что они довольно крутые. Но я не знаю, что их порождает. Вы моделируете это в своем программном обеспечении для моделирования или используете что-то вроде карты высот? Я читал в википедии, что воксели похожи на трехмерные или объемные пиксели.
Как я могу взять эти вокселы и сделать их разрушаемыми / копаемыми после того, как я сделаю ландшафт вокселов ?
Я выберу лучший ответ на основе:
- код и алгоритмы. предпочтительно на основе C #
- объяснения. Я новичок в алгоритмах, но я очень хорошо знаком с объектно-ориентированным программированием.
- пошаговые демонстрации. Не только концепция, но и направление.
- диаграммы / иллюстрации. Нет, не скриншоты других движков.
Я знаю, что это сложный вопрос. Но спасибо за любую помощь!
Нет, я не пытаюсь сделать клон майнкрафт.
редактировать
Спасибо всем за вашу большую помощь (особенно Ник Виггилл)! Это то, что мне удалось сделать (работа в процессе).
procedural-generation
terrain-rendering
voxels
csg
Даниэль Пендергаст
источник
источник
Ответы:
Для создания воксельной местности
(а) Распространенным методом является создание карты высот с использованием шума Перлина. Карта высот в основном представляет собой монохромное изображение, представляющее разную высоту в зависимости от темноты или яркости его пикселей.
Вы посмотрите на отдельные пиксели в этой карте высот, чтобы создать «стопки» вокселей вплоть до разных высот (ось z) в разных (x, y) местах в соответствии с яркостью этого пикселя в изображении карты высот. Поскольку изображение шума Перлина является гладким (без острых краев света на темном фоне), в результате вы получите плавно вращающийся ландшафт.
(б) Вы можете построить его постепенно, создавая ландшафт из разных многогранников. Создайте многогранную векторную фигуру, которая приближается к нужной вам форме вокселя. Используя любой метод 3D-точка-многогранник (чаще всего, точка-выпуклый корпус), проверьте, какие точки вашей сетки мира попадают в этот многогранный объем. Например, определите пирамиду в пространстве. После проверки каждой точки в локальной области вашего мирового пространства по этому пирамидальному объему, вы будете знать, какие точки попадают в него, и вы можете установить эти ячейки как «настоящие», то есть они станут вокселями, а не пустым пространством. Теперь у вас есть воксельная пирамида в вашем пространстве. Таким образом, вы можете продолжать добавлять фигуры любого вида, пока не сформируете ландшафт.
(c) (Действительно так же, как и b ) Написать инструмент моделирования. Воксатрон покажет, как это будет выглядеть. Это просто создание воксельных форм в замещающем мире (редактор), а затем их импортирование в реальный игровой мир времени выполнения. Я полагаю, что у Voxlap был первый редактор с открытым исходным кодом для вокселей. Вы можете размещать отдельные воксели или использовать «кисть» вокселей с различными формами / объемами для рисования вокселей в вашем мире.
Что вам нужно, чтобы создать свою собственную игру на основе вокселей
Я включил этот раздел, потому что дорога с вокселями не из легких, по крайней мере, в настоящее время. В последнее время крупные игроки снова проводят много исследований в области воксельных движков в области рендеринга и физических приложений.
Простота может быть проблемой, потому что динамическое построение мира из необработанных вокселей является процедурным подходом к построению мира, и это не просто по своей природе . Извините, здесь будет несколько технических терминов. Написание воксельного движка - довольно серьезное мероприятие, требующее знаний во многих областях разработки игрового движка, особенно с точки зрения пространственных понятий, и это означает понимание математики трехмерного вектора, матриц и базового исчисления до некоторого разумного уровня.
Сказав это, ваше «поколение воксельной местности» требует контекста для работы, так как воксельные движки не очень широко распространены. Перейдем к базовому описанию того, как работает воксельный движок.
Воксели - это основные строительные блоки вашего мира. Их позиции определяются целочисленной трехмерной сеткой (массивом), а не непрерывным пространством с плавающей точкой (как используется в векторных трехмерных играх). Это будут «атомы» вашего мира. Они могут иметь высоту 3 фута, как в играх, подобных Minecraft, или они могут быть меньше, чем может видеть глаз вашего виртуального персонажа, если только они не сгруппированы вместе в большом количестве - немного больше похоже на молекулы. Есть два вида:
В любом случае, ваш подход к манипулированию вокселями в вашем мире почти такой же, как изложено ниже.
Для создания и перемещения объектов в вашем мире вам понадобятся математические инструменты, упомянутые выше. Например, чтобы создать стену: Постройте коробку соответствующих размеров в трехмерном пространстве, используя векторы. Используйте матричную математику, чтобы преобразовать вашу коробку в нужное вам вращение и положение в трехмерном мире (в непрерывном векторном пространстве). Для механизма вокселей дополнительным шагом является использование алгоритма трехмерной точки в многограннике, чтобы определить, какие из ваших вокселей попадают в это повернутое пространство.
По сути, именно так вы бы построили большинство объектов в своем мире. Кроме того, вы можете написать свои собственные инструменты для «моделирования» персонажа, как, скажем, Maya или 3DS Max. Но так как вы моделируете свой персонаж из вокселей, а не точек, ребер и граней, ваши методы будут существенно другими. Если вы решили затем повернуть эти объекты в своем мире, вам потребуется аналогичным образом использовать матричные преобразования для этого.
Разрушаемая местность так же проста, как или удаление одного вокселя за раз в соответствии с выбранным вами методом, или использование операций CSG (Constructive Solid Geometry) на больших объемах вокселей для их удаления в соответствии с каким-то предопределенным объемом; Например, если вы стреляете лазерным лучом через камень, вы можете использовать цилиндрический объем, чтобы вычесть вокселы, когда луч проходит через камень. CSG является относительно простым процессом, использующим трехмерные пространственные сетки, которые формируют ваш воксельный мир, и проверкой каждой ячейки в разделе базовой сетки (в данном случае скалы) по другой сетке (в данном случае, лазерному лучу)
Чтобы материальные «потоки» (как намекал Вигил в своем комментарии к песку) вам понадобятся для изучения динамики жидкости и клеточных автоматов. Они были использованы автором Dwarf Fortress Тарном Адамсом в том, что по сути также является воксельным миром (хотя в этом случае вокселы намного больше, сравнимые с Dungeon Keeper, принцип остается тем же). Это актуальные темы, и они не являются необходимыми для воксельных движков, как это определено, поэтому я оставлю это как «заглушку» для ваших собственных исследований.
CSG и динамика жидкости подводят меня, наконец, к оптимизации. Воксельные движки, которые в настоящее время разрабатываются, почти исключительно используют разреженные воксельные октреи (SVO), что является методом разделения пространства вокселей на различные разрешения, как показано в этом видео, демонстрирующем грядущий движок Atomontage. Использование октодеревьев / SVO является скорее необходимостью, чем выбором оптимизации из-за накладных расходов, связанных с обработкой одной массивной, однородной сетки. Октрое дерево - это, по сути, дерево (ориентированный ациклический граф), где каждый узел имеет 8 или ноль дочерних узлов в зависимости от того, содержит ли пространство, которое он представляет, какие-либо физические тома. Диаграммы, показывающие, как октреи делят пространство для формирования вокселей, приведены здесь .
Лучшая воксельная реализация с открытым исходным кодом, о которой я знаю, - это Voxlap Engine Кена Сильвермана , который использовался для Voxelstein3D. Он написан на C ++ и реализует операции CSG для деформации местности.
источник
Лучший способ создать интересную воксельную местность - использовать карту плотности шума Perlin. Вместо использования 2D-карты шума Perlin, определяющей высоту трехмерного мира, используйте 3D-карту шума Perlin. Взвесьте карту так, чтобы значения ближе к дну были более твердыми, а значения ближе к вершине определенно были бы воздушными. Это дает вам высоту вашего мира, но также учитывает выступы и пещеры, подобные ландшафту Майнкрафта , как показывает этот вид сбоку участка местности:
Отсюда вы можете проверить плавающие острова или добавить пещерные системы, используя фрактальный шум:
Приведенные выше фотографии и идеи пещерной системы взяты из этого отличного поста в блоге . Вы можете узнать все о шуме Perlin здесь , и есть некоторый пример кода, чтобы вы начали здесь .
источник
Другие ответы здесь превосходны, но я выбрал немного другой подход.
Я создаю среду в инструменте моделирования (3DSMAX) и строю из него разреженную октре. Каждый кубический непустой листовой узел является вокселем. Во время рендеринга я использую raycasting (реализованный в HLSL), чтобы определить, какой воксел занимает какой пиксель, и задаю для пикселя цвет, сохраненный в узле, который я рассчитал при генерации дерева путем усреднения значений текстуры из исходной модели.
Это дает вам много приятных преимуществ - обнаружение столкновений для бесплатного, изменяемого LOD, выборка пространства просмотра и т. Д. - и, кроме raycaster, - его легко реализовать.
К сожалению, практически невозможно опубликовать образец кода с телефона.
источник