Реалистический 2D ландшафт отображает [закрытое] поколение

Ответ зависит частично от того, что делает конструктор и что происходит с объектом после цикла, так как это определяет в большой степени, как код оптимизирован.

, Если объект является большим или сложным, абсолютно объявите его вне цикла. Иначе люди, говорящие Вам не преждевременно оптимизировать, правы.

14
задан Wodzu 20 September 2009 в 21:43
поделиться

3 ответа

Я раньше играл с генерацией ландшафта. Предполагая, что целью является растровое изображение, я нашел способ сделать такие вещи, как реки, и в целом сделать их лучше: Эрозия.

Если у вас есть рельеф, созданный другими способами, немного его размывайте: вам нужно, чтобы мир был выражен высотой в пикселях . Возьмите место на карте и переместите одну единицу высоты к самому низкому соседу. Переместите курсор к этому соседу и повторяйте, пока он не перестанет двигаться. Повторите то же самое для других пикселей.

Чтобы реки подсчитали, сколько раз вы проходите через точку, перемещая биты вниз. Больше всего попадают в пятна реки.

Продолжение: я не стирал каждый пиксель так сильно, как просто большое количество случайных пикселей, пока он не выветрился достаточно. Причина их фактического разрушения в том, что это уносит биты вниз и заполняет дыры.

6
ответ дан 1 December 2019 в 14:44
поделиться

Рельеф создается множеством разных причин в разных временных масштабах. Чтобы действительно создать реалистичную местность, вам нужно смоделировать их.

В «краткосрочной» перспективе гидросфера определяет большинство характеристик. Вероятно, вы можете начать с вокселя / частицы / карты высот / сетки местности, содержащей основные объекты (горные хребты и т. Д.), И рассматривать их как неизменяемые, а затем обработать их с помощью множества имитаций воды. Вам нужно будет вычислить, где будут реки и озера, как они разрушают основной ландшафт и где образуют отложения. Если бы мне пришлось это кодировать, я бы, вероятно, начал с трехмерного воксельного мира.

Это была бы гигантская задача, и я уверен, что существует множество приемов для создания определенных типов ландшафта, которые занимают миллисекунды вместо минут. Какую местность вы хотите создать? Горный? Низина? Промышленный? Лес? Пустыня? Архипелаг?

Короче говоря: если вы хотите, чтобы местность выглядела реалистично для людей (которые, в конце концов, склонны быть экспертами в подобных вещах), вам придется создать его, моделируя реальные геологические процессы.

3
ответ дан 1 December 2019 в 14:44
поделиться

Мой метод в Terra3D заключался в том, чтобы сгенерировать случайные значения высоты, а затем сделать 3 прохода сглаживания с небольшим изменением формы, записанным в алгоритм. Изменение формы приводит к тому, что местность под ватерлинией немного смещается вниз, а все, что находится выше ватерлинии, немного смещается вверх. Однако эффект - много холмов и небольших озер. И это может быть не то, что вы ищете.

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

Вот код для генерации ландшафта в Terra3D на случай, если вам интересно:

  // GENERATE TERRAIN
  for (i = 0; i < MAX; i++)
  {     
    for (i2 = 0; i2 < MAX; i2++)
    {
        if (i<10 || i2<10 || i>MAX-10 || i2>MAX-10)
        field[i][i2].y=0;
      else
        field[i][i2].y=(GLfloat(rand()%151)-75)/50+(field[i-1][i2-1].y+field[i-1][i2].y+field[i-1][i2+1].y+field[i-1][i2-2].y+field[i-1][i2+2].y)/5.05;
    }
  }

  // SMOOTH/RESHAPE TERRAIN
  for (int cnt = 0; cnt < 3; cnt++)
  {  
    for (int t = 1; t < MAX-1; t++)
    {
      for (int t2 = 1; t2 < MAX-1; t2++)
      {
        field[t][t2].y = (field[t+1][t2].y+field[t][t2-1].y+field[t-1][t2].y+field[t][t2+1].y)/4;

        if (cnt == 0)
        {
          if (field[t][t2].y < -1 && field[t][t2].y > -1-.5) field[t][t2].y -= .45, field[t][t2].y *= 2;
          else if (field[t][t2].y > -1 && field[t][t2].y < -1+.5) field[t][t2].y += .5, field[t][t2].y /= 5;
        } 
      }
    }
  }

Это небрежный код, который я написал около 10 лет назад. Terra3D был долгим процессом обучения экспериментов и возни в темноте, чтобы произвести те эффекты, которые я искал. Но, может, это поможет.

2
ответ дан 1 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: