Войти
ПрограммированиеФорумГрафика

Рендер поверхности океана, Тессендорф, понимание теории

Страницы: 1 2 Следующая »
#0
1:29, 19 ноя. 2015

Здравствуйте! Пытаюсь реализовать рендер поверхности океана по методу, предложенному Тессендорфом. Прошу помочь понять некоторые моменты математической стороны модели.
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
2:44, 19 ноя. 2015

Хм.
1) В http://steps3d.narod.ru/tutorials/water-tutorial.html используются чуть другие границы, чем в оригинальной статье.
В steps3d они симметричны:
Изображение
у Тессендорфа правые неравенства строгие.

При симметричном подходе, вроде очевидно, что h(x,t) действительна.

А откуда ты вообще 2) взял?

#2
2:58, 19 ноя. 2015

FordPerfect
Насчет неравенств и правда, только сейчас заметил. Буду смотреть)
2) формула вроде бы отсюда  http://www.keithlantz.net/2011/10/ocean-simulation-part-one-using… er-transform/
+ мое извращенное понимание преобразования фурье. Не нашел пока материала, который был бы написан достаточно развернуто для меня...

#3
9:41, 19 ноя. 2015

Chaos_Vortex
> + мое извращенное понимание преобразования фурье. Не нашел пока материала,


А какое у тебя понимание ?

#4
11:41, 19 ноя. 2015

innuendo
ну конкретно по поводу формулы пункта 2) я объяснил как я понял. Если вообще в принципе, то логически я понимаю откуда взялась формула для нахождения высот - грубо говоря, мы проверяем все волны K, которые могут появиться на нашей поверхности. И суммируя наши ~h(k,t) мы как бы собираем вклады в высоту всех волн в общую высоту... Наверное, сумбурно получилось... А вот уже насчет вектора наклона - не сильно понятно откуда взялась конкретная формула из пункта 2) и как ее правильно "считать"

#5
11:47, 19 ноя. 2015

Chaos_Vortex
> ну конкретно по поводу формулы пункта 2) я объяснил как я понял

Я не про 2). Я про FT

#6
12:10, 19 ноя. 2015

С самим преобразованием Фурье особо проблем вроде нет - понимаю, что это аппроксимация функции через ряд гармоник с пропорциональными частотами. Тут вроде все понятно, используя формулу Эйлера, решить это легко. А вот с градиентом уже не сильно понимаю, как его правильно решить... Вот как я думаю, по пунктам:
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 раз для каждой волны
Ну вот, вроде получили вектор на выходе функции. А что делать с мнимой частью внутри вектора? Ведь мы получили вектор комплексных чисел, а нормаль должна быть вещественной...

#7
12:16, 19 ноя. 2015

Chaos_Vortex
> А что делать с мнимой частью внутри вектора?
Она будет равна 0. Просуммируй члены с противоположным k.

#8
12:24, 19 ноя. 2015

Понял. Значит у меня где-то ошибка, потому что в 0 она не уходит. Буду смотреть. Спасибо.
Хм. В уравнении для H0 используются случайные числа из нормального распределения. В одном из материалов наткнулся на то, что выборка из распределения должна зависеть от K. Так ли это? А иначе получается, что у моих H0(k) и H0(-k) ничего общего и нет. Видимо потому что они никак не зависят от K, мнимая часть не уходит в ноль...

Кажется, нашел ответ на свой вопрос
https://nccastaff.bournemouth.ac.uk/jmacey/MastersProjects/MSc13/… tion%2001.pdf
В пункте 7.2 рассказывается, почему выборка из распределения должна зависеть от K. Если использовать такой подход, выходит что мнимые части и правда уходят в ноль.

#9
3:26, 20 ноя. 2015

Появился новый вопрос... С обнулением мнимой части разобрался, расписав почленно h(k) с разными знаками...
В общем, вот два варианта того что получается:
1) Волны (X = (i, j)) | Рендер поверхности океана, Тессендорф, понимание теории
Здесь в роли X в преобразовании Фурье выступают индексы i и j, из которых строится k. Думаю, что это неправильно. Как я понимаю, X - это наша точка в реальном пространстве.
Ну хорошо, пробуем в качестве X взять реальную горизонтальную позицию точки.. получаем:
2)Волны (X = (x, z)) | Рендер поверхности океана, Тессендорф, понимание теории
Кучу странных артефактов и в карте нормалей и в отображении вообще...
В общем, вопрос вот в чем: X в формуле - это реальная позиция точки в пространстве?

P.S слева вверху нормали

#10
9:32, 20 ноя. 2015

Chaos_Vortex
> В общем, вопрос вот в чем: X в формуле - это реальная позиция точки в пространстве?
Да, это вектор X = {x, y}. Также как и K = {kx, ky}.

#11
11:51, 20 ноя. 2015

Chaos_Vortex
На всякий случай, вдруг не видел:
http://www.uraldev.ru/articles/35

#12
12:28, 20 ноя. 2015

}:+()___ [Smile]
Спасибо
Mikle
Видел, но просмотрю еще пару раз, может что-то важное не заметил

#13
20:53, 24 ноя. 2015

Снова здравствуйте! Прочесал тучу раз все формулы, столкнулся с двумя проблемами:
Проблема №1: при увеличении размеров сетки очень сильно увеличивается амплитуда волн. Для примера приведу два скрина:
  а) Волны 1 | Рендер поверхности океана, Тессендорф, понимание теории
Характеристики следующие:
N = 64
Длина = 256
Сила ветра = 10
Коэффициент Choppy = 0
Минимальная волна = 1м
Период = 2000
Константа Филлипса = 0.0005
Направление ветра = (1, 0)
  б) Волны 2 | Рендер поверхности океана, Тессендорф, понимание теории
Характеристики такие же, кроме N = 16, Длина = 64
Как видно, при одинаковом ветре амплитуда волн очень сильно отличается. Мне кажется что противоположные волновые векторы должны приглушать друг друга, но этого не происходит. Предположения по поводу причины этого уже, если честно, закончились...
Проблема №2:
Какие-то совсем некрасивые нормали... Карта нормалей справа вверху на скринах. Считаю используя градиент как сказано в Тессендорфе. В противовес этому попробовал просто получить нормали вершин путем усреднения нормалей всех треугольников, в которые входит эта вершина - получил гораздо более приичный результат.
Надеюсь что экстрасенсы вышли из долгосрочного отпуска, потому что я не знаю в чем проблема, а перепроверять уже сил нет

#14
21:01, 24 ноя. 2015

Немного не в тему. Я пробовал делать воду по тому пейперу, но не понял, где там про Фурье? Делал тупо через синусы, или это и есть какое-то упрощение?

+ Показать

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.