Волна - Проблема - решение. GML и прочее. - Разработка игр на Game Maker (Simple Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Проблема - решение. GML и прочее. » Волна
Волна
sanek-x107 Дата: Понедельник, 12.07.2010, 08:41 | Сообщение # 1
Хоть палкой гони
Группа: Проверенные
Сообщений: 770
Статус: Offline
И снова здравствуйте. На этот раз у меня вопрос про волны, конкретнее вопрос сейчас объясню.

Случай первый.
У нас есть какая-то 2d вода, при этом ее поверхность можно свободно изгибать. Сам вопрос. Предположим, что-то упало в воду. Тогда та точка, в которой тело соприкоснулось воды, переместится вниз - но как теперь вычислить положения точек слева и справа, если учитывать еще и то, что могло упасть второе тело в некоторой другой точке? Другими словами, какая зависимость положения точек от положения точки слева от нее и точки справа от нее?

Случай второй.
Все то же самое, только вид сверху. Если объясните случай первый - случай второй, думаю, вытекает из него, только там положение точки зависит от положения окружающих ее восьми точек.

Прикрепления: 3616737.png(4Kb)


http://gmbook.sx107.netai.net
Мама, я - дебил!
 
WertyXBOCT Дата: Понедельник, 12.07.2010, 09:17 | Сообщение # 2
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Храни не положение точки, а силу на нее воздействующую. Интерполируй линию сил, и затем отображай результат.


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
sanek-x107 Дата: Понедельник, 12.07.2010, 11:21 | Сообщение # 3
Хоть палкой гони
Группа: Проверенные
Сообщений: 770
Статус: Offline
Не совсем понял твою мысль, честно говоря. Силу - ты имеешь в виду результирующую силу?


http://gmbook.sx107.netai.net
Мама, я - дебил!
 
Druce Дата: Понедельник, 12.07.2010, 16:41 | Сообщение # 4
Каждый 5й пост мой
Группа: Страж
Сообщений: 1543
Статус: Offline
Как говорят в школе, "волны на воде - это наиболее наглядный и наиболее сложный пример волн". Я бы порекомендовал для эффекта волны создавать именно волновые объекты, а не просчитывать движение воды исходя из сил. Т.е. каждый объект при падении в плоскую воду создает 2 объекта (ну пусть даже не настоящих объекта, а группы данных в списке) волн - влево и вправо. В каждом объекте например написано что его волна имеет форму 1 периода синуса, т.е. функция от координаты волнового объекта и координаты, в которой ищется смещение. Затем для каждой точки водной поверхности надо сложить все волновые объекты, т.е. смещения, которые они создают в этих точках. Есть у меня старый мой пример - http://druce.ucoz.ru/load/0-0-0-27-20. Здесь правда волны друг с другом еще толком не складываются. Сейчас сдлаю быстренько новый, правильный.
зы. А еще волны на воде имеют дисперсию - разная длина волны передается с разной скоростью.

Добавлено (12.07.2010, 16:41)
---------------------------------------------
Не дочитал немного.
Соответственно для случая 2д-вид сверху объект будет хранить информацию о цилиндрической волне, т.е. она идет кругом во все стороны. Не очень правда представляю как ты будешь ее рисовать без 3д-рендеринга, тут даже изометрия не прокатит. Ну только если на каждый треугольник натягивать текстуру.



druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
 
WertyXBOCT Дата: Понедельник, 12.07.2010, 16:53 | Сообщение # 5
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
У меня где то пример лежит волн на воде. Давно скачивал). Я поискал, наверно на старом компе валяется. К сожалению флешку потерял, и скачать с него ничего не могу без преодоления лени).
Попробуй использовать физику верлета.


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
Druce Дата: Понедельник, 12.07.2010, 17:31 | Сообщение # 6
Каждый 5й пост мой
Группа: Страж
Сообщений: 1543
Статус: Offline
Quote (WertyXBOCT)
Попробуй использовать физику верлета.

Оу, как сложно. Это было бы нужно, если волны создавать сильно неправильной формы с кучей сил (я право не знаю как ты будешь учитывать вязкое трение, пропорциональное градиенту скорости).
А для синусоидальных волн я примерчик сделал: http://druce.ucoz.ru/load/0-0-0-54-20. Вроде как подробно откомментировал. При точности в 4 пикселя у меня выдавал 250 фпс с волнами (ноут не сильно силен).


druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
 
WertyXBOCT Дата: Понедельник, 12.07.2010, 19:00 | Сообщение # 7
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Druce, чего какой злой) я предложил протянуть линию из верелтовых частиц, и ограничить движение по оси х в пределах пары пикселей.


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
sanek-x107 Дата: Понедельник, 12.07.2010, 22:06 | Сообщение # 8
Хоть палкой гони
Группа: Проверенные
Сообщений: 770
Статус: Offline
Quote (Druce)
Не очень правда представляю как ты будешь ее рисовать без 3д-рендеринга, тут даже изометрия не прокатит.

Есть эфект воды, Хвост подтвердит. Теперь дело только за тем, чтобы сделать ему реалистичные волны, а в этом и вся проблема.

Quote (WertyXBOCT)
линию из верелтовых части

Слух, а неплохая идея, правда, неэффекитвная по-моему.
Пример щас посмотрю, Druce, спасибо заранее.

Добавлено (12.07.2010, 22:06)
---------------------------------------------
//Рассчитываем синусоидальную добавку с экспоненциальным затуханием
Можно поподробнее? А то в плане экспотенты я знаю лишь ее значение и, если не ошибаюсь, экспотента - предел какой-то там хрени.
А в целом пример дошел, спасибо огромное!
Но что поменяется во втором случае?
Кстати:

Code
room_caption=string(fps+'  ЛКМ - создать волну. By Druce')//Отображаем фпс в заголовке

Эх ты, с аргументами плюсика ступил wink
Да, и как раз вот это я искал:

Code

     tempy+=lengthdir_y(tempamplitude,360*(j*precision-tempx)/tempwavelength)*exp((j*precision-tempxstart)/tempdecrement)
     tempy-=lengthdir_y(tempamplitude,360*(j*precision-tempx)/tempwavelength)*exp((tempxstart-j*precision)/tempdecrement)

Но до меня немного не доходит, если честно. Можешь объяснить?


http://gmbook.sx107.netai.net
Мама, я - дебил!


Сообщение отредактировал sanek-x107 - Понедельник, 12.07.2010, 22:08
 
Druce Дата: Вторник, 13.07.2010, 00:36 | Сообщение # 9
Каждый 5й пост мой
Группа: Страж
Сообщений: 1543
Статус: Offline
Quote (sanek-x107)
Эх ты, с аргументами плюсика ступил

Оу, ну ступил))
Quote (sanek-x107)
Можно поподробнее? А то в плане экспотенты я знаю лишь ее значение и, если не ошибаюсь, экспотента - предел какой-то там хрени.

Экспонентой называется функция e^x, где один из вариантов определения числа е (их несколько разных) - это предел (1+1/x)^x при х стремящемся к бесконечности.
А в природе в большинстве случаев затухание чего-либо есть функция экспоненциальная в некотором приближении. Если через формулы, то это происходит, когда скорость изменения величина прямо пропорционально самой этой величине. Выглядит затухание примерно так: здесь функция sin(10x)*exp(-x).

В данном случае затухание пропорционально времени, координата тоже времени. Характерное расстояние выбирается из соображений чтобы красиво было.
Далее - по коду. Волна как я ее задумал - это один период синуса. Спереди по ходу движения горб, сзади впадина. Главное что нужно определить - это фазу волны в данной точке. Я здесь не использую совсем каноничное уравнение y=y0 cos(wt-kx), а разруливаю все только через координату. По модулю фаза - это 2п (360 градусов) умножить на отношение координаты к длине волны. Причем координата считается относительно центра волны и добавка от конкретно этой волны рассчитывается только в пределах х+-длина волны/2. И еще тут важно что во-первых легдир игрек - это минус синус, поскольку в гм координата у считается вниз, а во-вторых при движении влево и вправо координату надо брать с разным знаком, чтобы горб был в направлении движения.
Quote (WertyXBOCT)
Druce, чего какой злой)

Я не злой, я просто физик по состоянию души. И я к сожалению знаю, как правильно описываются волны в общем виде.
Quote (WertyXBOCT)
я предложил протянуть линию из верелтовых частиц

