Здравствуйте! Пытаюсь реализовать рендер поверхности океана по методу, предложенному Тессендорфом. Прошу помочь понять некоторые моменты математической стороны модели.
1) Правильно ли я понимаю, что при генерации карты высот результатом функции должно быть вещественное число - то есть мнимая часть преобразования фурье должна в любой точке давать 0?
2)
Это уравнение для получения компонент X и Z нормали к точке K(x,z). Насколько я понял, эти координаты соответственно равны:
X = -Kx * (~h(K,t)).b
Z = -Kz * (~h(K,t)).b
где (~h(K,t)).b - это аргумент комплексного числа, которое мы получаем в основном преобразовании? То есть модуль этого числа мы просто отбрасываем? Как я понял, i * K * h это фактически умножение вектора K на комплексное число i*h. Почему же при покомпонентном умножении вектора на это комплексное число мы берем только часть от этого комплексного числа?
Во всех документах, которые я встречал по данной теме, к сожалению не описаны такие "мелочи", так как считается что это базовые математические понятия. Понимаю, что мои знания слабы в этой теме, поэтому понять принцип для меня очень важно.
Хм.
1) В http://steps3d.narod.ru/tutorials/water-tutorial.html используются чуть другие границы, чем в оригинальной статье.
В steps3d они симметричны:
у Тессендорфа правые неравенства строгие.
При симметричном подходе, вроде очевидно, что h(x,t) действительна.
А откуда ты вообще 2) взял?
FordPerfect
Насчет неравенств и правда, только сейчас заметил. Буду смотреть)
2) формула вроде бы отсюда http://www.keithlantz.net/2011/10/ocean-simulation-part-one-using… er-transform/
+ мое извращенное понимание преобразования фурье. Не нашел пока материала, который был бы написан достаточно развернуто для меня...
Chaos_Vortex
> + мое извращенное понимание преобразования фурье. Не нашел пока материала,
А какое у тебя понимание ?
innuendo
ну конкретно по поводу формулы пункта 2) я объяснил как я понял. Если вообще в принципе, то логически я понимаю откуда взялась формула для нахождения высот - грубо говоря, мы проверяем все волны K, которые могут появиться на нашей поверхности. И суммируя наши ~h(k,t) мы как бы собираем вклады в высоту всех волн в общую высоту... Наверное, сумбурно получилось... А вот уже насчет вектора наклона - не сильно понятно откуда взялась конкретная формула из пункта 2) и как ее правильно "считать"
Chaos_Vortex
> ну конкретно по поводу формулы пункта 2) я объяснил как я понял
Я не про 2). Я про FT
С самим преобразованием Фурье особо проблем вроде нет - понимаю, что это аппроксимация функции через ряд гармоник с пропорциональными частотами. Тут вроде все понятно, используя формулу Эйлера, решить это легко. А вот с градиентом уже не сильно понимаю, как его правильно решить... Вот как я думаю, по пунктам:
1) Вычисляем ~H(k)*e^ikx - это то что мы уже вычисляли в основном преобразовании Фурье для высоты - получили комплексное число
2) Вносим мнимую единицу в вектор K - то есть вектор K становится K(i * kx, i * kz) - получили вектор
3) Так как значение из 1) - это комплексное число, вносим его так же под вектор, умножая на каждую из компонент. Получаем:
(i * kx * (a+bi); i * kz * (a+bi)) = (i*kx*a - kx*b; i*kz*a - kz*b)
4) Проводим такие вычисления K раз для каждой волны
Ну вот, вроде получили вектор на выходе функции. А что делать с мнимой частью внутри вектора? Ведь мы получили вектор комплексных чисел, а нормаль должна быть вещественной...
Chaos_Vortex
> А что делать с мнимой частью внутри вектора?
Она будет равна 0. Просуммируй члены с противоположным k.
Понял. Значит у меня где-то ошибка, потому что в 0 она не уходит. Буду смотреть. Спасибо.
Хм. В уравнении для H0 используются случайные числа из нормального распределения. В одном из материалов наткнулся на то, что выборка из распределения должна зависеть от K. Так ли это? А иначе получается, что у моих H0(k) и H0(-k) ничего общего и нет. Видимо потому что они никак не зависят от K, мнимая часть не уходит в ноль...
Кажется, нашел ответ на свой вопрос
https://nccastaff.bournemouth.ac.uk/jmacey/MastersProjects/MSc13/… tion%2001.pdf
В пункте 7.2 рассказывается, почему выборка из распределения должна зависеть от K. Если использовать такой подход, выходит что мнимые части и правда уходят в ноль.
Появился новый вопрос... С обнулением мнимой части разобрался, расписав почленно h(k) с разными знаками...
В общем, вот два варианта того что получается:
1)
Здесь в роли X в преобразовании Фурье выступают индексы i и j, из которых строится k. Думаю, что это неправильно. Как я понимаю, X - это наша точка в реальном пространстве.
Ну хорошо, пробуем в качестве X взять реальную горизонтальную позицию точки.. получаем:
2)
Кучу странных артефактов и в карте нормалей и в отображении вообще...
В общем, вопрос вот в чем: X в формуле - это реальная позиция точки в пространстве?
P.S слева вверху нормали
Chaos_Vortex
> В общем, вопрос вот в чем: X в формуле - это реальная позиция точки в пространстве?
Да, это вектор X = {x, y}. Также как и K = {kx, ky}.
Chaos_Vortex
На всякий случай, вдруг не видел:
http://www.uraldev.ru/articles/35
}:+()___ [Smile]
Спасибо
Mikle
Видел, но просмотрю еще пару раз, может что-то важное не заметил
Снова здравствуйте! Прочесал тучу раз все формулы, столкнулся с двумя проблемами:
Проблема №1: при увеличении размеров сетки очень сильно увеличивается амплитуда волн. Для примера приведу два скрина:
а)
Характеристики следующие:
N = 64
Длина = 256
Сила ветра = 10
Коэффициент Choppy = 0
Минимальная волна = 1м
Период = 2000
Константа Филлипса = 0.0005
Направление ветра = (1, 0)
б)
Характеристики такие же, кроме N = 16, Длина = 64
Как видно, при одинаковом ветре амплитуда волн очень сильно отличается. Мне кажется что противоположные волновые векторы должны приглушать друг друга, но этого не происходит. Предположения по поводу причины этого уже, если честно, закончились...
Проблема №2:
Какие-то совсем некрасивые нормали... Карта нормалей справа вверху на скринах. Считаю используя градиент как сказано в Тессендорфе. В противовес этому попробовал просто получить нормали вершин путем усреднения нормалей всех треугольников, в которые входит эта вершина - получил гораздо более приичный результат.
Надеюсь что экстрасенсы вышли из долгосрочного отпуска, потому что я не знаю в чем проблема, а перепроверять уже сил нет
Немного не в тему. Я пробовал делать воду по тому пейперу, но не понял, где там про Фурье? Делал тупо через синусы, или это и есть какое-то упрощение?
Тема в архиве.