Разрабатываю симулятор парусной яхты. Часть I

Текущий статус разработки
Текущий статус разработки

Идея начать разрабатывать этот симулятор возникла постепенно. Я давно пишу диздок про необитаемый остров и житие на нем, т.к. очень интересна тема выживаемости человека в жестких условиях.

Я прочитал книгу Алена Бомбара «За бортом по своей воле», где он пересек Атлантику питаясь исключительно рыбой и употребляя морскую воду с дождевой. Читаю сейчас Робинзона Крузо и подобную литературу. И еще я занимаюсь парусным спортом, поэтому все это мне очень нравится.

С самого начала я понимал, что задача будет не из легких. Будет ад, но тем она становилась для меня все интереснее.

И еще @tryagain так вкусно рассказывает про свой симулятор с самолетом, то мне захотелось тоже.

Погружение в морское дело

Яхта в воде это не просто парусная лодка, которая плывет, а ветер ее толкает. Даже скорее не так, ветер ее толкает в исключительных случаях и чаще всего яхта идет почти против ветра.

Первые корабли были с прямым парусным вооружением, это когда парус стоит перпендикулярно вектору движения корабля. Такие сооружения ходили в основном в фордевинд (об этом ниже). Конечно, некоторые модели имели возможность поворачивать мачту, но технически, если не было попутного ветра, — стояли и ждали его днями, а бывало и неделями. Возможности ходить лагом (зигзагами) у них не было.

Корабль с прямым парусным вооружением
Корабль с прямым парусным вооружением

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

Курс относительно ветра
Курс относительно ветра

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

Термины произошли в основном от голландского языка, некоторые от французского.

Я запомнил это так:
Левентик — ветер в лицо, от фр. le vent, типа вентилятор. Вентилятор в лицо, значит ветер прямо. На этом курсе парус полощется, лодка дрейфует

Фордевинд — от голл. voor de wind, по ветру. То есть ветер в спину дует. Едем. И кажется, что на этом курсе мы будем развивать максимальную скорость, но в действительности яхта ходит быстрее в бейдевинд (ниже объясню почему).

Галфвинд — от голл. halve wind, половина ветра. Если ветер впереди или сзади, то по бокам половинки, получается, дует в бок.

И так по остальным терминам.

Про парус

Парус в большинстве случаев работает не как парашют, а как крыло.

В основе этого лежит принцип Бернулли, чтобы понять его возьмите лист A4, приложите коротким торцом ко рту, подуйте ниже листа. Он поднимется. Все логично. Но что будет, если мы подуем выше листа? Ничего не будет? Как бы не так. Лист начнет подниматься. Это многих удивляет, но так все работает. Скорость потока воздуха снижает давление сверху и атмосферное давление снизу приподнимает лист. Та самая подъемная сила.

Поэтому крыло самолета имеет такой профиль. Сверху воздух проходит больший путь, следовательно его скорость выше.

Принцип Бернулли. Вы все верно заметили, парус это фактически крыло самолета.
Принцип Бернулли. Вы все верно заметили, парус это фактически крыло самолета.

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

Сложности и разная наука

Но, если бы все так было просто. Кроме ветра у нас есть Архимедова сила. То есть яхта не стоит на земле как машина, она вообще ничего не знает о воде и воздухе. Да, сила работает, выталкивает яхту вверх из воды, парус работает.

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

Поэтому у яхты есть киль (или шверт), а также руль.

Гидродинамика + аэродинамика
Гидродинамика + аэродинамика

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

Вот на этой картинке должно быть понятнее:

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

Силы прилагаемые к яхте
Силы прилагаемые к яхте

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

Таким образом на яхту действует множество векторов. И это мы еще не затронули волны, развесовку, типы и формы парусов, типы корпусов и прочее. У всех есть ньюансы, но пожалуй достаточно. Я затрону это в следующих частях.

Начинания

Разработку веду на Godot 4 (недавно вот обновился на 4.6), там есть встроенный физический движок, хотя и без плавающих тел.

В основе лежит RigidBody3D. Провел множество экспериментов, но в итоге оказалось, что цельное тело мне не поможет. Сперва я просто вектором прилагал силу к мачте, но чем дальше добавлял моменты (крен, течение, руль) то понял, что надо все переделывать.

Первый блин огромным комом
Первый блин огромным комом

Поэтому я начал все с нуля. Почитав статьи и переняв опыт других разработчиков решил, что лучше всего будет работать система буйков.

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

Все параметры я вывел на панель настроек (это не все, а только динамические).

Динамические параметры
Динамические параметры

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

Сначала я обеспечил плавучесть. Я честно пытался снять параметры с реальной яхты, типа Santer 760 или MX 700 на которых ходил, но ничего не вышло. Вроде все было правильно и расчеты тоже, но вот масса у меня сейчас 200 кг. Это бред полный, но именно с такой массой она работает. Этот момент я еще обдумываю, но скорее всего от физ. движка ожидать прям совсем реальности не стоит. Или я просто недостаточно все хорошо сделал. Поэтому, еще думается.

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

И еще буи, которые расположены на севере, юге и по центру. Чтобы ориентироваться.

Поплыли!

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

Сначала я создал три точки, галсовый (спереди на стыке мачты и гика), шкотовый (в конце гика), файловый (вверху мачты). Гик, это палка прикрепленная к мачте, которая поворачивает грот (парус).

Создал обычный треугольник с помощью кода. Потом доработал до 36 вершин и стал думать как мне его "надувать" от направления ветра. В голове все было просто, создам шейдер, найду центральную вершину и буду ее поднимать с соседними. Но как бы не так.

Шейдер по факту работает с UV, а парус у меня треугольный, поэтому он становился квадратным, я делал отсечку (маску), делал сдвиг верхней вершины по шкаторине от верху к низу, но ничего не вышло у меня и я бросил эту затею.

Немного подумав, я решил управлять физикой паруса прямо в коде. Проще двигать вершины, ведь я их там создаю. Код имеет доступ ко всему парусу, а шейдер нет. После еще одной недели стало выглядеть сносно. Реагирует на ветер и в левентике происходит полоскание.

Текущий статус разработки

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

С непосредственно моделью яхты пока заниматься не планирую, поскольку из реально существующих по параметрам совсем мало, но класса они совсем другого (типа Луч, но даже по видео понятно, что это ни разу не Луч).

И если устану от физики, — сделаю волны и барашки + следы водные от яхты. Вот так! Телеграм канала у меня нет, дневник разработки буду вести здесь. Если вам интересно, — подпишитесь, чтобы ничего не пропустить!

20
1
10 комментариев