Ну в принципе можно и так, просто я никогда особо не использовал верлетово интегрирование (кстати надо бы попробовать) и предпочитаю использовать функции, которые придумали задолго до меня чем всякие там хитрые интегрирования. А еще я не очень себе представляю как смоделировать в плоском случае силу поверхностного натяжения, которая пропорциональна длине границы, вдоль которой действует сила, если эта самая граница сливается в точку. Наверное надо силу тут принимать константной и брать ее проекцию на вертикаль.
Может потом еще сделаю расчет волн на основе интегрирования верлета, если не сильно влом будет.
Прикрепления: 5981154.png(18Kb)


druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
 
sanek-x107 Дата: Вторник, 13.07.2010, 10:36 | Сообщение # 10
Хоть палкой гони
Группа: Проверенные
Сообщений: 770
Статус: Offline
Druce, просветил, спасибо тебе большое. Просто я не сразу понял, как ты координату волны вычислил, я как раз каноничную формулу искал y=A*cos(w0+wt) или ту, что ты назвал (y=y0 cos(wt-kx)) у тебя в коде.Еще раз спасибо.
Да, и дополнительный вопрос. Экпонентонециональное затухание, во-первых, как пишется это слово? А во-вторых, что, когда машина едет (причем не идеально аэродинамическая и не в ваккуме), оно тоже имеет место, так как чем выше скорость, тем выше сопротивление среды? Просто я всегда это высчитывал по-другому.

Добавлено (13.07.2010, 10:36)
---------------------------------------------
Ах да, еще вопрос. Доказано ли кем-нибудь, что в природе имеет место как раз экспонентоциональное затухание, а не, например, (1,5)^(-x)



http://gmbook.sx107.netai.net
Мама, я - дебил!
 
Druce Дата: Вторник, 13.07.2010, 13:31 | Сообщение # 11
Каждый 5й пост мой
Группа: Страж
Сообщений: 1543
Статус: Offline
Quote (sanek-x107)
я как раз каноничную формулу искал y=A*cos(w0+wt)

ну если ты имел в виду A*cos(wt+ф0), то это каноничная формула для гармонического колебания, которое не распространяется в пространстве, так как в нем нет добавки, связанной с координатой. Т.е. ты можешь нарисовать график у(t) на плоскости, так здесь y есть функция только одной переменной.
Quote (sanek-x107)
y=y0 cos(wt-kx)

Эта формула является каноничной именно для распространения волны. Если ты зафиксируешь в ней либо х, либо t, то график у тебя получится такой же, как и в прошлой. А если ты нарисуешь график y(х) и сделаешь несколько кадров через равные промежутки времени, то увидишь, как форма графика у тебя сохраняется во времени, но при этом еще и равномерно двигается вправо.
Quote (sanek-x107)
Экпонентонециональное затухание, во-первых, как пишется это слово?

Экспонента, соответственно экспоненциальный.
Quote (sanek-x107)
А во-вторых, что, когда машина едет (причем не идеально аэродинамическая и не в ваккуме), оно тоже имеет место, так как чем выше скорость, тем выше сопротивление среды?

Совсем каноничное экспоненциальное затухание скорости имеет место, если сила пропорциональна скорости линейно. Линейная зависимость имеет место, например, при движении в вязкой жидкости с не очень большой скоростью. А движение в воздухе, особенно быстрое, приводит к силе сопротивления, пропорциональной квадрату скорости. Соответственно скорость и координата от времени имеют уже несколько не такие зависимости, но по форме на самом деле похожие. Если очень интересно, могу тебе повыводить.
Quote (sanek-x107)
Просто я всегда это высчитывал по-другому.

Ну это тот же вопрос что и с волнами. Я предлагаю уже готовое решение теоретическое, в котором получены все формулы и надо только подставить нужные константы и аргументы, а ты предлагаешь по сути как и Вертихвост, численное интегрирование движения. Если ты возьмешь силу пропорциональной скорости линейно и аккуратно построишь численным интегрированием график скорости от времени, то получишь экспоненту в пределах погрешности вычислений ГМ (сам сталкивался, приходилось рассчитывать движение, в котором весь процесс ускорения занимает пару миллисекунд и он отнюдь не линеен. При этом в масштабе времени 1:100 и 1:1000 погрешность была процентов до 20, то есть для правильного вычисления приходилось делать очень-очень мелкий шаг. это был случай, когда аналитического решения уравнение движения не имело).
Quote (sanek-x107)
Доказано ли кем-нибудь, что в природе имеет место как раз экспонентоциональное затухание, а не, например, (1,5)^(-x)

