Начальная генерация пещер

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Всем привет, в 3D граффике помимо решения задач тени/света, и примитивов, а так же физики и возможно каких-то базовых задач, которые сегодня могут заменить библиотеки по математике, стоит отметить генерацию поверхностей. Какие-то поверхности впуклые, какие-то поверхности выпуклые, поверхности можно комбинировать. Как это влияет на процесс в граффике? Например иммерсив - погружение. Влияет следующим образом, конечно все вкусы учесть невозможно. Задаём какие-то характеристики, которые характеризуют площадь поверхности и далее если она "подходит" в целом по ощущениям и по логике, её можно использовать как декорацию, возможно оптимизировав - если постараться, или оставить как есть. В этой статье хочу продемонстрировать как удалось добиться генерации пещер, конечно при помощи открытых источников все источники будут указаны в конце обзора, гит.

*
*

Начинается генерация с идеи, что вся поверхность выставлена на базовую высоту, и далее начинается сам процесс генерации. Если не проинициализировать память или высоту, могут быть неопределенные поведения по итогу. Если об этом забыть можно подумать, что ничего не работает и долго искать ошибку! Не во всех языках это замечено. Но имеет место быть.

Так же есть в API или в движках возможность оптимизированной прорисовки, в Opengl это например PRIMITIVE_RESTART, в движках по типо Unity/Unreal/Godot и т.д. Надо смотреть какие апи используются и смотреть документацию API, если есть интерес разобраться как организовать такую технику отрисовки. Можно рисовать и в простом режиме треугольников это должно всегда работать, надеюсь читатель знает как сгенерировать горизонтальную поверхность в нужном шаге сетки на нужной высоте.

Итак приступим

Буду использовать Linux, gcc 14.2, glfw - только пк, lua - мечта организовать конфиг из файла таблицы lua, assimp - перечислил все основные зависимости моего микро-проекта на данный момент, читатель может заметить нету математики, за место всей математики, можно воспользоваться cglm.

Алгоритм генерации

Алгоритм подогнан под задачу я на текущем этапе пока присматриваюсь к нему, мне нравится.

//c
void generateCaverns(Heightmap1 *heightmap, int rows, int columns, int numHills, int hillRadiusMin, int hillRadiusMax, float hillMinHeight, float hillMaxHeight){
    for (int i = 0; i < numHills; i++)
    {
      
      int hillCenterRow = random1(0,(rows-1));//random от до
      int hillCenterCol = random1(0,(columns-1));
      int hillRadius = random1(hillRadiusMin,hillRadiusMax);
      float hillHeight = random1(hillMinHeight,hillMaxHeight);

      for (int r = hillCenterRow - hillRadius; r < hillCenterRow + hillRadius; r++)
      {
        for (int c = hillCenterCol - hillRadius; c < hillCenterCol + hillRadius; c++)
        {
          if (r < 0 || r >= rows || c < 0 || c >= columns)
          {
            continue;
          }
          int r2 = hillRadius * hillRadius;
          int x2x1 = hillCenterCol - c;     
          int y2y1 = hillCenterRow - r;     
          float height = (float)(r2 - (x2x1 * x2x1) - (y2y1 * y2y1));
          if (height < 0.0f)
          {
            continue;
          }
          float factor = height / r2;
          heightmap->heighData[r][c] += hillHeight*factor;
          if (heightmap->heighData[r][c] > 1.0f)
          {
            heightmap->heighData[r][c] = 1.0f;
          }
        }
      }
    }
}

может показаться что тут нет ничего особенного мол всё тривиально, вставим *(200,200,125,10,20,1,3)scale400,50,400

пара примеров
пара примеров

https://github.com/richKirl/TestDSAOpenglWorld

ресурсы

youtube.com/watch?v=qChQrNWU9Xw

libnoise.sourceforge.net/noisegen/index.html

https://www.mbsoftworks.sk/tutorials/opengl4/016-heightmap-pt1-random-terrain/

Источник: https://habr.com/ru/articles/875916/


Интересные статьи

Интересные статьи

Когда клиент откладывает покупку, ожидая скидки, важно не потерять его интерес. Уведомления о снижении цен на избранные товары помогают вовремя сообщать пользователям о выгодных предложениях, возвраща...
Попадание внутренней корпоративной информации в чужие руки — страшный сон для любого бизнеса. Последствия таких инцидентов могут быть непредсказуемыми, от утечек данных клиентов и сопутствующих штрафо...
Привет! Меня зовут Никита, я разработчик в компании Битрикс24. В разработке мы давно стремимся к единообразию. Это позволяет нам уменьшить количество типовых ошибок, снизить затраты на производство и ...
Десятки статей на Хабре и не только на нем о том, как можно заправить оригинальный картридж или чернильницу. По всему миру сотни производителей порошка и чернил и миллионы тех, кто организовал сервис...
Перевод статьи от 01.02.2023 г., из блога Rasa Курс «NLP (Natural Language Processing) для разработчиков» в учебном центре Rasa — это простое и быстрое знакомство с современными инструментами и ...