Приветствую всех, на связи Дима! Мы продолжаем разработку пиратского рогалика Bottle of Ghouls. Сегодня в статье постараемся больше раскрыть наши технические решения. Поехали!
Общее
В целом, за последнюю неделю сильно продвинулись со Steam page, и на финишной прямой с оформлением. Игра начала обрастать большим количеством переменных, чтобы балансить весь этот процесс. За месяц разработки, мы практически закончили кор геймплей. О том что осталось — расскажем в след статье. Когда добьем последние механики. Дальше — максимальное вылизывание системы, доведения до красоты и приятности. Теперь отойдем от общего к частному. В прошлых статьях просили рассказать некоторые технические решения. И эта статья как раз об этом.
Плавучесть кораблей
Для минимизации риска, разработку необходимо начинать с самых сложных систем. Будет неприятно, если вы сделали графику, сделали прыжки и полеты для своего персонажа, но передвижение в том виде, как вы придумали — не работает.
Что является самым сложным (как нам кажется) в игре про пиратов и парусные корабли? Море и поведение кораблей на воде. Все зависит от степени упрощения реального мира, который вы хотите показать.
Это может быть простейшая аркада, где корабли условно плавают (летают). Учитывать ветер? Учитывать погружение корабля? Учитывать сопротивление воды? Сопротивление ветра? Форму корпуса? И т.д. и т.п.
Одна крайность — полная аркадность, где все очень условно. С другой стороны — это симулятор. Мы приняли решение остановиться где-то посередине, без лишнего усложнения, но и не слишком упрощая. Получилось ли это? Я думаю — да.
Первая итерация
Для простоты восприятия попытаемся смоделировать поведение мяча на воде.
В самом упрощенном виде на мяч будет действовать две силы — сила тяжести, которая пытается мяч погрузить в воду. И сила Архимеда — которая мяч будет пытаться вытолкнуть из воды (плотность мяча меньше, плотности воды). Сила архимеда будет равна весу жидкости, вытесненной нашим мячом. Вес — совсем не то-же самое, что масса)
Совсем не сложно догадаться, что при равенстве двух сил — мы получим условие плавучести мяча.
Как же нам вычислить объем погруженного в воду?
Нас интересует объем сегмента шара. За h — мы принимаем глубину, на которую погружается шар (мяч). Все остальное понятно. Итак, наш условный мяч научился плавать. (Мы в теории понимаем, как рассчитать и заставить его плавать).
Что касается реализации в движке — выполняем все как описано. Добавляем силу тяжести, задаем массу объекта, рассчитываем объем шара
и собственно в самом простом варианте это все. Умножаем на вектор 0;0;1 и подаем в силу, которая толкает мяч вверх.
Как же нам это поможет заставить плавать корабль/лодку? Принцип остается тот-же, считаем объем вытесненной жидкости, умножаем на плотность и ускорение свободного падения. Чтобы рассчитать объем судна нужно взять интеграл от… Шучу-шучу. Мы же делаем игру, а не проектируем корабль. Но принцип остается тот-же.
У нас есть некий объект, на который действует сила тяжести и нам нужно добавить силу, которая будет компенсировать ее. Как же это сделать? Навешаем на наш “корабль” поплавки, которые будут выталкивать его из воды. Силу которая утягивает его на дно мы регулируем с помощью массы, силу которая выталкивает — путем увеличения объема поплавков — радиуса шара.
По ходу итераций, нам еще не раз придется это перенастроить, так как масса в нашей системе будет иметь большое влияние, ведь мы делаем игру, основанную на физике.
Описание сильно упрощено, даже в нашей игре система сложнее. У нас она учитывает скорость корабля, сопротивление развороту и ускорению, в нем есть ограничение силы и еще несколько (десятков) переменных, которые влияют на поведение корабля. +- такая-же система, как описан здесь, реализована в одном из проектов, который Epic Games предоставлял в качестве примера.
Интересно разобраться как заставить кораблик прыгать по волнам и взаимодействовать с шейдером? (шейдер обсчитывает ГПУ, физику корабля ЦПУ) Пишите комментарии и мы разберем один хитрый прием:)
Спасибо что дочитали!