Вы можете использовать шумовые функции для генерации случайных высот. Самым простым из них является значение шума, которое работает точно так же, как ваше описание: вы генерируете случайные целые высоты, а затем интерполируете высоты между ними. Наиболее часто используемый метод интерполяции - это отображение кубической 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.
Добавление хороших свесов - сложная задача. Одна вещь, о которой я могу подумать - вы можете начать с фрактальной «линии высоты» и «тесселяции» ее в виде серии сплайнов или кривых Безье. Тогда линия местности будет определяться несколькими «ключевыми точками». Примените некоторый джиттер к этим ключевым точкам - это приведет к случайной деформации рельефа, вероятно, формируя некоторые интересные формы. Тем не менее, самопересечения местности могут стать проблемой при таком подходе, особенно при большом количестве дрожания.