Геометрия водной поверхности

Не знаю почему, но не могу додуматься до простейшего алгоритма прохода волн по поверхности воды (двумерный массив вершин). Понимаю, что что-то надо делать с синусом-косинусом как вариант... но туплю. И ещё - 3d (OpenGL конкретнее)-программирование начал изучать недавно, поэтому подскажите, как этот двумерный массив вершин отрисовать правиленее (я пока рисую отдельными четырёхугольниками, извращённо проходя по массиву...)
Последняя правка: пн, 29/08/2011 - 22:09
Submitted by azazeo on

Комментарии

Привет. Ну первое это смотря для чего делешь воду, если это окен, то да, видимо надо делать реальные геометрические волны. В этом случае есть смысл обратить внимание на такую вещь как displacement mapping. Гугль много знает об этом. Более применительно к твоей теме о нем (displacement mapping) можно почитать в GPUGems, точно не помню в которой из 2х частие. Но ты без труда найдешь её на сайте nVidia, если нету самой книги. Вообще я не занимался еще водичкой, но могу предположить что сам по себе sin не покатит, его надо будет сгладить. На самом деле физика поведения волн ооочень не проста и применить реальные физические законы пока возожным не представляется особо.. Опять же я нее могу посоветовать нечто однозначное. Есть еще кинжка Грега Снука "3Д-ландшафты в реальном времени блаблабла". Вот там есть глава, посвященная именно геометрическим волнам. Алгоритм основан на некой работе по гармоническим рядам Фурье, я лишь только пролистывал, так что сказать конкретно не могу. Но скажу одно, сделать хорошую апроксимацию водички не просто. Значит если ты не делаешь океаны и т.п., что чаще всего бывает, то обойтись можно EMBM, или обычным нормал маппингом (а там уже анимируй её как хочешь, хоть в максе руками или беря готовые uv-карты из инета, на сколько знаю найти можно:)). В этом случае нету лишней геометрии и ненадо гемороится о её рендеринге. Собственно такой вариант более применителен. Статейку по embm и водичке можно найти на mirgames.ru. Что касается рендеринга водного меша, то рисовать его по отдельному четырехугольнику - жесть. Рисовать надо весь меш целиком, если нету причин разхбивать его. но если воды много, то возможно будут лоды, тогда рисоватся будут пачками некоторыми, но явано не по треугольнику Smile Ну а анимировать стоит в шейдере :)
Не - никаких шейдеров! Вода - для моря в игрухе на курсовой - типа как в старых автоматах, стрельба по проплывающему кораблю вдали.. шейдеров быть не может - у меня их в видюхе ещё не придумали. А вода в демке water by Jan Horn -меня устроила бы. Он её делал с помощью GL_QUAD_STRIP - брал координаты из массива по которому проходил и считал волны. Но там волны от капель. А мне - просто морские волны.
Submitted by azazeo on
если как в автоматах, то проще спрайтами
Submitted by _dm on
Хм... ненаю как там в старых автоматах, не играл Smile Но видимо тада тебе геометрические волны вовсе не нужны. Тем более чтобы получить болемене реалистичный вид надо погемороится, да и производительность то... В твоем случае определенно надо делать эмуляцию геометрической волны спрайтами, да. Проанимировав текстурку можно вообще неплохого эффекта добиться.
Не, народ:) Неправильно поставленный вопрос приводит к большим проблемам:) Вода у меня будет в 3Д, вдали будет плыть кораблик (кстати, где про загрузку меша (без анимации) прочитать?), в него целимся и стреляем:) Вот... Камера подвешена над водой почти параллельно горизонту... Т.е. вся задача - прогнать по массиву координат Z волны...
Submitted by azazeo on
azazeo, ты сам ответил на свой вопрос)) Координату z можно изменять так: z=a*sin(k*t), коэфициенты "а" и "k" - экспериментально подбираешь спрева для одной волны так, чтобы она была похожа на волну, затем юзаешь их для всего масива. всё, волны есть. (t - естессно, прототип времени, типа счётчик цикла) Можно ещё, прогоняя z для всего массива, незначительно рандомно откланять "а" и "k" в стороны (увеличивать\уменьшать процентов на 25), тогда волны получатся неодинаковой высоты и длины, почти как в природе))). К координатам можно привязать спрайты, с анимированной текстурой (как советовал ранее SimpleProger).
Submitted by XBOPbI on
azazeo, ты сам ответил на свой вопрос)) Координату z можно изменять так: z=a*sin(k*t), коэфициенты "а" и "k" - экспериментально подбираешь спрева для одной волны так, чтобы она была похожа на волну, затем юзаешь их для всего масива. всё, волны есть. (t - естессно, прототип времени, типа счётчик цикла) Можно ещё, прогоняя z для всего массива, незначительно рандомно откланять "а" и "k" в стороны (увеличивать\уменьшать процентов на 25), тогда волны получатся неодинаковой высоты и длины, почти как в природе))). К координатам можно привязать спрайты, с анимированной текстурой (как советовал ранее SimpleProger).
Submitted by XBOPbI on
сорри, народ, за одиноковые сообщения, что-то я заглючил))
Submitted by XBOPbI on
Зри в корень, аля в гугль: там много чего есть =). Скажу еще, что реалистичные волны делаются путем решения дифференциальных уравнений второго порядка (кажется). Некоторые математические выкладки одного чела(не помню его ник) выложены в виде статьи на www.gamedev.ru.
Submitted by glad on

GameDev.by