540 likes | 734 Views
Некоторые аспекты имитации атмосферы в симуляторах. 1С :MaddoxGames Максим Прут prut@1c.ru. ВНИМАНИЕ!.
E N D
Некоторые аспекты имитации атмосферы в симуляторах 1С:MaddoxGames Максим Прут prut@1c.ru
ВНИМАНИЕ! Скриншоты и ролики, приведенные в презентации являются скриншотами и роликами из локальной отладочной версии и не могут иллюстрировать никакие другие части симулятора «Битва за Британию» кроме отдельных элементов погодного «движка». Самолеты, присутствующие на скриншотах - модели из симулятора «Перл харбор», использованные с первой попавшейся окраской и опознавательными знаками исключительно с целью демонстрации погодного «движка».
Посвящается Лене Бакановой (Чижику), вдохновившей меня на эту работу, и не только на нее
Основные задачи при моделировании в симуляторах. • Довольные пользователи • Необходимая правдоподобность • Необходимая скорость работы • Максимально красивый результат
Облака Плоские картинки Объемные объекты Динамические изменения Осадки Воздушные течения Зависимость от условий Дождь, снег Эффекты объема «Визуальные» эффекты Параметры атмосферы Ровный ветер Ветер по эшелонам Порывы Термич. эффекты Рельеф, турбулент Наличие Объекты для моделирования, ощущаемые игроком • Облака • Воздушные течения • Осадки • Параметры атмосферы
Начало • Объемные облака • Пространственные тайлы. • Погодные условия имитируются частотой тайлов и затемнением сцены • Форма облаков создана художником в 3D Studio • Освещение части облака не зависит от окружения и формы самого облака. • Ровный ветер, не зависящий от погодно-климатических условий и пользователя • Погода одинакова на всей карте • Высокая скорость работы
Что дальше? • Облака сложных форм • Фронты • Погода как набор связанных процессов • Имитация «живой» атмосферы • «Локальная» погода • Моделирование разных типов облачности, многослойность • Требования сети и записи треков – одинаково у всех • Минимальная зависимость от пользователя
Как делать? • Автоматический генератор форм облаков • Расчет освещения частей облака и затенения земли в зависимости от конфигурации соседних облаков • Ветер взаимосвязан с облаками, погодными условиями, рельефом и характером местности. • Правдоподобность существования легкого планера в модели атмосферы • Области одинаковой погоды могут иметь границы, перемещаться в пространстве
Основные типы облаков (Рисунок с сайта weather.andthensome.com)
Хорошая погода • Распространяется на всю карту • Зависит от времени года • Возможны конвективные процессы, кучевые облака хорошей погоды, термики, бризы
Кучевые облака хорошей погоды • Образуются над участками конвекции в теплую солнечную погоду при достаточном прогреве поверхности • Их появление сопровождается «термиками», горизонтальным «подсосом» • Внутри самого облака – активная турбулентность • Осадки отсутствуют • В природе встречаются группами над участками с термической активностью • Имеют темное донышко, форма обусловлена «бурлением» пара. Реализация: • Облака образуются группами по всей карте и за ее пределами. • NO TILES! • Индивидуальная форма каждого облака • Облака могут перекрываться • Нужны термики и турбулентность
Как мы рисуем облако? • Разбиваем облако на составные элементы - шары • Для визуализации каждого шара используем четырехугольные пирамидки, как-то расположенные в пространстве и повернутые к камере • Каждая пирамидка текстурирована одной из 16 текстур «пуфиков»
Расчет затенения элементов облака, самозатенение пуфика Ires = I * Sres Ires – интенсивность результирующая I – интенсивность освещения Sres – коэффицент затенения Sres = Sl + Senv Sl – самозатенение пуфика Senv – затенение от окружения Sl = k * (N, rs) rs– единичный радиус-вектор на солнце N – нормаль к поверхности шара (5 точек) k – коэффицент (подбирается эмпирически)
Затенение от окружения. «Классический вариант №1» • MSFS, IL-2 • Senv = k * (rs, rOP) • k – коэффицент (подбирается эмпирически) • Достоинства: • Быстрый расчет • Простая схема • Недостатки: • Не учитываются особенности формы облака, • темные «донышки» • Не учитывается влияние и плотность «соседей»
Картинки Искусственно нарисованные донышки Приводят к нежелательным эффектам вблизи облака Что делать?
Затенение от окружения. «Классический вариант №2» • Достоинства: • Быстрый счет • Возможность аппаратного ускорения • Недостатки: • Не учитываются «соседи» и плотность • Результат не очень реалистичен Иллюстрация изHarris, Baxter, Scheuermann, and Lastra Simulation of Cloud Dynamics on Graphics Hardware
Псевдотрассировка как решение части проблем • Senv = Σ Si * kl * kd • I • kl, kd – коэфф., зависящие от l и d • Si = ri * ρ • ri – радиус i-го «пуфика» • ρ – уловная оптическая плотность • при d > ri kd = 0 • Достоинства: • Более достоверная картина • Учитываются плотность, конфигурация • и взаимное расположение • Недостатки: • Время вычислений возрастает в разы
«Классический» вариант создания формы – • спроектировать заранее (MSFS, IL-2,…). • Достоинства: • Быстро • Красиво, возможны сложные формы • Недостатки: • Форма определена раз и навсегда • Не зависит от внешних условий • Повторяемость форм бросается в глаза • Рисунок из «Let There be Clouds! Fast, Realistic Cloud-rendering in MFS 2004: A Century of Flight.» • Niniane Wang. Gamasutra January 14, 2004 Генератор формы • Конвективное облако – результат «всплытия» пузырей теплого воздуха над локальными участками с последующим оседанием. Чем выше температура в пузыре, тем выше он «всплывает». • На всплытие влияет ветер, внутри пузырей образуются сильная «бурлящая» турбулентность. • Концентрация вещества выше ближе к «центру всплытия» и меньше к краям.
Генерируем по слоям. Размеры пуфиков зависят от конечного размера облаков, высота слоев – от размера пуфиков Слои сдвигаются в зависимости от ветра. Слой описывается в цилиндрической СК. Для каждого пуфика определяется расстояние от центра и угол от горизонтали. Чем больше скорость ветра тем больше углы «стягиваются» к нулевым значения. Расстояние от центра также уменьшается с ростом значения угла пуфика. Размеры пуфиков несколько уменьшаются с ростом индекса слоя. Генератор формы 2 • Динамическая генерация • Достоинства: • Индивидуальная форма облаков • Зависимость от внешних условий • Недостатки: • Время создания • Кто-то должен придумать генератор
Расчет теней Классический метод: маска теней задана заранее, либо они игнорируются Достоинства: • Оптимальный вариант Недостатки: • Не подходит при динамическом создании формы Решение: динамический расчет теней. При этом надо учитывать, что текстуры постоянно ориентированы на камеру (нет точного проецирования на плоскость). Большие видимые пространства, надо беречь память и быстродействие. Упрощенное решение: загрубленная «подстилающая» плоскость, проецирование «пуфиков» с использованием растровых алгоритмов. В качестве направления проецирования берем вектор «от солнца» и добавляем в функциональность псевдотрассировки. • Динамический расчет тени • Достоинства: • Позволяет получить приближенную картину • Относительно быстрый и экономичный способ • Недостатки: • Скорость работы ниже, чем при использовании тайлов. • Требуется больше памяти. • Возможны заметные искажения при острых углах • вектора «на солнце». • Последний недостаток частично компенсируется тем, что • при особо острых углах тени на земле можно игнорировать
Генератор местоположения • В природе конвективные облака в основном встречаются группами над характерными зонами. • Конвективные облака имеют время жизни порядка 30 минут (пока не поддерживаем ) • Конвективные облака располагаются примерно на одном уровне, что обуславливается нижней границей текущего уровня конвекции • Облака, разбросанные по небу равномерно, выглядят неестественно • Привязка группы облаков к месту потребует динамического создания и удаления облаков, что пока не желательно в связи с особенностями организации сетевой игры.
Генератор местоположения - реализация • Разбиваем пространство слоя на квадраты (xi,yi) • где xi,yi – целые числа • Каждому квадрату ставим в соответствие • уникальную сумму H (xi,yi) • ulongComposeCode(shortsqX, shortsqY) • { • return ((sqY << 16) + (unsigned short)sqX) & 0x7FFFFFFF; • } • Генератор выдает данныепо(xi, yi) • intGetNumberOfClouds_Good(ulong sqX, intsqY, intiMaxNumber) • { • floatfTempValX, fTempValY; • intiRetVal; • fTempValX = sin((float)(sqX % 6) * PI * 0.3333f); • fTempValY = sin((float)(sqY % 6) * PI * 0.3333f); • iRetVal = (int)( (fTempValX + fTempValY) * 0.5 * iMaxNumber + 0.5); • if(iRetVal < 0) iRetVal = 0; • else if(iRetVal > iMaxNumber) iRetVal = iMaxNumber; • returniRetVal; • } • Форма и распределение внутри - псевдослучайным • образом. Используем «табличный» генератор • случайных чисел, инициализируемый суммой H.
Генератор местоположения - реализация • Каждому квадрату ставим в соответствие массив - • «теневую маску», которая заполняется при • псевдотрассировке. Положим 80x80. • Достоинства: • Можно создавать любой генератор с различной • плотностью в разных квадратах. • Недостатки: • Относительно большой объем вычислений • Большие затраты памяти на теневые маски, • возрастающие со временем • Падение производительности по сравнению • с тайлами из-за необходимости поиска и • сортировки
Решение проблем метода решения проблем • Генерируем только квадраты, находящиеся в окрестностях камеры. • Процессы генерирования и псевдотрассировки распределены по кадрам (очередь событий с приоритетами). • Каждый квадрат имеет счетчик последнего обращения. После определенного времени «бездействия» данные уничтожаются сборщиком мусора. • Данные хранятся в общем массиве блоками по квадратам. Быстрый поиск осуществляется Хэш-таблицей по уникальной сумме H. • Структура облака организована в виде «дерева». «Корневой» объект – «Слой» хранит в себе объекты «облака» итп. • Для каждого типа «глобальной» погоды используется свой генератор, работающий на всей площади карты и за ее пределами. • Пользователь задает параметры для текущего генератора. Прототип, построенный по этой схеме работает в проекте Pacific Fighters (Перл-Харбор).
Еще один генератор формы • Форма, характерная для слоисто- кучевых облаков (часто образуются подъемом фронта на большую высоту). В природе встречаются «полями», постепенно оседающими вниз. Со временем такие облака увеличиваются в размерах и сливаются в дождевое облако. • Для имитации формы генерируем по выбранному напр. последовательность базовых пуфиков в виде «колбаски» с отклонениями, затем вокруг них строим дочерние. • В нашем случае динамика не моделируется
Результаты(зависимость формы облаков от силы ветра)
Ветер • В природе ветер обусловлен термической активностью и вращением земли. • В нашем случае, ветер можно разделить на «глобальный» и «локальный». • «Глобальный» - ветер фронтов, пассаты, муссоны итп. • «Локальный» ветер – бризы, термики, турбулентности, локальные особенности фронтов и т.п. • Игрок воспринимает ветер через поведение самолета, направление дыма итп. Особенно ветер чувствуется на взлете / посадке и в зонах фронтов. • Сила и направление результирующего (глобальный + локальный) ветра зависит от времени года, времени суток и температуры. • Также на ветер влияет рельеф
Имитируем «глобальный» ветер • Задаем ветер слоями по высоте • При сильной разнице скорости и направления ветра в слоях автоматически добавляется переходный турбулентный слой • «Глобальный» ветер может ограниченно менять направление и силу (порыв). Порыв должен локализоваться в пространстве. • Непосредственно над поверхностью земли ветер слабее, чем на высоте. • Необходимо обеспечить разные уровни детализации расчета • По возможности избегаем расчетов, не связанных с конкре тными опросами в точках.
Имитируем «глобальный» ветер Vglob(x, y, t, h) = (V0 + Va * a(x, y, t)) * kenv(h,t) kenv(h) = ksurf(h) * kbound(h) * ktemp(t) V0 – основное направление Va – дополнительное направление a(x, y, t) – коэффицент усиления Va ksurf(h) – коэффициент ослабления земли kbound(h) – коэффициент граничного слоя ktemp(t) – коэффициент времени суток В граничном слое скорость ищем как суперпозицию скоростей граничащих слоев
Турбулентные зоны • Располагаются в местах изменения характера и направления потоков, в зонах конвекции, спутных струях, за препятствиями. Представляют собой беспорядочные вихревые течения. • «Классический» способ имитации – случайный вектор отражает процесс слишком грубо, выражаясь просто в тряске (симулятор швейной машинки ) часто просто в горизонтальных слоях по всей карте, при малом весе объекта результат вовсе не верен. • В игре присутствуют ЛА с небольшим весом. • Большинство объектов в игре, взаимодействующих с ветром, имеют собственную скорость, перемещаясь в пространстве. • В симуляторе опрос ветра относительно груб, что позволяет вводить некоторую дискретность.
«Вихревая машина» • Разбиваем пространство на ячейки (20x20) в каждой из которых считаем характер завихрения постоянным на протяжении периода Δti • Для определения завихрения в ячейке используем один из шести шаблонов, определяющих направление вектора«вихря» в момент времени t • По истечении периода Δti шаблон в ячейке заменяется • Величина вектора определяется из внешних данных – силы образующих потоков и т.п. • Возможно использовать сразу два шаблона в ячейке, определяя результат как нормированную сумму их векторов Достоинства: • эффект «закручивания» • Если ячейка не опрашивается ресурсы не используются
Термики • Возникают в теплые солнечные дни в результате прогрева земной поверхности. Физический смысл – последовательность «пузырей» прогретого воздуха, поднимающихся вверх. При сильном прогреве сливаются в одну сплошную струю восходящего потока • ЛА в игре чувствительны к термикам • Обычно по краям термика присутствует турбулентность, а по его границам нисходящие потоки более холодного воздуха. • Порывы ветра в жаркую солнечную погоду часто обусловлены «поддувами» под термики. • В связи с тем, что мы стараемся избежать «пассивных» вычислений, требующих знать историю процесса моделируем термики как сплошные восходящие потоки. Отказываемся от горизонтальных «поддувов», заменив их порывами в глобальном ветре. • Термики не имеют точной конфигурации, главное, чтобы их присутствие ощущалось игроком
Термики - реализация • Для определения интенсивности и направления потока используем маску теней, рассчитанную при трассировке.Пусть C – значение текущей точки в маске теней. hob – высота точки опроса. • При С > Cb поток восходящий, иначе – нисходящий. Также задаем нисходящий поток в окрестностях с C = 0 точек с С ≤ Cb. Cb – заданное граничное значение • Если в соседней точке поток меняет знак добавляем турбулентную составляющую • Сила потока для восходящих течений увеличивается с увеличением C. Для нисходящих течений увеличивается с уменьшением C пока C > 0. В точках, с C = 0, граничащих с точками нисходящего потока сила уменьшается в зависимости от силы потока в соседних точках • При попадании в облако (С > 0 и hmin < hob < hmax)сила термика затухает с ростом hob. Добавляется сильная турбулентная составляющая, также затухающая с ростом hob. • Сила термиков достигает максимума к 16.00, зависит от времени года и температуры среды. Примерно с 20.00 до 10.00 термики отсутствуют • Расчет термиков • Достоинства: • Появляются ощущаемые игроком атмосферные эффекты, • более реалистичные чем было до этого • Метод не требует «пассивных» вычислений, не связанных • с точкой опроса • Недостатки: • Приблизительная картина • В природе термики привязаны к местности, существуют • только под формирующимися облаками. В нашем случае • требование отсутствия накапливаемой истории этого • сделать не позволяет
Бризы • Возникают как следствие неодинаковой скорости прогрева земли и воды на побережьях крупных водоемов. • Имеют периодический характер с дневным и ночным максимумом. В равнинной местности средне-максимальная скорость бриза 5 м/с. • Чем больше прогревается воздух, тем сильнее бриз • Гористый рельеф берега уменьшает силу бриза днем, но сильно увеличивает ночью (холодный воздух ускоряется с высоты). В таких местах скорость бриза может достигать 8 м/с. • Часто бризы образуют облака, «привязанные» к конкретному месту над поверхностью земли • Глубина распространения бриза достигает 20 км.
Бризы. Реализация • Данные готовим до старта миссии в режиме препроцессинга • Используем карту береговой линии с помеченным берегом и карту рельефа • Реализован клеточный автомат, с затуханием «распространяющийся» в стороны от береговой линии с учетом гасящей силы рельефа днем и усиливающей ночью. Также создаем контрольный образец – без учета рельефа • Результат хранится впамяти в виде цветовых слоев одной картинки в масштабе 1 pix = 1км (нижняя картинка – день, чуть выше - ночь) • При опросе бриза из интенсивности соответствующего слоя в клетке опроса и в ее соседях определяем направление вектора бриза и его модуль. • Для контроля направления (возможны «перебросы» в связи с углублениями рельефа) используем значения контрольного слоя • Для маскировки резких изменений направления при переходе клеток используем сглаживание в приграничных областях • Реализация бризов • Достоинства: • Появляются ощущаемые игроком атмосферные эффекты, • более реалистичные чем было до этого • Метод не требует «пассивных» вычислений, не связанных • с точкой опроса • Недостатки: • Приблизительная картина • Не реализованы облака, порождаемые бризом • («пассивные» вычисления)
Локальная погода, атмосферные фронты • В природе погода имеет локальный характер, обусловленный конкретной местностью, временем суток, временем года, прохождением фронтов. Назовем локальную погоду «локальной особенностью» • Предположим, что изначально небо чистое, либо с облаками хорошей погоды. • Каждая локальная особенность имеет границу, скорость распространения, а также характерный внешний вид, сопровождающие осадки и связанные ветры. • Таким образом, следующим шагом является создание механизма работы с локальными особенностями к которым также можно отнести фронты и участки сплошной облачности.
Фронты • Необходимо создать систему управления фронтами, интегрирующую их в существующее ядро (поквадратная генерация, трассировка, рендер, система реакций и ответов пользователю), работающую с объектами фронтов со стандартным интерфейсом. Для моделирования фронта необходимо знать: • Конфигурацию в пространстве (система границ) • Генератор, сопоставляющий информацию о составляющих фронт облаках координатам внутри фронта • Ветер фронта – то как фронт изменяет векторное поле ветра «глобальной» погоды • Осадки. Идут ли осадки и в каких местах?
Грозовой фронт «эллиптического типа» • Грозовой фронт образуется резким подъемом теплого воздуха холодным фронтом. Он состоит из «ячеек», каждая из которых содержит «столб» восходящего теплого воздуха (до 30 м/с), образующий над собой «башню» пара высотой до 7 км (в средней полосе 3 - 5). Вокруг этого «столба» наблюдаются нисходящие потоки (до 15 м/с). За некоторое расстояние до внешней границы обычно наблюдается «подсос» воздуха, который затем выбрасывается фронтом наверх. Для такого фронта характерна сильная турбулентность, особенно в нижнем слое облаков и на границах восходящих и нисходящих потоков. • Конфигурация в пространстве – эллипс • Генератор – генерируем облака-«кирпичики» в много слоев. Количество слоев увеличивается в местах «центров» ячеек и уменьшается по краям • Ветер – примерно как на рисунке • Осадки – дождь и молнии.
Сплошная облачность – фронт эллиптического типа • Как правило, возникает в результате «выпирания» пласта теплого воздуха вверх. Часто содержит гряды облаков. Иногда –кучевые «выбросы». В пространстве простирается на сотни километров • Конфигурация в пространстве – эллипс • Как у грозового фронта, но генерируется небольшое количество слоев с утолщением, если нужны гряды • Ветер – турбулентность в облаках • Осадки либо отсутствуют, либо дождь