В общем случае затухание - это не exp(-x), а exp(-kx), где k - некоторая постоянная "скорости затухания" (декремент). А в школе учат, что 1.5=exp(ln(1.5)). Соответственно 1.5^(-x)=exp(-x*ln(1.5)). А использование именно экспоненциального представления, а не степенного имеет свои преимущества в том, что экспонента очень просто интегрируется и дифференцируется.
А хитрое затухание - это если бы у тебя было например exp(-x^1.5). Но это на самом деле крайне редко встречается, поскольку слишком сложны соответствующие диффуры для уравнения движения и слишком маловероятно появление в природе именно такого закона силы.
Вывод - большинство затуханий в природе можно представить как экспоненциальные с небольшой погрешностью.


druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
 
sanek-x107 Дата: Среда, 14.07.2010, 12:30 | Сообщение # 12
Хоть палкой гони
Группа: Проверенные
Сообщений: 770
Статус: Offline
Слух, а как будет во втором случае? там-то уже 3, а не 2 координаты.


http://gmbook.sx107.netai.net
Мама, я - дебил!
 
Druce Дата: Среда, 14.07.2010, 14:18 | Сообщение # 13
Каждый 5й пост мой
Группа: Страж
Сообщений: 1543
Статус: Offline
sanek-x107, там просто надо будет функцию делать не z(x,t), а z(r,t), где r=sqrt((x-x0)^2+(y-y0)^2). Т.е. у тебя волна будет распросраняться симметрично во все стороны, и ее смещение зависит от пройденного расстояния. Еще если быть совсем честным, то там по идее помимо экспоненциального затухания амплитуда должна представлять собой A=A0/sqrt®, по крайней мере для цилиндрической волны в сплошной среде так (не уверен насчет волн на воде, т.к. они все же бегут по разделу воды и воздуха). Ну а чтобы это все отрисовывать, тебе придется делать добавки волн не по списку одномерному, а по плоской таблице. В принципе это тоже вполне реально. Если очень надо - могу сделать пример, правда там будет туго с визуализацией. Уж не знаю, собираешься ты там изометрию делать или еще что.


druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
 
sanek-x107 Дата: Среда, 14.07.2010, 20:15 | Сообщение # 14
Хоть палкой гони
Группа: Проверенные
Сообщений: 770
Статус: Offline
Да, надо, если не проблема (извини, что наглею - ну тупой я, что поделать!) Мало чего доходит, если честно.
А по поводу визуализации - проблем нет. у меня есть интересный эффект воды, он искривляет под собой землю, да еще и текстуру воды добавляет. Все высоты
(z-координаты) каждого вертиксла хранятся при этом в ds_grid, очевидно как.


http://gmbook.sx107.netai.net
Мама, я - дебил!
 
Druce Дата: Четверг, 15.07.2010, 01:05 | Сообщение # 15
Каждый 5й пост мой
Группа: Страж
Сообщений: 1543
Статус: Offline
sanek-x107, ладно, напишу я тебе сейчас просчет таких волн, но с визуализацией я не знаю как быть, тут уж сам сочинять будешь. А искривление изображения земли я тоже наврядли так вот с ходу сочиню. Может найду просто подходящую текстурку и буду натягивать. Хотя чем черт не шутит. Кстати, если не секрет, для чего тебе волны рисовать надобно? Ежели двумерный случай - так там переборов вполне себе дофига будет, и кушать ресурсов это будет много.

Добавлено (15.07.2010, 01:02)
---------------------------------------------
Ну вот, за два часа сделал: http://druce.ucoz.ru/load/0-0-0-55-20. Текстуры воды у меня другой под рукой не было, на этой плохо видно волны, поэтому есть еще и вертексное отображение. Комменты старался оставить по возможности подробней. Каноничная формула™ волны присутствует, соответственно информация о волновом объекте, единожды записанная в список, уже не нуждается в обновлении, из нее все рассчитывается только через текущее время.

Добавлено (15.07.2010, 01:05)
---------------------------------------------
А чтобы сделать правильный эффект преломления света в воде, придется сильно постараться и порассчитывать, из какой точки земли отраженный свет, преломляясь, выйдет наружу ровно вертикально. Когда-нибудь может займусь. Напомни мне через недельки две.



druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
 
