Pull to refresh

Comments 30

В первую очередь спасибо автору и переводчику, статья действительно интересная.
Вопрос не знаю кому из вышеперечисленных: хорошо, вычислили силы действующие на треугольники (пусть даже только вертикальные), как дальше применить их к действию на корпус судна как целого объекта, нужен центр масс или какой-то другой принцип? тем более силы вращения там не избежать, если волны есть, в вертикальной плоскости например.
Думаю, это выходит за рамки статьи. Так как применение сил уже задача физического движка. В большинстве физических движков есть просто набор функций, которые позволяют применять силы к центру масс объекта или произвольной его точке. Внутри каждого объекта при этом обычно есть пара аккумуляторов, которые накапливают суммируемые силы и моменты сил относительно центра масс. То есть, с точки зрения клиентского кода надо пробежать по всем треугольникам и вызвать что-то типа «объект.добавить_силу(вектор_силы, точка_приложения)». Затем уже на этапе расчёта физического мира по накопленным в аккумуляторах силам рассчитываются ускорения (линейные и угловые соответственно), по ним скорости (аналогично, линейные и угловые), а по скоростям — перемещения.
Расчет точки приложения силы — это бесполезная трата вычислительных ресурсов, причем в некоторых сложных случаях ее, вообще, может не существовать. Правильным будет считать и применять отдельно силу и момент силы. Момент считается проще точки приложения, да и движку нужен только он.
Ваши черепахи побежали туда и сюда, я за ними не успеваю.
Вы относительно чего собрались считать момент сил если это и есть векторное произведение радиус-вектора от оси вращения до точки приложения силы и никак иначе? И что за такие сложные сложные случаи?
Ну и да, по теореме Эйлера любое движение есть суперпозиция поступательного и вращательного движения, ну можно раскладывать любое движение как угодно и не всегда однозначно. Ну да, есть теорема Вариньона — определяем момент сил относительно произвольной оси по действующим силам. Вы это хотели сказать?
Переход между моментами сил относительно разных точек тривиален, поэтому считаем его относительно любой удобной точки — обычно это центр масс всего тела. Сложные случаи — это когда полная сила равна нулю и есть только момент.

Собственно, в приложении А прекрасная иллюстрация всего этого: сначала находится момент сил, а потом решается уравнение, чтобы приравнять этот момент к нулю. Причем решение содержит деление, что может приводить к проблемам при нуле в знаменателе. Стоило бы остановиться после вычисления момента.
Вижу, появилось много вопросов, добавил постскриптум к статье.
Спасибо, жду продолжение перевода.
Еще один вопрос на который автор ответил, но как мне кажется не стал решать:
автор пишет про упрощение расчета сил на треугольник: «Это в особенности актуально при использовании низкополигональной сетки объекта для уменьшения ущерба производительности, потому что ошибка, сделанная для каждого треугольника, довольно значима.» И сам же автор использует в модели судна длинные треугольники (особенно видно на бортах модели) длина которых в четыре-пять раз длиннее сетки на воде. Соответственно если делить такой треугольник по методу автора получим точно нестабильность модели даже на относительно спокойной воде. А в при сильной волне проще вообще вращать судно плюс-минус волне и возможно будет похоже )
про решение забыл добавить: размер треугольников на модели должен коррелировать(соответствовать) с размером треугольника на воде.
Тот же метод, что и в статье, приоритет думаю здесь, но реализованный в софте UNITY3D и С#, с исходниками и комментариями к ним
думаю интересно сравнить
http://www.habrador.com/tutorials/unity-boat-tutorial/
К каждому треугольнику сила и прикладывается, а дальше уже дело физического движка сдвинуть/повернуть/наклонить корпус как надо в зависимости от всех приложенных сил. В этом и есть сила подхода, хотя и вычислительно затратно.

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


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

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


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

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

Да и горизонтальную составляющую вам никто не мешает учитывать, там же везде в формулах нормаль к поверхности треугольника, которая не обязательно вертикальна. Просто в случае, если волн нет, горизонтальная составляющая обнулиться.
Скачки быстро рассасываются, это да, вот только в формулу для равновесного давления входит ускорение точек жидкости. Если в случае статики там просто g, то в случае динамики добавится вклад от движения волн.

В общем, моя основная претензия в том, что сначала автор говорит, что будет рассматривать только статику, а потом пол статьи рассказывает, как он учитывал неплоскую поверхность воды. Причем видно, что делает это автор не понимая физику процесса, а формально применяя упрощенные формулы вне их области применения.
Абсолютно согласен с вами. Но думаю, для игры этого более чем достаточно. Если всю гидродинамику считать точно — это уже будет совсем не реальное время. И в 1 мс на корабль вы вряд ли уложитесь. Кстати, гидродинамика обещана в следующей статье.
Для игры, скорее всего, будет достаточно считать поверхность воды плоскостью (возможно, наклонной). Просто, вместо того, чтобы писать бред с физической точки зрения, надо было сказать, что «в качестве приближения для давления мы выберем...» и т. п.
Кстати, а сколько там этого вклада от движения волн по сравнению со статикий? Полагаю, расхождение будет от силы в несколько процентов. Что визуально в игре никто даже и не заметит. Даже статики достаточно, чтобы корабль на волнах на глаз покачивался правильно. А большего и не надо. Это же не инженерные расчёты. Тут как раз и надо искать баланс скорости и корректности.
Основное расхождение будет из-за того, что автор полностью пренебрегает боковой составляющей силы. Из-за этого, например, корабль не будет соскальзывать по наклонному боку волны. Т. е. считать давление через высоту поверхности воды над точкой — это нормально (хотя я б еще размывал карту высот с глубиной), но вот считать только вертикальную составляющую — это совсем некорректно.
Да, для меня это тоже загадка. В формуле же всё равно нормаль учавствует. И расчёт горизонтальных сил практически никак не скажется на производительности. Они фактически будут учитываться автоматически, если специально не занулять горизонтальные компоненты нормали.
Ещё интересно, как смоделировать волнение воды от взаимодействия с объектом.
Расчет на то, что если вы в таком коде поставите 2-3 if, решите свою задачу и ничего не сломаете, то считайте, что вы уже синьер:
https://github.com/blackberry/Bullet/blob/master/src/LinearMath/btVector3.cpp
Очень не хватает морских симуляторов. Самому спроектировать корабль и его же и затопить (по всем правилам физики) — вот это круто.
В одном НИИ в Петербурге работал над созданием условно-«HPC» кластера для расчета поведения твердых тел в жидкости в StarCCM
И конечно же напишешь об полученом опыте на хабре? Или в РФ-IT считается «работал» это типа стаж просиживания штанов, а не опыт?
Воу воу воу, полегче приятель, что за претензии на пустом месте. Я был со стороны интегратора и по большей части трудился над infiniband фабрикой. Сам я со StarCCM не знаком.
Не здесь ли случаем? Если да, то в каком это году было?
Там, но в одной из лабораторий, с Т-Платформами не связано
Кому интересно, можете почитать главу 4 из этой книги. (Находится по названию в гугле на первой странице.)
Sign up to leave a comment.

Articles