Настройка генерации карты высот для шестиугольных сеток

В настоящее время я работаю над небольшим проектом просто для развлечения. Это приложение C++, WinAPI, использующее OpenGL.

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

На данный момент мое приложение состоит из VBO, который содержит информацию о вершинах и картах высот. Карта высот создается с использованием алгоритма смещения средней точки (ромб-квадрат).

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

Через несколько дней все начинает собираться, и я добавил выбор мышью, который реализуется путем рендеринга каждого шестиугольника в сетке уникальным цветом, а затем выборки данной позиции мыши в этом FBO для определения идентификатора выбранного ячейка (видна в правом верхнем углу скриншота ниже).

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

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

Итак, наконец, подойдя к моей точке зрения, есть ли:

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

EDIT: для тех, кто ищет информацию о том, как сделать точки копланарными вот отличное объяснение.

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

Чтобы было ясно, я не пытаюсь создать плоскую гексагональную сетку с приподнятыми краями или платформами (как показано ниже).

здесь)

Я хотел бы, чтобы вся геометрия соединилась и привела к следующему фрагменту.

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

Любые отзывы приветствуются, я использую это как учебное упражнение, поэтому, пожалуйста, все комментарии приветствуются!


person henryprescott    schedule 22.12.2012    source источник


Ответы (1)


Это зависит от того, чего вы на самом деле хотите и что вы подразумеваете под «более контролируемым».

Вы хотите иметь возможность сказать "будет гора по координатам [11, -127] с радиусом 20"? Сложность этого зависит от того, как далеко вы хотите зайти. Если вам нужны только горы, то достаточно радиальных градиентов (просто добавьте значения градиента к значениям шума). Но если вам нужны более сложные формы, вас ждет угощение.

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

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

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

Рассмотрим функцию, которая отображает фиолетовую линию на синюю кривую — она подчеркивает расположенные ниже высоты, а также очень высокие высоты, но делает переход между ними более крутым (этот пример — просто функция косинуса, делая кривую менее гладкой, трансформация более заметна).

Преобразование значения косинуса

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

Косинусное преобразование II

«резкость» кривой можно легко модулировать с помощью мощности (что делает эффект более драматичным) или квадратного корня (уменьшая эффект).

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

Реализация этого на самом деле чрезвычайно проста (особенно если вы используете функцию косинуса) — просто примените функцию к каждому пикселю на карте. Если функция не настолько математически тривиальна, таблицы поиска работают нормально (при кубической интерполяции между табличными значениями линейная интерполяция создает артефакты).

Еще несколько простых методов «геймификации» местности со случайным шумом можно найти в этой статье: «Realtime Синтез эродированных Фрактальная местность для использования в компьютерных играх".

Удачи с вашим проектом

person Matěj Zábský    schedule 23.12.2012
comment
Спасибо, вы заставили меня о многом задуматься. Очень признателен! - person henryprescott; 24.12.2012