Создание холмов разной высоты и ширины, как Tiny Wings? - PullRequest
1 голос
/ 09 января 2012

Как я могу создавать холмы разной высоты и ширины, как Tiny Wings? Прямо сейчас я использую sin (), но он, очевидно, генерирует одинаковые холмы, повторяющиеся во веки веков.

В чем секрет?

Спасибо!

Ответы [ 3 ]

1 голос
/ 09 января 2012

Симплексный шум или любая другая функция 2d шума, которая выглядит так, как вам нравится.

1 голос
/ 09 января 2012

Конечно, не эксперт по процедурной генерации - но вы можете попробовать аддитивно комбинировать несколько случайно генерируемых функций sin / cos с разными периодами.Чем больше вы добавляете, тем больше будет казаться случайным.

Что-то вроде this .

0 голосов
/ 09 января 2012

Если вы решили выполнить это с помощью синусоидальных волн для создания этого варианта, вот основной обзор того, как управлять синусоидальной функцией:

Допустим, у вас есть ось х, ось Y и синусволна y = sin(x)

y = sin(x * 0.5) заставляет синусоидальную волну пересекать ось x вдвое реже (частота)

y = 0.5 * sin(x) заставляет синусоидальную волну достигать высоты, в два раза меньшей (амплитуда)

y = 0.5 + sin(x) перемещает центральную ось синусоидальной волны вверх по оси y на 0,5 (сдвиг / сдвиг)

Используя эти три свойства, вы можете создавать самые разные волны разного вида.

Теперь уловка в том, что вам придется накладывать эти волны, чтобы создавать вариации во времени.Самый простой способ сделать это - просто сложить волны вместе,

y = sin(x * 0.5) + 0.5 * sin(x) + (0.5 + sin(x))

Или вы можете определить различные волны в определенном подмножестве оси x и создать кусочную функцию.Это может быть более управляемым / художественным направлением:

y = {
sin(x * 0.5) for x in (0, 5],
0.5 * sin(x) for x in (5, 10],
0.5 + sin(x) for x in (10, 5] }

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

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

...