Рубрика «процедурная генерация» - 4

В этом туториале я расскажу о двух терминах, которые используются мной для описания процедурных генераторов: пространство генерации (generative space) и пространство возможностей (possibility space). Мы дадим определения этим двум терминам, а затем рассмотрим интерактивные примеры, чтобы понять разницу между ними. Эти термины действительно полезны для описания процедурного генератора и для того, чтобы понимать разницу между двумя генераторами. Давайте приступим!

Пространство генерации и пространство возможностей - 1

Представьте огромную книгу, в которой представлен скриншот каждого отдельного мира Minecraft. Каждый скриншот помечен случайным seed, уникальным числом, которое можно ввести в Minecraft и сгенерировать этот мир. На первой странице представлен мир, порождённый из seed = 0, на следующей — мир из seed = 1, и так далее. В целом генератор миров Minecraft содержит 264 случайных порождающих значений, и это огромное число: игра может сгенерировать 18 446 744 073 709 551 616 миров. Каждый раз, когда вы нажимаете на «New World», на основе одного из этих seed создаётся мир. Число 264 — это размер пространства генерации Minecraft, множество всего, что игра может сгенерировать.

Пространство генерации и пространство возможностей - 2

Теперь представьте, что мир Minecraft состоит только из обычной травы, бесконечно распространяющейся во всех направлениях. Под ней нет ни пещер, ни камня, нет деревьев и холмов, нет животных. Просто один слой тайлов травы. Кроме того, что это очень скучно, такой мир никогда не будет сгенерирован в Minecraft (если не использовать моддинг). Мы можем представить его, можем описать его, даже открыть Minecraft и создать его сами вручную — но Minecraft не может сгенерировать его.Читать полностью »

image

7 сентября 2008 года Maxis выпустила одну из самых амбициозных игр своего времени — Spore.

Однопользовательская «игра в бога» в песочнице была поначалу воспринята со смесью одобрения и критики: многие фанаты были расстроены тем, что она не соответствовала ожиданиям, данным в демо-версиях из доклада Уилла Райта на GDC 2005 и различных показов на E3. Но со временем её признали проектом, ставшим пионером процедурной генерации, который даже спустя десять лет имеет активную базу игроков.

В процессе разработки команда Maxis разрослась от идеи в голове Уилла Райта до более 100 разработчиков; каждый дизайнер, касавшийся отдельных аспектов Spore, знал, что это нечто потрясающее. Даже если первоначальной концепции придётся в течение работы измениться.

«Когда я впервые говорил с ним, он хотел, чтобы эта игра была об уравнении Дрейка. О невероятности нашей вселенной», — рассказывает мне по Skype ведущий дизайнер Крис Тротье. «Он хотел, чтобы игроки прошли все эти этапы огромных неудач, чтобы они поняли, насколько невероятно то, что мы появились. Довольно быстро он отказался от этой идеи, но она даёт понять, насколько масштабной задумывалась игра с самого начала».

Десять лет спустя участники проекта Spore хотят рассказать о сложностях, важных моментах и опыте разработки столь влиятельной игры. В статье представлены цитаты из интервью, проведённых по отдельности с ведущим дизайнером Крис Тротье, техническим художником Кейт Комптон, ведущим дизайнером Стоуном Либранде, инженером ПО Дейвом Кулибой, ведущим инженером геймплея Дэном Московицем и помощником продюсера Гийомом Пьером. (К сожалению, Уилл Райт от нас ускользает...)
Читать полностью »

image

Алгоритм Wave Function Collapse генерирует битовые изображения, локально подобные входному битовому изображению.

Локальное подобие означает, что

  • (C1) Каждый паттерн NxN пикселей в выходных данных должен хотя бы раз встречаться во входных данных.
  • (Слабое условие C2) Распределение паттернов NxN во входных данных должно быть подобным распределению паттернов NxN в значительно большом количестве наборов выходных данных. Другими словами, вероятность встречи определённого паттерна в выходных данных должна быть близка к плотности таких паттернов во входных данных.

Читать полностью »

image

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

Введение

Алгоритм был написан как часть работы на получение степени бакалавра и основан на статье Ma et al (2014). Целью работы было ускорение алгоритма и дополнение его новыми функциями. Я вполне доволен результатом, потому что мы сделали алгоритм достаточно быстрым, чтобы использовать его во время выполнения игры. После завершения бакалаврской работы мы решили превратить её в статью и отправить на конференцию Game-ON 2018.

Алгоритм

