Федеральное агентство по образованию Государственное образовательное учреждение высшего профессионального образования САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ имени академика С.П. КОРОЛЕВА Факультет информатики Кафедра технической кибернетики НИР магистра на тему Моделирование водной поверхности с применением быстрых алгоритмов преобразования Фурье Выполнил: группа Руководитель: САМАРА 2011 Князев В.А., 657 Чичева М.А. Содержание 1. Сравнение скорости выполнения двух параллельных реализаций БПФ ...................... 3 2. Построение 3D-поверхности ................................................................................................................. 3 3. Модель волн Герстнера ............................................................................................................................ 4 4. Статистическая волновая модель ...................................................................................................... 6 Список использованных источников ....................................................................................................... 9 2 1. Сравнение скорости выполнения двух параллельных реализаций БПФ В предыдущей части работы была выполнена реализация БПФ, когда после каждой итерации процессору (ядру) требовалась синхронизация с остальными процессорами. В подобной реализации основным преимуществом является то, что ни один из процессоров не простаивает вплоть до окончания расчета преобразования Фурье. Теперь же реализуем алгоритм так, чтобы процессоры считали каждый свою часть независимо от остальных. И лишь на последней итерации один из процессоров завершит расчет преобразования Фурье. И сравним полученные результаты. Испытания будем проводить на системе с 4х-ядерным процессором: AMD Phenom II x4 3.40GHz RAM 4 Gb Windows 7 x86 Размеры матриц 128x128 256x256 512x512 1024x1024 2048x2048 Синхронное выполнение (t, мс) Асинхронное выполнение (t, мс) 20,283311 46,518879 17,2815164 914,055058 3278,55619 25,017653 43,200043 18,3433402 938,696722 3376,345682 Как видим, реализация с синхронизацией процессоров после каждой итерации с небольшим преимуществом выигрывает в скорости перед асинхронной реализацией. 2. Построение 3D-поверхности Алгоритм построения 3D-поверхности, когда известна матрица высот вершин довольно-таки прост: в качестве значений откладываемых по оси Z будут выступать элементы «высотной матрицы», а значения откладываемые по оси X и оси Y будут индексы соответствующих элементов. Саму же высотную матрицу можно получить по одному из двух представленных способов рассмотренных ниже. Например, можно выстраивать поверхность по изображению, где в качестве высоты вершины будет выступать яркость пикселя картинки (см. рисунок 1). 3 Рисунок 1 – Пример построения 3D-поверхности по известной матрице высот 3. Модель волн Герстнера Волны Герстнера были впервые найдены около 200 лет назад в качестве приближенного решения гидродинамических уравнений. Свое первое применение в компьютерной графике они нашли в 1982 году Фурье и Ривзом. Эта физическая модель описывает поверхность с точки зрения движения её отдельных точек. При хорошем рассмотрении, можно заметить, что эти точки движутся по кругу, причем так, что через них как раз проходит волна (см. рисунок 2). 4 Рисунок 2 ‒ Движение точки поверхности Если точку на невозмущенной поверхности пометить как 𝑋0 = (𝑥0 , 𝑦0 ), а её высоту как 𝑍0 = 0, то её волновое движение в момент времени 𝑡 можно описать в следующем виде: ⃗ 𝑘 ⃗⃗⃗⃗⃗⃗⃗⃗ ⃗ · 𝑋 ⃗⃗⃗⃗0 − ( ) 𝐴𝑠𝑖𝑛(𝑘 ⃗⃗⃗⃗0 − 𝜔𝑡); 𝑋(𝑡) = 𝑋 𝑘 ⃗ · 𝑋 ⃗⃗⃗⃗0 − 𝜔𝑡) 𝑦 = 𝐴 𝑐𝑜𝑠(𝑘 где 𝐴 – это амплитуда волны; ⃗ ‒ это горизонтальный вектор («волновой вектор»), значением которого является 𝑘 направление движения волны. А величина переменной 𝑘 зависит от длины волны (𝜆) как 𝑘 = 2𝜋 𝜆 Частота 𝜔 относящаяся к волновому вектору будет рассмотрена ниже. Как видно, волны Герстнера весьма ограничены, поскольку они представлены одной синусоидальной волной по горизонтали и вертикали. Однако может быть получен более сложный профиль путем суммирования набора синусоид. Выбрав набор волновых векторов 𝑘𝑖 , амплитуд 𝐴𝑖 и начальных фаз 𝜑𝑖 , для 𝑖 = 1, … 𝑁 получаем выражения для результирующей волны: 𝑁 ⃗⃗⃗ 𝑘𝑖 ⃗⃗⃗⃗⃗⃗⃗⃗ ⃗⃗⃗𝑖 ∙ 𝑋 ⃗⃗⃗⃗ ⃗⃗⃗⃗0 − 𝜔𝑖 𝑡 + 𝜑𝑖 ) 𝑋(𝑡) = 𝑋0 – ∑ ( ) 𝐴𝑖 𝑠𝑖𝑛(𝑘 𝑘𝑖 𝑖=1 𝑁 ⃗⃗⃗𝑖 ∙ 𝑋 ⃗⃗⃗⃗0 − 𝜔𝑖 𝑡 + 𝜑𝑖 ) 𝑦 = ∑ 𝐴𝑖 𝑐𝑜𝑠(𝑘 𝑖=1 На картинке представлен профиль волны, полученный путем сложения 4 синусоид (см. рисунок 3). 5 Рисунок 3 – Волна, полученная путем суммирования 4 простых синусоидальных волн Анимация волн Герстнера определяется набором частот, для каждой компоненты из множества. Для волн на водной поверхности известна связь между этими частотами и величиной соответствующих волновых векторов ⃗⃗⃗ 𝑘𝑖 : ⃗ ) = 𝑔𝑘 ⃗, 𝜔2 (𝑘 где g – это гравитационная постоянная, значение которой чаще всего берут равным 9.8 м⁄сек2 . 4. Статистическая волновая модель В основе статистической модели синтеза поверхности океана лежит дискретное преобразование Фурье. Волна представляется как сумма большого числа гармоник (т.е. 6 фактически осуществлялось разложение в ряд Фурье по пространственным переменным 𝑥 и 𝑦). Проводя ДПФ над комплексной сеткой можно получить значения амплитуд волн в её узлах, то есть карту высот. Полученная с помощью преобразования Фурье карта высот периодична и её можно “натягивать” на сколь угодно большую поверхность. Соответственно, чем больше размер сетки для преобразования Фурье, тем больше полученная карта высот, тем более изощренная поверхность и менее заметна периодичность волн, что сильно увеличивает реалистичность. Таким образом, карта высот статистической модели синтеза водной поверхности будет описываться следующей формулой ⃗ , 𝑡)𝑒 𝑖𝑘⃗𝑥 , ℎ(𝑥, 𝑡) = ∑ ℎ̃(𝑘 ⃗𝑘 где (𝐿𝑥 , 𝐿𝑦 ) – размеры фрагмента водной поверхности; (𝑁, 𝑀) – размеры сетки для преобразования Фурье; ⃗ = (𝑘𝑥 , 𝑘𝑦 ), 𝑘𝑥 = 𝑘 2𝜋𝑛 2𝜋𝑚 , 𝑘𝑦 = , 𝐿𝑥 𝐿𝑦 𝑛𝐿𝑥 𝑚𝐿𝑦 𝑥=( , ), 𝑁 𝑀 𝑀 𝑀 𝑁 𝑁 − < 𝑚 < ,− < 𝑛 < . 2 2 2 2 Впервые модель была описана Джерри Тессендорфом (Jerry Tessendorf. “Simulating Ocean Water”) и использовалась впоследствии почти во всех проектах, требовавших визуализации реалистичной поверхности воды. Один из наиболее полных обзоров реализации этой модели и разнообразных эффектов, таких как каустики и пена, был произведен в работе Lasse Staff Jensen and Robert Golias. “Deep-Water Animation and Rendering”. Чтобы синтезировать реалистичную водную поверхность необходимо подобрать способ выбора коэффициенты для преобразования Фурье. Также необходимо решить вопрос о плавной анимации водной поверхности со временем. Обычно коэффициенты ДПФ выбираются исходя из спектра Филлипса. В работе Тессендорфа есть и другие примеры спектров. 7 ⃗)=𝐴 𝑃ℎ (𝑘 exp (− 𝑘 1 ) (𝑘𝐿)2 ⃗ |𝑘 ∙ 𝜔 ⃗ |, 4 где 𝐿= 𝑉2 𝑔 – это максимально возможная волна, возникающая под действием непрерывного ветра со скоростью 𝑉; 𝜔 ⃗ – это сила и направление ветра; 𝐴 ‒ нормирующая константа. А начальный спектр водной поверхности выражается в следующем виде ⃗) = ℎ̃0 (𝑘 1 √2 ⃗) (𝜉𝑟 + 𝑖𝜉𝑖 )√𝑃ℎ (𝑘 где 𝜉𝑟 , 𝜉𝑖 – это случайные числа, полученные по закону нормального распределения. Синтезировать спектр Филлипса каждый кадр не нужно. Можно просто ”анимировать” спектр с фиксированным по времени периодом. ⃗ , 𝑡) = ℎ̃0 (𝑘 ⃗ , 𝑡)𝑒 𝑖𝜔(𝑘)𝑡 + ℎ̃0∗ (−𝑘 ⃗ , 𝑡)𝑒 −𝑖𝜔(𝑘)𝑡 , ℎ̃(𝑘 где 𝜔(𝑘) = √𝑔𝑘; ℎ̃0∗ - сопряженное число ℎ̃0 . Можно заметить, что коэффициенты преобразования Фурье комплексные, хотя высота волны представляется вещественным числом. На самом деле, комплексная ⃗ , 𝑡)𝑒 𝑖𝑘⃗𝑥 как раз компонента не лишняя, она означает фазу волны. Формула ℎ(𝑥, 𝑡) = ∑⃗𝑘 ℎ̃(𝑘 и описывает сдвиг фазы волны. Таким образом, сдвиг фаз всех гармоник дает плавную, и в то же время, непредсказуемую, анимацию поверхности. 8 Список использованных источников 1. Simulating Ocean Water, Jerry Tessendorf. 9