sanek-x107 Дата: Четверг, 15.07.2010, 01:45 | Сообщение # 16
Хоть палкой гони
Группа: Проверенные
Сообщений: 770
Статус: Offline
Стой-стой, ну что ты, не перестарайся. Эффект воды я и так сделаю, роблема в физике.
Слух, а что теперь-то в wavekoord хранится? относительная высота?


http://gmbook.sx107.netai.net
Мама, я - дебил!
 
Druce Дата: Четверг, 15.07.2010, 15:09 | Сообщение # 17
Каждый 5й пост мой
Группа: Страж
Сообщений: 1543
Статус: Offline
sanek-x107, правда штоле сам сделаешь правильное преломление? Нуну. Это тебе надо к каждому треугольничку будет искать нормаль, а затем искать точку на текстуре земли, выходя из которой луч преломится на границе раздела относительно нормали и выйдет ровно вверх. А потом еще надо будет как-то картинку эту сгладить. Так сказать, биг челлендж.
Quote (sanek-x107)
Слух, а что теперь-то в wavekoord хранится? относительная высота?

Ну сейчас скорее абсолютная, принимая во внимание, что высота невозмущенной водной поверхности равна нулю. И это высоту смещения я просто добавляю при рисовании каждого вертекса.
Какие там еще вопросы про физику? Ты задавай пока быстрее, я через часов так 35 уеду.


druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
 
sanek-x107 Дата: Четверг, 15.07.2010, 19:45 | Сообщение # 18
Хоть палкой гони
Группа: Проверенные
Сообщений: 770
Статус: Offline
Преломление я уже делал, но там был с одним треугольником и каждый пиксел высчитывался - по-тупому. И сразу у меня к тебе вопрос.

Вот если попытаться определить, какую точку мы увидим вместо точки на Треугольнике, то там все ясно - нормаль к треугольнику, а потом по отношению синусов. Это для меня пройденный этап. Но! Что мы увидим, когда посмотрим на Вертикл? Кагбе понимаешь, В точке-то нормаль не построишь а к какому треугольнику строить нормаль - хз. Картинка с описанием проблемы ниже.

Добавлено (15.07.2010, 19:45)
---------------------------------------------

Quote (Druce)
И это высоту смещения я просто добавляю при рисовании каждого вертекса.

Видел-видел. Это так для паралакса делают, но ведь вид-то сверху. Так что надо писать специальные функции для проекции точки, а с этим проблемы, благо, нет.
Прикрепления: 9413218.png(11Kb)


http://gmbook.sx107.netai.net
Мама, я - дебил!
 
Druce Дата: Четверг, 15.07.2010, 19:52 | Сообщение # 19
Каждый 5й пост мой
Группа: Страж
Сообщений: 1543
Статус: Offline
Quote (sanek-x107)
Что мы увидим, когда посмотрим на Вертикл?

Ты наверное имел в виду вертекс? Я бы предложил делать так - для каждого треугольника строишь нормаль, и высчитываешь для этого треугольника координаты точек на земле, из которых свет после преломления выйдет вертикально в вершинах треугольника. Затем грубо говоря натягиваешь треугольник, образованный рассчитанными точками на земле на треугольник, образованный самими вертексами. Таким образом твоя поверхность воды будет состоять из кучи треугольников, вырезанных из земли под ней. Затем надо поверхность воды замутить, замылить и наложить текстурку, и вроде как все будет хорошо.
То есть ты не будешь рассчитывать именно каждую точку воды и соответствующую каждую точку земли, а манипулировать треугольниками. Соответственно у тебя появятся резкие грани треугольников и их углы, на которых картинка земли будет сравнительно резко обрываться.


druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
 
sanek-x107 Дата: Четверг, 15.07.2010, 21:13 | Сообщение # 20
Хоть палкой гони
Группа: Проверенные
Сообщений: 770
Статус: Offline
я понимаю, естесно не каждый пмиксел высчитывать. проблема в возникающем конфликте - одна точка принадлежит нескольким треугольникам, и мы на одну точку натягиваем 6 разных!

Добавлено (15.07.2010, 21:13)
---------------------------------------------
кстати, то же самое с границей между треугольников



http://gmbook.sx107.netai.net
Мама, я - дебил!
 
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Проблема - решение. GML и прочее. » Волна
Страница 1 из 212»
Поиск:



Сообщество Gmaker.SU 2005-2012
Используются технологии uCoz
Простой вход