Процедурный дом с генераторами комнат

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

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

Еще одно важное отличие от дома состоит в том, что у вас есть определенная ширина и высота, и вам нужно заполнить всю комнату комнатами и залами, тогда как в подземелье есть пустое пространство.

Я думаю, что залы в доме - это нечто между коридором подземелья (вы попадаете в другие комнаты) и пустое пространство в подземелье (оно явно не определено в коде).

Более конкретно, требования:

  • Существует набор предопределенных номеров
    Я не могу создавать стены и двери на лету.
  • Номера могут быть повернуты, но не изменены
    Опять же, поскольку у меня есть предопределенный набор комнат, я могу только вращать их, а не изменять их размер.
  • Размеры дома установлены и должны быть полностью заполнены комнатами (или залами)
    То есть Я хочу заполнить дом 14x20 доступными комнатами, чтобы убедиться, что нет свободного места.

Вот несколько изображений, чтобы сделать это более понятным:

Типичный генератор подземелий  Подземелье без коридоров  Результат генератора дома

Как вы видите, в доме «пустое пространство» по-прежнему доступно, и оно доставит вас из одной комнаты в другую.

Итак, сказав все это, может быть, дом - это действительно действительно плотно упакованное подземелье с коридорами. Или это нечто легче, чем подземелье. Может быть, там что-то есть, и я не нашел его, потому что я действительно не знаю, что искать.

Вот где мне нужна ваша помощь: Можете ли вы дать мне указания о том, как разработать этот алгоритм? Любые мысли о том, какие шаги он предпримет? Если вы создали генератор темницы, как бы вы его модифицировали в соответствии с моими требованиями? Вы можете быть как конкретным, так и универсальным, как вам нравится. На самом деле, я ищу, чтобы выбрать ваши мозги.

72 голоса | спросил pek 23 Jam1000000amWed, 23 Jan 2013 08:39:04 +040013 2013, 08:39:04

4 ответа


15

Итак, вот как я решил эту проблему. Но сначала я хотел бы поблагодарить @Shadows In Rain и @egarcia за их ответы. Они дали мне хорошее направление, которое помогло мне получить некоторые результаты.

Я использовал разбивку пространства Shadows In Rain для создания основного дома, а затем последовал за советом egarcia, чтобы заполнить область номерами.

Разделение пространства было довольно простым, так как 90% кода было выполнено Shadows. Часть «заполнить комнаты» была немного сложнее. Я решил использовать псевдопланирующую систему AI Planning, которая использует A * для надлежащего размещения комнат. Хорошая идея использования планирования вместо A * заключается в том, что предварительные условия помогают значительно сократить пространство поиска.

Вот несколько скриншотов с результатами:

 Фаза формирования этажа Фаза формирования этажа

 Фаза размещения помещения Фаза размещения помещения

«Теперь
Теперь со соединительными дверями!

ответил pek 26 J0000006Europe/Moscow 2013, 17:43:45
47

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

На первом проходе, разделить дом в залах и {кварталах}. Возьмите следующий большой кусок, разделите его на {зал и кусок} или {2 куска и зал между ними}. На каждом шаге поверните направление нарезки на 90 градусов. Остановитесь, когда {больше не осталось больших кусков} или {общая площадь зала достигла предела}.

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

Если какой-либо зал стоит перед гораздо более старым залом, поставьте на него стену (или стену с дверью).

Подключите комнаты с залами напрямую или через другие уже подключенные комнаты.

Например, вы можете увидеть либо полученный вручную результат , либо C ++ - сделано псевдокод . Заключительный снимок:

окончательный снимок

ответил Shadows In Rain 27 Jpm1000000pmSun, 27 Jan 2013 21:20:48 +040013 2013, 21:20:48
24

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

  1. Разработайте коридоры и «большие пространства» для комнат.
  2. Заполните каждое «большое пространство» комнатами.

2 шага

Заполнение больших помещений номерами можно легко сделать, если вы начнете с комнат на границах - у них есть определенные ограничения, например, номера, выходящие в коридор, могут иметь дверь на эту стену, но комнаты, внешние стены "не могут (у них могли бы быть окна, возможно). Номерам «внутри» больших блоков номеров потребуется как минимум один вход.

ответил egarcia 23 Jpm1000000pmWed, 23 Jan 2013 19:30:12 +040013 2013, 19:30:12
10

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

Их работа была разработана вокруг следующих упрощающих предположений:

  • только с жилыми домами
  • нет уровней разделения
  • ограничение формы зданий (конвертов) должно быть многоугольным.
  • нет отверстий в конверте
  • схожая или линейно изменяющаяся толщина огибающей (I.E. без форм песочных часов)
  • только для зданий, нуждающихся в коридорах

Вот краткий обзор их процесса:

  • Найдите скелет для конверта. Затем коридоры располагаются вдоль скелета, исходя из расстояния от оболочки, близости к дверям или лестницам и усилителю; близость к ранее размещенным коридорам.
  • Затем оставшееся некоридорное пространство разбивается на максимально связанные области, каждая с одной непрерывной границей. В некоторых случаях для этого потребуется установка стены.
  • Затем эти регионы разделяются на квартиры, которые пытаются выделить по крайней мере одно окно на квартиру. В некоторых случаях меньшие дивизии сливаются, чтобы избежать чрезмерно небольших квартир. Регионы без окон просто игнорируются.
  • Наконец, квартиры разделены на комнаты с использованием взвешенной диаграммы, аналогичной Вороному, в качестве основы:

    • Весы семян используются, чтобы влиять на размер комнаты. Семена добавляются к дверям и окнам. Добавляются дополнительные семена, обычно одна на желаемую комнату; хотя и не указано явно, похоже, что семена размещены вдоль внешних стен квартиры.
    • Начиная с самой удаленной точки, линия между данным семенем и amp; все остальные точки вычисляются, а затем делятся пополам относительно соответствующих весов конечных точек (EG, если A & B имеет веса 1 и 4, точка деления пополам будет равна 1/4 пути от A до B) , Затем коллекция линий деления пополам вместе с внешней стенкой образует ячейку для семени.
    • Далее, скелет стены S-Space (согласно Peponis et al., 1997) создается путем разбиения области с линиями, исходящими перпендикулярно от средних точек между соседними парами элементов внешней стены (окна или двери).
    • Наконец, стены выбираются из С-пространственного скелета, который «соответствует, насколько возможно, стенкам клеток Вороного».
ответил Pikalek 18 AM00000050000005831 2013, 05:15:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132