Физическая модель внедорожника в 2D

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

 

В прошлых играх при реализации автомобилей у меня все было достаточно просто: когда игрок нажимает клавишу газ, я просто крутил моторчик с определенной скоростью и силой — машина постепенно разгонялась до максимальных скоростей и ничто не вызывало нареканий. Но с новой моделью машины что-то пошло не так. Я не мог подобрать оптимальную скорость и силу мотора. То машина не реально резко трогала с места, вырывая объекты из под колес, то ползла, как черепаха, не желая развивать скорость. Мне же хотелось, чтобы машина выглядела реалистично и по мере возможностей своего двигателя, как в реальной жизни, постепенно разгонялась. В итоге, я сделал вывод: проблема заключается в том, что я устанавливаю для авто только одну передачу, и из-за этого не получаю желаемого результата. Вот попробуйте в реальной жизни разогнаться на первой передаче до 100км/ч или тронуться с места на 4ой передаче?

Но почему же для старых машин во Flash все работало, а на Unity ничего не получилось!? Вроде и входные данные такие же: motor speed и motor torque. Впрочем, с этим я решил уже не разбираться. Скорее всего такая разница в более сложной физической модели автомобиля: больше амортизаторов, больше сложных и тяжелых колес, которые норовят намного быстрее остановится из-за силы трения, чем это было у более старых и простых моделей авто.

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

Закопавшись в статьи по физике автомобилей в играх, я понял что все не так просто, как кажется. Почитав статью Car Physics (Русская версия: Физика автомобиля для игр), пришло понимание, что нужно все сильно упрощать, и фактически мне нужна только симуляция работы двигателя с примитивной коробкой передач, где каждая передача — это просто коэффициенты, увеличивающие скорость и уменьшающие мощность. Где-то, в других статьях об авто, я наткнулся на идею расчета количества оборотов двигателя на базе количества оборотов колес. То есть, насколько быстро колеса вращаются — настолько быстро и эффективно работает двигатель. Звучит конечно глупо, но с другой стороны, у меня же не симулятор внедорожника, а всего лишь аркадная гонка и вообще, необходимость симуляции работы двигателя обусловлена решением других проблем, так что как там будут обороты считаться, совершенно не важно.

 

Взяв за основу код JCar - Unify Community Wiki проковырялся с этим целый день, многие вещи конечно пришлось сильно переделать. Но в итоге все получилось не плохо и даже близко к реальности: на первой передаче авто имеет большую силу двигателя (повышенное передаточное отношение) и маленькую скорость, за счет чего легко преодолевает даже самые сложные препятствия. А по мере разгона мощность двигателя снижается (снижается передаточное отношение коробки — если бы это было в реальности) и возрастает скорость, далее при подъемах на горки силы мотора (коробки) уже не хватает держать нужную скорость/обороты и происходит переход на пониженную передачу — в общем, все как в жизни.

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

Конечно, в самой игре наличие двигателя и коробки передач никак визуально не отражается, за исключением озвучки двигателя, так как основная задача заключалась в решении проблемы разгона машины, а не реализации симулятора внедорожника в 2D :)