Моделирование воды / океана и физика


42

Я ищу некоторые ссылки на симуляцию воды, и как моделировать ее взаимодействие с телами (например, лодки, корабли, подводные лодки).

Я нашел много ссылок на визуальные аспекты воды (волны, отражения и т. Д.), Но очень мало о том, как справляться с тем, как она должна взаимодействовать с телами. Мой опыт разработки игр очень ограничен, и я действительно застрял здесь.

В принципе, я хотел бы иметь возможность изменять положение корабля в зависимости от волн. Как я могу это сделать?

Я использую Panda3D, но надеюсь услышать о методах и реализациях, используемых в любой доступной технологии.

Ответы:


79

В основном вы смотрите на моделирование 6 вещей для корабля: тангаж, рыскание, крен, кувырок, колебание и скачок.

альтернативный текст

Наклон, рыскание и крен - это повороты, которые может совершать корабль, когда он поворачивается и поворачивается вверх и вниз по склону волн. Подъем, раскачивание и прилив - это движения, вызванные волнами, толкающими корабль вокруг и / или судно, скользящее по поверхности волны.

"Как автомобиль, едущий по холмам ..."

Представьте себе лодку на воде, как автомобиль, едущий по холмистой местности. Если автомобиль едет по холмистой местности (как корабль, плывущий по волнам), он будет наклоняться и наклоняться, когда поднимается и опускается по холмам. Это поле, рыскание и крен. Если холмы (волны) велики, машина (корабль) будет двигаться вверх и вниз, качаясь, зевая и катясь по ходу движения. Если холмы (волны) действительно малы (меньше, чем автомобиль / корабль), то автомобиль (корабль) просто собирается проехать по ним, а не сильно наклоняться, рыскать или крениться.

Большой корабль может просто пахать через меньшие волны, в то время как маленький корабль будет двигаться вверх и вниз по волнам. Взяв пример с нашей машиной, представьте, что кто-то едет на велосипеде (маленьком корабле) по множеству небольших холмов (волн). Они будут катиться вверх и вниз, как они идут. Затем кто-то проезжает над ними большой грузовик (корабль). Грузовик больше, чем холмы, поэтому на самом деле не поднимается и опускается, когда пересекает их.

Однако, в отличие от машины, корабль находится на полпути в воду, поэтому его движения будут несколько ослаблены. Представьте себе автомобиль с действительно мягкой губчатой ​​резиной. Когда он движется по крошечным холмам, губчатые шины просто разглаживают его. Движение корабля также ослаблено, поэтому небольшие волны не заставят его подпрыгивать, как машина на каменистой дороге. Подводная лодка - своего рода окончательно затухший корабль, так как при погружении она в значительной степени невосприимчива к поверхностным волнам. Но если он на поверхности, он будет перемещаться волнами.

Корабль также будет скользить по волнам. Корабль, спускающийся с лица волны, будет, например, подниматься вперед. Итак, чтобы расширить пример нашего автомобиля, сделайте его автомобилем с большими губчатыми колесами, который едет по несколько скользкой поверхности. Если автомобиль не запускает двигатель для компенсации проскальзывания, он будет скользить по склону холма. Даже если он работает с двигателем, может произойти скольжение.

Единственное место, где возникают проблемы с аналогиями автомобилей и холмов, это то, что волны со временем меняют форму. Стационарный корабль будет качаться вверх и вниз, пока волны поднимаются и опускаются.

Волны двигают корабль

Если на корабле не дует ветер, который движется вдоль него, и волны имеют идеальную форму синусоиды, то корабль практически никуда не будет двигаться, пока он качается в волнах. Он скользит в одну сторону, когда идет вверх по лицу волны, а затем скользит в другую сторону, когда идет вниз по задней стороне волны.

Однако, если волны НЕ симметричны (как на картинке ниже), то волны будут перемещать корабль. Поскольку одна сторона волны крутая, корабль будет быстро скользить по этой стороне, а также будет отталкиваться от лица волны. Нежный обратный наклон волны, однако, не будет иметь большого движения.

альтернативный текст

Это не самая совершенная модель волнового движения и формы, влияющих на движение корабля, но она, вероятно, подойдет для грубого моделирования.

Эффекты ветра