Для создания уровня игры алгоритм получает в качестве входных данных набор полигональных строительных блоков и граф связности уровня (топологию уровня). Узлы графа обозначают комнаты, а рёбра определяют связи между ними. Цель алгоритма — назначить каждому узлу графа форму и расположение комнаты таким образом, чтобы никакие две формы комнат не пересекались, и каждая пара соседних комнат могла соединяться дверьми.
Читать полностью »

Последние несколько недель я работал над реализацией алгоритма Форчуна на C++. Этот алгоритм берёт множество 2D-точек и строит из них диаграмму Вороного. Если вы не знаете, что такое диаграмма Вороного, то взгляните на рисунок:

Алгоритм Форчуна, подробности реализации - 1

Для каждой входной точки, которая называется «местом» (site), нам нужно найти множество точек, которые ближе к этому месту, чем ко всем остальным. Такие множества точек образуют ячейки, которые показаны на изображении выше.

В алгоритме Форчуна примечательно то, что он строит такие диаграммы за время $O(nlog n)$ (что оптимально для использующего сравнения алгоритма), где $n$ — это количество мест.

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

Как обычно, код выложен на github, а все использованные мной справочные материалы перечислены в конце статьи.
Читать полностью »

image

Эйвинд Фиксдаль (Øyvind Fiksdal) поделился подробностями процедурного процесса создания дома и ландшафта в Houdini и рассказал о преимуществах такого подхода.

Введение

Меня зовут Эйвинд Фиксдаль, я норвежский художник, раньше работавший в основном с традиционным исскуством. Ближе к тридцати годам я решил полностью сосредоточиться на 3D и поступил на двухлетние курсы 3D и анимации. Спустя какое-то время я устроился на работу в одно из крупнейших рекламных агентств в Норвегии.

Работа в рекламной отрасли открывала все двери, но работа на одну компанию не дала мне возможностей реализации, поэтому я стал фрилансером. Через два года фриланса мы с бывшим коллегой решили объединиться и создать компанию под названием Trollskog.
Читать полностью »

Вот в этом комменте я похвастался, что в своё время написал программу, создающую рендер «пристойно выглядящего» леса в двести строк кода. К сожалению, реальность оказалась немного большей по размеру — раскопанные исходники содержат примерно 2100 строк кода, из которых где-то 700 — комментарии, мысли вслух, старый отброшенный код и попытки документации методов. Размер исполняемого файла SWF, впрочем, оказался 13112 байт.

Началось всё с того, что на форуме Kongregate.com, где я в то время активно тусил, один из участников предложил посостязаться в процедурной генерации чего-либо, первой темой стал «Лес».

Как вырастить лес на Actionscript3-Flash в несколько* строк кода - 1
Читать полностью »

Части 1-3: сетка, цвета и высоты ячеек

Части 4-7: неровности, реки и дороги

Части 8-11: вода, объекты рельефа и крепостные стены

Части 12-15: сохранение и загрузка, текстуры, расстояния

Части 16-19: поиск пути, отряды игрока, анимации

Части 20-23: туман войны, исследование карты, процедурная генерация

Часть 24: регионы и эрозия

  • Добавляем границу из воды вокруг карты.
  • Разделяем карту на несколько регионов.
  • Применяем эрозию, чтобы срезать обрывы.
  • Перемещаем сушу, чтобы сгладить рельеф.

В предыдущей части мы заложили основы процедурной генерации карт. На этот раз мы ограничим места возможного появления суши и воздействуем на неё эрозией.

Этот туториал создан в Unity 2017.1.0.

Карты из шестиугольников в Unity: круговорот воды, эрозия, биомы, цилиндрическая карта - 1

Разделяем и сглаживаем сушу.
Читать полностью »

Части 1-3: сетка, цвета и высоты ячеек

Части 4-7: неровности, реки и дороги

Части 8-11: вода, объекты рельефа и крепостные стены

Части 12-15: сохранение и загрузка, текстуры, расстояния

Части 16-19: поиск пути, отряды игрока, анимации

Часть 20: туман войны

  • Сохраняем данные ячеек в текстуре.
  • Изменяем типы рельефа без триангуляции.
  • Отслеживаем видимость.
  • Затемняем всё невидимое.

В этой части мы добавим на карту эффект тумана войны.

Теперь серия будет создаваться на Unity 2017.1.0.

Карты из шестиугольников в Unity: туман войны, исследование карты, процедурная генерация - 1

Теперь мы видим, что можем и не можем видеть.
Читать полностью »

image

Привет! В прошлой статье «бесконечный узор на основе простых чисел» я рассказал про алгоритм, который позволяет генерировать бесконечные красивые узоры, похожие то ли на инопланетные рисунки, то ли на нечто технологическое, подобно устройству микросхем. Однако, алгоритм для генерирования 2D узоров можно так же использовать и для создания мелодий. Подробнее под катом.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js