Вы можете использовать шумовые функции для генерации случайных высот. Самым простым из них является значение шума, которое работает точно так же, как ваше описание: вы генерируете случайные целые высоты, а затем интерполируете высоты между ними. Наиболее часто используемый метод интерполяции - это отображение кубической S-кривой:
Предположим, у вас есть высота h0
в точке x0
и высота h1
в точке x1
. Затем, чтобы получить высоту в любой точке x
( x0<=x<=x1
), вы используете
t = (x-x0)/(x1-x0); // map to [0,1] range
t = t*t*(3 - 2*t); // map to cubic S-shaped curve
h = h0+t*h1;
Полученные таким образом высоты будут плавными, случайными, но не очень интересными. Чтобы сделать вашу местность лучше, вы можете использовать фрактальный шум . Это работает так: предположим, что вы сгенерировали функцию, h(x)
которая возвращает высоту по заданной координате (используя метод выше). Эта функция имеет частоту, определяемую частотой исходной высоты интергера. Чтобы сделать из него фрактал, вы объединяете функции с несколькими частотами:
fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);
В этом примере я комбинирую четыре частоты - оригинальную, двойную, 4-кратную и 8-кратную оригинальную, с более высокими частотами при меньшем весе. Теоретически, фракталы уходят в бесконечность, но на практике требуется лишь несколько терминов. В fbm
формуле обозначается дробное броуновское движение - так называется эта функция.
Это мощная техника. Вы можете играть с умножителем частоты, с весами разных частот, или добавить некоторые функции для искажения шума. Например, чтобы получить более «ребристое» ощущение, h(x)
его можно изменить на 1-abs(h(x))
(при условии -1<=h(x)<=1
)
Однако, хотя все это хорошо, у этой техники есть серьезное ограничение. При подходе, основанном на «высотной линии», вы никогда не можете иметь «выступы» на местности. И я думаю, что это очень хорошая особенность в игре, похожей на Moon Buggy.
Добавление хороших свесов - сложная задача. Одна вещь, о которой я могу подумать - вы можете начать с фрактальной «линии высоты» и «тесселяции» ее в виде серии сплайнов или кривых Безье. Тогда линия местности будет определяться несколькими «ключевыми точками». Примените некоторый джиттер к этим ключевым точкам - это приведет к случайной деформации рельефа, вероятно, формируя некоторые интересные формы. Тем не менее, самопересечения местности могут стать проблемой при таком подходе, особенно при большом количестве дрожания.
Моя идея состоит в том, чтобы создать сглаженную шумовую функцию. Сначала с помощью метода intNoise (int), который возвращает «случайный» тип int, но который зависит от входных данных. Если вы используете один и тот же вход дважды, результат будет одинаковым.
Затем используйте метод сглаживания, чтобы создать floatNoise (float), который использует два целых числа вокруг ввода для построения случайного значения.
Затем используйте позицию X в качестве входа и Y в качестве выхода. Результатом будет сглаженная кривая, но со случайной высотой.
источник