Другие языки программирования и технологии

Как написать генератор карт?

Не могу придумать как написать генератор 3D кары. Карта представляет собой массив xyz. Каждая ячейка массива хранит в себе 1 элемент карты. На карте должны присутствовать горы не выше определенной высоты, реки, озера, пещеры.
Пока есть две идеи: 1)описать поверхность формулой и потом заполнить все точки снизу этой поверхности. Но вот как это сделать я не знаю. Не знаю как описать такую поверхность.
2) сначала массив заполняется элементами до какого то уровня, после чего в случайных точках создаются горы, которые описываются формулой полушара, тетраэдра/октаэдра и т. п. Реки описывающиеся случайно кривой, озера и пустые области (пещеры). Это более простой метод, но он не будет давать, в конечном итоге, сильно отличающихся красивых рандомных карт.
Не очень понял как это--карта-массив.
Я бы вообще генерировал напрямую, без всяких промежутков, записывая ключевые точки при необходимости.
Создается плоскость. Покрывается рандомными горами, у каждой из них случайное положение, высота, радиус, фокальный сдвиг. Далее создаем рандомные равнины: выбираем случайную точку по x y, радиус, фокальный сдвиг, выравниваем эту область, следим чтобы они не оказывались слишком близко друг к другу, добавляем шум к выравненной области. К горам, кстати, тоже можно шум добавлять. По аналогии делаются озера. Для реки нам потребуется сгенерировать N ключевых точек (генерируются только x и y, z потом корректируется), между каждой парой точек можно добавить Z шумовых точек чтобы река не была совершенно прямой; вокруг линнии, соединяющей точки, надо будет выровнять местность, генератор равнин в помощь. Пещеры генерируются по аналогии с реками, но под землей без выравнивания и ключевые точки рандомизируются по всем координатам.
Ну то есть в начале мы сеем хаос и неразбериху, а потом нужные области сглаживаем, все остальное остается во власти гор. Засчет того, что начинаем с гор, получаем выровненные области на разных высотах.
Касательно начальной генерации гор, можно генерировать их областями, в каждой области со своими параметрами. То есть где-то будут холмы, где-то утесы.
А вам вообще для чего нужно?
Пахнет чем-то вроде майнкрафта, мой алгоритм должен подойти.
Собственно, могу описать еще подробнее, если вы считаете что будет однообразно.
ЖН
Жаныш Назиров
2 473
Лучший ответ
Просто Человек Minecraft писать не пытаюсь) С ним объединяет только воксельная графика)
Я вот примерно тоже самое хотел сделать, как и вы описали..)) Только меня останавливают именно горы) Мне нужно рандомить холмы, каньоны, при этом нужно, чтобы они были разных форм (сфера, продольная и т. п.). Есть идея рандомить горы как и реки - выбирается случайное число точек, которые считаются вершинами одной горы и по ним строится сама гора) Только вот это все нагружает проц)
Просто Человек Появилась идея рандомить картинку с градиентыми цветами (светлые цвета - высоты, темные - низины). После чего по этим цветам выстилать поверхность, а пещеры, озера и реки рандомить так, как вы сказали). Только вот как это сделать я еще не знаю)
Не. Задайте картe сеткой, с определенным шагом. У Вас получатся квадратики, с известными координатами вершин: их Вы можете отрисовывать непосредственно, как плоскости, из своей программы, или через OpenGL, DirectX, и тд.
А заполнять вершины, можно случайными числами, а можно скачивать реальные карты, или рисовать в 3D-редакторах.
Мамутов Ленур
Мамутов Ленур
48 987