Аэродинамика в Unity ч.1
Немного расскажу о личном опыте разработки в Unity.
В данный момент я работаю над своим первым проектом. Это будет аркадный авиасимулятор в стиле low poly. А что самое главное в авиасимуляторе? Полёт, разумеется!
Работу я начал со знакомства с азами аэродинамики. Четыре силы удерживают тело в пространстве — звучит достаточно просто!
Сила тяжести в Unity уже есть. Сообщить телу силу тяги - вопрос двух строчек кода. Сила сопротивления и подъемная сила уже выглядят посерьезнее, но вряд ли там будет что-то сложное.
Подготовка
Чтобы самолёт полетел, нужен для начала сам самолёт. Можно было, конечно, заставить летать обычный куб. Но я решил немного разукрасить процесс разработки лично для себя.
Самолет имеется, но пока это просто моделька. Нужно, чтобы он обрел физические характеристики. Для этого в Unity есть компонент Rigidbody— его необходимо добавить к игровому объекту самолета.
Также необходимо, чтобы столкновения с другими объектами выполнялись согласно геометрии самолёта. В этом нам поможет компонент Mesh Collider — это коллайдер, который состоит из сетки, то есть чистой 3D модели.
Тут есть нюанс. Если игровой объект обладает Rigidbody, то Mesh Collider у него обязательно должен быть выпуклый — это значит, что отрезок, соединяющий любые две вершины модели, должен полностью лежать внутри него.
Я об этом вначале не знал, и в качестве мэша добавил модель корпуса самолета, вместе со стабилизаторами и крыльями. Unity умеет преобразовать такую сетку к выпуклой, но в результате получится нечто невразумительное:
Поэтому я сделал простенькую модель физического каркаса самолета, которая удовлетворяет условиям выпуклости.
Самолёт не взлетит, пока не наберёт скорость. Для этого у него должна быть возможность передвигаться по плоскости. Иными словами — нужно приделать ему функциональное шасси. Здесь пригодится компонент Wheel Collider. Я создал внутри объекта самолёта три пустых объекта, и каждому из них назначил этот компонент.
Реализация
Осталось самое интересное. Заставить объект, который тяжелее воздуха парить в небе! Функции, описанные мной здесь, — это мой первый подход. С того момента я сильно доработал код, но для соблюдения логики повествования от простого к сложному я привожу именно первую итерацию.
В коде ниже, используются параметры state и data
AircraftControlState state — хранит информацию о состоянии элементов управления. Например, текущая мощность двигателя.
AircraftData data — хранит информацию о характеристиках самолета. Таких как площадь крыла или площадь лобового сопротивления.
Тяга
Это сила, которую телу передаёт двигатель, она толкает самолёт вперед
Сила сопротивления
Сила сопротивления растёт со скоростью и в упрощённом варианте зависит только от площади профиля самолёта.
Подъемная сила
Последнее, что осталось, — это применить подъемную силу.
Итак, я применил поочередно эти три силы к телу (силу тяжести специально не нужно применять, она работает из коробки), настроил площадь крыла и площадь лобового сопротивления так, чтобы самолёт взлетал плюс/минус реалистично.
Самолёт уже летит. Полёт, конечное, выглядит неестественно, но уже есть с чем работать.
Во второй части можно прочитать о том, как я реализовал рули управления и попытался приблизить поведение самолета к естественному.
А в своём телеграм канале я регулярно делюсь прогрессом.