Ветер также будет толкать ваш корабль такими способами, которые не зависят от движения волны или движения судна. Направление и сила ветра могут отличаться от направления и силы волн.

плавучесть

Плавучесть - это как хорошо плавает ваш корабль. Очень плавучие корабли плавают высоко в воде, а те, которые не плавучие, тонут. Нейтрально плавучие корабли (подводные лодки) могут в основном "зависать" в любой точке под водой, не тонуть и не подниматься. Если вы хотите смоделировать тонущий корабль, сделайте его плавучим, и он начнет тонуть.

Плавучесть также влияет на затухание движения корабля. Чрезвычайно плавучий корабль будет качаться на поверхности воды и подвергаться сильному воздействию волн. Корабль с меньшей плавучестью будет частично затоплен и не подвергнется такому воздействию. Подумайте о разнице между шариком для пинг-понга, плавающим на поверхности, и яблоком, которое плавает, но частично находится под водой. Мяч для пинг-понга качается вверх и вниз при каждом движении волны. С другой стороны, яблоко не реагирует на все детали волны.

опрокидывание

Если угол наклона, рыскание и / или крен превышают какое-либо значение, ваш корабль может опрокинуться. Когда он опрокидывается, он может заполняться водой, уменьшая плавучесть, тем самым не давая ему плавать.

Приступая к морю: o ~

Корабль, который движется параллельно направлению волнового движения, находится «в корыте» и, по моему опыту, будет вызывать самые отвратительные эффекты :) Если вы путешествуете в направлении движения волн, вы можете получить очень плавная езда - как ветер в спину. Если вы путешествуете в противоположном направлении, как волны, у вас будет довольно резкая поездка, когда вы будете ударять по каждой волне "холма", когда она наступает на вас. Делает для довольно захватывающей поездки, хотя!

Дальнейшее чтение

Вот три статьи, которые охватывают науку, стоящую за этим, которые могут дать вам некоторое представление. Хотя они и занимаются математикой и наукой, они могут дать вам представление о различных факторах.

Статья 1: Моделирование динамики судового крена и его связь с подъемом и уклоном

Статья 2: Моделирование и моделирование динамики морских надводных судов

Статья 3: Моделирование и моделирование динамики морских надводных судов

Автор проводит полевые исследования

Вот я лет 15 20 назад, когда работал на исследовательских кораблях :)

альтернативный текст


13
Как это возможно, что вы выглядите точно так же, как собака в вашем профиле? :-P
Notabene

лол, я этого не заметил, но ...
Тим Холт

Это весело !
BlueTrin

4

У вас есть симулятор воды?

Мои предложения

  • подделать его с пружинами. Каждая вершина на поверхности воды соединена в пружинную сетку. Потяните один вниз, и они все начнут колебаться. Вы можете ограничить движение по оси x, z и разрешить только движение y (или движение вверх / вниз)
  • подделать его, суммируя синусоиды разных амплитуд и частот. Что-то вроде этого:

    rez = 32;
    for(i=-rez; i<rez; i++)
       for(j=-rez; j<rez; j++)
       {
          yofs = 0;
          yofs += 1.0 * sin( t + j*0.5 + i*0.125);
          yofs += 2.0 * sin( t + (rez-j)*0.125 + i*0.25 );
          yofs += 2.0 * sin( t + (j)*0.125 + (rez-i)*0.125 );
          yofs += 0.5 * sin( t + (rez+j)*0.125 + (rez+i)*0.125 );
          glVertex(i/rez, yofs, j/rez);
       }
  • Имитировать двумерное волновое уравнение, это может быть очень быстро на GPU. Смотрите эту страницу для Java-апплета и некоторого псевдокода . Также проверьте эту версию, такую ​​же, но даже более простую. Эскиз обработки с кодом.

Из симуляции волнового уравнения вы можете получить направление (dx, dz) волны в

dx = h[x-1][z] - h[x+1][z] 
dz = h[x][z-1]- h[x][x+1] 

где ха 2D массив с высотой волны при [x] [z]

Вы можете добавить это к позиции лодки, чтобы она двигалась вместе с волной ... Я пробовал, но движение становится прерывистым, поэтому я сгладил его с помощью простого прямоугольного фильтра 3x3 (сглаживая различия / скорости dx dz)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.