СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H Реалистичный ландшафт в 130 строчках на JavaScript в черновиках

Minecraft, Terragen, Skyrim и любой авиасимулятор используют свои генераторы ландшафта. Благодаря фрактальному генератору PlayfulJS каждый может почувствовать себя в роли Бога. [демо] [исходный код]



Ландшафт генерируется в виде карты высот, двухмерной матрицы значений, которые соответствуют высоте каждой точки на плоскости. С такой простой структурой данных можно отображать картинку любым способом: canvas, webgl и т.д. Главное ограничение — невозможность прокладывать туннели, пещеры и тому подобные вещи в ландшафте.

function Terrain(detail) {
  this.size = Math.pow(2, detail) + 1;
  this.max = this.size - 1;
  this.map = new Float32Array(this.size * this.size);
}

Алгоритм можно применить на любых размерах карты, но разработчики рекомендуют использовать степень 2 плюс 1.

Сам алгоритм работает по простому шаблону: разделяем территорию на четыре части и изменяем их высоту на случайное число. Далее проделываем ту же операцию с каждой из четырёх частей, каждый раз уменьшая диапазон случайных чисел, так что сначала генератор создаёт наиболее крупные детали, а затем — всё менее заметные. Это алгоритм случайного смещения средней точки на плоскости (midpoint displacement).

PlayfulJS даёт лучший результат, потому что в некоторых случаях делит территорию не на квадраты, а на ромбы.



divide(this.max);

function divide(size) {
  var x, y, half = size / 2;
  var scale = roughness * size;
  if (half < 1) return;

  for (y = half; y < self.max; y += size) {
    for (x = half; x < self.max; x += size) {
      square(x, y, half, Math.random() * scale * 2 - scale);
    }
  }
  for (y = 0; y <= self.max; y += half) {
    for (x = (y + half) % size; x <= self.max; x += size) {
      diamond(x, y, half, Math.random() * scale * 2 - scale);
    }
  }
  divide(size / 2);
}

комментарии (12)

+6
+11 –5
igordata ,  

Хорошо хоть не от первого лица написал…

+14
+15 –1
igordata ,  

По ссылке с www.playfuljs.com/realistic-terrain-in-130-lines/:
> Minecraft, Terragen, Skyrim, and every flight simulator ever all use some sort of fractal terrain generation. Today we'll explore the beautifully simple diamond-square algorithm so you, too can play God. [Demo] [Source]

Авторский текст, не перевод ни разу, не стыдно, сам писал из своей головы:
> Minecraft, Terragen, Skyrim и любой авиасимулятор используют свои генераторы ландшафта. Благодаря фрактальному генератору PlayfulJS каждый может почувствовать себя в роли Бога. [демо] [исходный код]

+1
+2 –1
Levsha128 ,   * (был изменён)

Самую интересную часть(рендеринг) не перевели. Хотя, там все, в принципе, понятно.

+8
PatapSmile ,  

Повеяло теплыми ламповыми демками на ассемблере

+5
rodweb ,  

На картинке в конце изображён алгоритм Diamond-square, довольно популярный.

+2
Pe4enie ,  

И даже освещённый ранее на хабре

0
qmax ,   * (был изменён)

Вроде бы по треугольной матрице получается красивше.
Или эффективнее по соотношению реалистичность/затраты

+3
+4 –1
MasMaX ,  

«PlayfulJS работает даёт лучший результат»

Перевод не айс, да и в оригинале подробно всё расписано, а не два абзаца.

Незачет!

+7
+8 –1
noma4i ,  

Может все-таки пометить, как перевод?

0
alizar ,  

Не получится, придётся новый топик публиковать.

+1
fshp ,  

У вас почему-то никогда не получается.

+1
radovar ,  

Здесь как-то красивее: www.shadertoy.com/view/MdBGzG