|
|||||
|
Исходя из всех условий и преобразований в результате получим следующий алгоритм получения двумерной картинки с использованием функций Perlin Noise:
Вместо функции Interpolate обычно выбирается функция либо линейной, либо косинусной интерполяции. Изменение облачности.Интерактивное изменение облачности существенно повышает степень применимости приложения. Изменение облачности в реальном времени позволяет более точно определить возможности программы, а также отразить эффект влияния облаков на повышение реалистичности сцены как целого.
Если для моделирования облаков мы использовали Perlin noise, то для изменения облачности достаточно вычесть попиксельно некоторую константу (так как мы получаем в итоге работы алгоритма Perlin Noise карту интенсивностей) и сделать значения меньшие нуля равными нулю. Трехмерное моделирование облаков. Использование клеточных автоматов.Трехмерное моделирование облаков является более реалистичным и физически точным, а также позволяет визуализировать гораздо большее число явлений, происходящих в облаках. Основная идей состоит в следующем. Модель облачной поверхности (то есть такой поверхности, которая покрывает все небо в определенном диапазоне) представляет из себя трехмерную решетку. В узлах этой решетки находятся воксели - в нашем понимание - это минимальная графическая единица, операции над которой выполняются как над единым целом и которая визуализируется с помощью простейшего графического объекта.
Мы будем визуализировать воксели с помощью, условно говоря, плоскостей, с
нанесенными на них текстурами "небольших туманностей", то есть частей облака, и
направленных на наблюдателя (то есть нормаль, перпендикулярная поверхности,
коллинеарно направлению наблюдателя и обратно направлена по отношению к нему. Для каждого вокселя мы вводим три битовых (то есть, либо 0, либо 1) параметра, которые отражают его физическую природу как части облака: hum - если равен 1, то это означает, что в данном вокселе собралось достаточно пара для формирования облака. act - если равен 1, то это означает, что в данном вокселе началась фаза преобразования из пара в воду (то есть, в облако). cld - если равен 1, то это означает, что в данном вокселе существует облако. Работая только с этими параметрами, мы можем изменять структуры облачной поверхности. Мы можем производить различные эффекты, такие как зарождение облаков, угасание облаков, перемещение облаков, изменение структуры облаков и др. Облачная поверхность не стационарна, а постоянно изменяет свою структуру. Вводятся следующие формулы, где с помощью простейших предикатов изменяются три параметра, введенные нами, то есть изменяется структура облака:
Здесь i, j, k - координаты вокселя в введенной нами сетке, ti - момент времени. То есть, если у нас уже есть какая-то воксельная модель облаков в момент времени ti, то мы по этим формулам рассчитываем, какую форму она примет в момент времени ti+1. Но одних этих формул недостаточно, так как они формируют лишь в определенном смысле стационарную модель и никак не влияют на зарождение и угасание облаков. Вводятся дополнительные формулы:
Здесь, pext - пороговое значение, влияющее на угасание облаков; phum - пороговое значение, влияющее на изменени влажности; pact - пороговое значение, влияющее на изменение активности. Для моделирования воздействия ветра можно применять, например, следующие формулы:
Используя данную модель, можно моделировать достаточно сложные облачные поверхности, однако она является достаточной сложной, так как малейшее изменение параметров может привести к тому, что вся модель просто распадется на множество кусков, которые будут вести себя по непонятным законам. Здесь очень важна подгонка параметров, а это сделать достаточно сложно.
N/2 - noise_intens*N/256 - Random(rand_param) < h < N/2 + noise_intens*N/256 + Random(rand_param) где: noise_intens - цвет Perlin Noise текстуры (сохраненной в 256 градациях серого); rand_param - вводится для того чтобы модель получалась не совсем симметричной, обычно равен небольшому целому числу, например, 3 или 4. Воздействие ветра на такую структуру можно организовать таким же способом, как и рассказанный выше, только в данном случае у нас имеется только один параметр (cld) и перемещать необходимо, соответственно, только его. Также необходимо сделать "зацикливание", чтобы облака не улетали насовсем, то есть необходимо, чтобы те воксели, которые выходили за границу становились на место первых которое те освободили при перемещении. Трехмерная сетка не должна быть большой, потому как может так случится, что нам придется выводить все <width>*<length>*<height> полигонов. Трехмерная модель может быть раскрашена в соответствии с солнечным освещением облачной поверхности. То есть верхние слои затеняют нижние и нижние слои выглядят темнее, чем верхние. Для более реалистичной трехмерной визуализации облаков можно организовать пролет сквозь них. Но здесь необходима правильный порядок вывода облаков. Как уже говорилось, мы используем тест прозрачности, то есть также отключаем тест глубины. Если мы смотрим на облака снизу, то необходимо прорисовывать облака начиная с верхних слоем к нижним, и каждый слой прорисовывать начиная с дальних полигонов (относительно положения наблюдателя) к ближним. Если мы находимся в облаках, то прорисовываются слои следующем образом: сначала сверху к слою в котором находится наблюдатель, затем от нижнего слоя, к тому в котором находится наблюдатель. Если мы находится над облаками, то прорисовка происходит от нижнего слоя к верхнему. Shafts of light.
Вообще говоря, облака, как твердые объекты отбрасывают тень на землю. Тем самым создается такой эффект как "Shafts of light" - совокупность лучей света, образующие некие конические объекты, которые исходят из разрывов в облаках. С помощью этого эффекта существенно повышается реалистичность и "законченность" картинки. Моделировать данный эффект можно следующим образом. Создается битовая карта небесной поверхности. Если использовалось двумерное моделирование облаков, то из полученной текстуры битовая карта получается следующим образом: черные пиксели (равные нулю) приравниваются к нулю, а все остальные - равными единицами. Если использовалось трехмерное моделирование, то битовая карта получается следующим образом: все столбцы "проецируются на горизонтальную плоскость" и если в столбце был хоть один воксель с установленным параметром присутствия облака, то пиксель в битовой карте с соответствующими координатами столбца будет равен 1, а если облака в данном столбце не нашлось, то равен 0. Далее проводятся конусы (для OpenGL - это те же цилиндры, только с разными радиусами) из условного положения источника света до некоторого уровня относительно поверхности земли (можно прорисовывать до земной поверхности, но это не слишком реалистично). Также не нужно выводить те части конусов, которые располагаются выше нижней границе облачной поверхности. Оценка
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||