Замечания о математике, алгоритмах и методах, применяемых при компьютерной симуляции флюидов (например, огня и дыма) в режиме реального времени.
Исходный код к этой статье выложен на GitHub.
Огонь как явление очень интересен с точки зрения компьютерной графики. Раньше огонь было принято имитировать. Например, в фильме «Властелин колец» Питера Джексона для изображения огня использовались спрайты с огромным количеством дыма (на тот момент симуляция флюидов обходилась слишком дорого, даже при бюджете блокбастера). Когда требовалось моделировать огонь в режиме реального времени, например, в видеоиграх, использовались почти исключительно нефизические подходы.
Но в последние 10 лет, благодаря развитию GPU, быстрая симуляция флюидов значительно упростилась. Базовые алгоритмы, описывающие динамику флюидов, не составляет труда реализовать на GPU. В 2009 году компания Industrial Light & Magic воспользовалась этими методами для моделирования и рендеринга огня в фильме о Гарри Поттре. В 2014 году компания NVIDIA выпустила FlameWorks — целую систему для генерации эффектов «огня» и «дыма» в компьютерных играх.
В этой статье мы разберём, как можно имитировать огонь средствами GPU. В частности, поговорим о математике, на которой основана динамика флюидов, обсудим параллельные алгоритмы для моделирования флюидов, а также отдельные характеристики горения, благодаря которым огонь ни с чем не перепутаешь. Предполагается, что читатели статьи хорошо подкованы в векторном анализе и дифференциальных уравнениях (уметь взять градиент вектора). Демо-примеры реализованы в WebGL.
Симуляция флюидов
Прежде, чем имитировать огонь, нужно научиться симуляции флюидов. Предполагаем, что наш флюид несжимаемый и невязкий, что радикально упрощает нашу задачу.
1.1 Базовая динамика флюидов
Допустим,
