Как сделать колесо в unity
Простая машинка в Unity
Урок по созданию простой машинки в среде Unity при помощи компонента WheelCollider. Описаны базовые настройки этого компонента. Для понимания урока необходимы базовые знания среды Unity.
Введение
С английским у меня неплохо, поэтому когда понадобилось сделать машинку в проекте, хватило стандартного примера, однако, хоть и написано, что он «аркадный», все же пример затрагивает гораздо больше вопросов, и один только pdf документ весит 11 мб, а сам пример 212 мб.
От того примера сложилось впечатление, будто нам дали готовый проект, рассказали как менять параметры, чтобы можно было поиграться, но не стали особо объяснять, как его сделали шаг за шагом. Кроме того, он на английском, отсюда родился порыв сделать урок для GameDev.ru.
Я хочу описать самый примитивный вариант создания машинки, управляемой с клавиатуры, освоив который уже стоит браться за более сложные примеры.
Создаем по шагам
1. Итак создадим четыре пустых объекта для удобной иерархии в нашем объекте:
- carRoot — контейнер для всех элементов машины (геометрия, свет, камеры, объекты для скриптов)
car — контейнер для объектов именно машины,
physic — контейнер для физических моделей колес,
graphic — графические объекты.
2. Добавим в carRoot камеру и закинем на нее стандартный скрипт SmoothFollow, однако на 32 строке добавим или внешнюю переменную angle, или просто добавим поворот на 90 градусов, так как стандартный скрипт заставляет камеру быть сбоку от объекта :
3. в car добавляем компонент RigidBody, его масса — это масса корпуса машины, она будет влиять на устойчивость и на то, насколько сильно он прижимает колеса.
Для того чтобы на поворотах нас не сильно заносило, и при падении машина возвращалась в правильное положение, а не переворачивалась, нам потребуется два изменения — компонент ConstantForce в car, который будет прижимать машину на поворотах, кроме того, переместим центр массы машины вниз, добавив на нее скрипт carControl с кодом вроде этого:
4. В physic создаем пустой объект body с компонентом CapsuleCollider — это будет простой корпус машины, обтекаемый и не дающий застревать в стенках.
5. создаем пустой объект wheel_BL и добавляем ему компонент WheelCollider, и настраиваем его:
- Center — расположение колеса,
Radius — радиус колеса,
Suspension Distance — длинна пружин подвески.
Suspension Spring : Spring — сила пружины подвески, чем выше тем сильнее пружинит,
Suspension Spring : Damper — сила амортизатора, делает более плавным движение пружины.
Mass — масса колес, опять же влияет на поведение на заносах, прыжках.
Теперь добавим в объект wheel_BL простой цилиндрический меш, чтобы так сказать, иметь отладочную версию, впрочем, можно ограничится тем, что Unity нам и так предоставляет.
6. Раскопируем наше колесо до нужного числа, например, 4 — в принципе, машинка уже готова.
Теперь нам нужно только заставить колеса вращаться с ускорением по нажатию клавиш и поворачиваться, что можно сделать например так :
Заключение
Собственно, теперь вы можете соорудить любое нечто на колесах, можно прикрепить две группы (подвески) по два колеса друг к другу джоинтами (как в этом уроке) или сделать вращение колес при развороте, как у танка. Широкий простор для креатива.
Wheel Collider
The Wheel Collider is a special collider for grounded vehicles. It has built-in collision detection, wheel physics, and a slip-based tire friction model. It can be used for objects other than wheels, but it is specifically designed for vehicles with wheels.
Свойства
Детали
The wheel’s collision detection is performed by casting a ray from Center downwards through the local Y-axis. The wheel has a Radius and can extend downwards according to the Suspension Distance. The vehicle is controlled from scripting using different properties: motorTorque, brakeTorque and steerAngle. See the Wheel Collider scripting reference for more information.
Wheel Collider рассчитывает трение отдельно от остального физического движка, используя модель трения, основанную на скольжении шин. Это позволяет реализовать более реалистичное поведение, и при этом, Wheel Collider’ы игнорируют стандартные настройки Physic Material (физического материала).
Настройка Wheel Collider
Wheel Collider’ы отделены от видимых моделей колёс
Note that the gizmo graphic for the WheelCollider’s position is not updated in playmode:
Положение гизмо WheelCollider’а во время работы игры при расстоянии подвески 0.15
Геометрия для коллизий
Видимая геометрия (слева) намного сложнее, чем геометрия для коллизий (справа)
Кривые трения колеса
Трение шины может быть описано показанной ниже кривой трения колеса. Существуют отдельные кривые для прямого (вращение) и бокового направления колеса. В обоих направлениях сперва определяется то, как сильно скользит шина (на основании разности скоростей между резиной шины и дорогой). Затем значение скольжения используется для того, чтобы найти силу, применяемую шиной к точке соприкосновения.
Типичная форма кривой трения колеса
У настоящих шин есть свойство испытывать большие нагрузки при низком скольжении, так как резина компенсирует скольжение растягиванием. Далее, когда скольжение становится действительно большим, нагрузка снижается, т.к. шина начинает проскальзывать или крутиться. Поэтому кривые трения шин имеют форму аналогичную той, что представлена на изображении выше.
Wheel Collider
For guidance on using the Wheel Collider, see the Unity Wheel Collider tutorial.
Свойства
Свойство: | Функция: |
---|---|
Mass | Масса колеса. |
Radius | Радиус колеса. |
Wheel Damping Rate | This is a value of damping applied to a wheel. |
Suspension Distance | Максимальное расстояние расширения подвески колеса, измеряется в локальном пространстве. Подвеска всегда расширяется вниз по локальной оси Y. |
Force App Point Distance | This parameter defines the point where the wheel forces will applied. This is expected to be in metres from the base of the wheel at rest position along the suspension travel direction. When forceAppPointDistance = 0 the forces will be applied at the wheel base at rest. A better vehicle would have forces applied slightly below the vehicle centre of mass. |
Center | Центр колеса в локальном пространстве объекта. |
Suspension Spring | Подвеска пытается достичь значения Target Position с помощью пружины и сил сопротивления. |
Spring | Сила пружины, пытающаяся достичь Target Position. Чем больше значение, тем быстрее подвеска будет стремиться к Target Position. |
Damper | Добавляет сопротивление в подвеску. Чем больше значение, тем медленней будет двигаться Suspension Spring (пружина подвески). |
Target Position | The suspension’s rest distance along Suspension Distance. 1 maps to fully extended suspension, and 0 maps to fully compressed suspension. Default value is 0.5, which matches the behavior of a regular car’s suspension. |
Forward/Sideways Friction | Свойства трения шины, когда колесо катится вперёд и в сторону. См. ниже секцию Кривые трения колеса. |
The Wheel Collider Component. Car model courtesy of ATI Technologies Inc.
Детали
Определение столкновений колеса производится с помощью картинка луча из Center вниз по локальной оси Y. У колеса есть Radius и оно может опускаться вниз в соответствии с Suspension Distance. Транспорт контролируется из кода, с помощью разных свойств: motorTorque, brakeTorque и steerAngle. См. справку по классу WheelCollider для дополнительной информации.
Wheel Collider рассчитывает трение отдельно от остального физического движка, используя модель трения, основанную на скольжении шин. Это позволяет реализовать более реалистичное поведение, и при этом, Wheel Collider’ы игнорируют стандартные настройки Physic Material (физического материала).
Настройка Wheel Collider
Wheel Colliders are separate from visible Wheel Models
Note that the gizmo graphic for the WheelCollider’s position is not updated in playmode:
Position of WheelCollider Gizmo in runtime using a suspension distance of 0.15
Геометрия для коллизий
Visible geometry (left) is much more complex than collision geometry (right)
Кривые трения колеса
Трение шины может быть описано показанной ниже кривой трения колеса. Существуют отдельные кривые для прямого (вращение) и бокового направления колеса. В обоих направлениях сперва определяется то, как сильно скользит шина (на основании разности скоростей между резиной шины и дорогой). Затем значение скольжения используется для того, чтобы найти силу, применяемую шиной к точке соприкосновения.
Кривая принимает измеренное скольжение шины и выдаёт силу на выходе. Кривая аппроксимируется по двухсекционной линии. Первая секция идёт от (0, 0) до точки (ExtremumSlip, ExtremumValue), в которой касательная кривой равна нулю. Вторая секция идёт от (ExtremumSlip, ExtremumValue) до (AsymptoteSlip, AsymptoteValue), где касательная кривой вновь равна нулю:
Typical shape of a wheel friction curve
У настоящих шин есть свойство испытывать большие нагрузки при низком скольжении, так как резина компенсирует скольжение растягиванием. Далее, когда скольжение становится действительно большим, нагрузка снижается, т.к. шина начинает проскальзывать или крутиться. Поэтому кривые трения шин имеют форму аналогичную той, что представлена на изображении выше.
Unity3d Tank Tutorial: Ходовая часть (Урок 1. Основы механики транспортного средства)
Вступление
Итак вы уже не новички в Unity, вы умеете создавать сцену, расставлять объекты на сцене, создавать terrain, делать префабы и тд… и главное — работать со скриптами, либо вы уже изучили статьи: Unity3D для начинающих — Туториал 1 и Unity3d script basics. Все эти знания вам пригодятся ведь в этом уроке мы двинемся намного дальше.
А именно: в первой части этого урока вы узнаете что такое Wheel Collider, как с помощью него управлять транспортным средством и создать реалистичное поведение подвески автомобиля, во второй части урока, на основе всего этого я покажу как сделать ходовую часть танка с соответствующей физикой и контроллерами.
Собственно то что вы видите на изображении сверху (это будет результат данного урока) вы можете опробовать «вживую» прямо в браузере. Хотите сделать это сами? Тогда добро пожаловать под кат
Перед тем как начать рассказывать об основах моделирования механики автомобиля на Unity я не могу не отметить что на официальном сайте уже есть уроки на эту тему например здесь. Правда на протяжении всего этого даются лишь указания на то, какой скрипт прикрепить к какому объекту и лишь изредка объясняют чтонибудь полезное, в третьей части урока наконец то объясняют как работает главный скрипт, хотя по моему это надо было делать в самой первой части, и начинать объяснять с того момента как работают wheel collider’ы и как они взаимодействуют с rigidbody, в итоге я сделал вывод что данный урок не рассчитан на новичков в Unity и хочу это исправить.
Но если вы уже знаете что такое Wheel Collider и с чем его едят, то вы можете пропустить этот урок.
1. Создаем «Автомобиль»
Для начала проделайте стандартные процедуры, создайте сцену, создайте terrain, либо используйте уже готовые, затем создайте пустой Game Object(GO), (GameObject->Create Empty), назовем его какнибудь оригинально, например Car.
Итак, наш суперкар почти готов! Поднимите его немного над поверхностью terrain’а и нажмите Play, автомобиль упадет на землю и встанет колом на колеса, о мягкой подвеске ему еще только мечтать, выходите из Play mode. Как видите у наших колес имеется компонент под названием Capsule Collider, а у кузова Box Collider, я не буду рассказывать в этом уроке что такое коллизии и как на основе них рассчитать положение объекта в пространстве, объясню проще: если у объекта имеется какой – либо из простых collider’ов (Box, Capsule, Mesh,…) то этот объект может взаимодействовать с другими объектами содержащими Rigidbody и один или несколько collider’ов, в свою очередь объект содержащий Rigidbody будет вычислять свою позицию на основе столкновений всех подчиненных ему collider’ов и назначенных им физических материалов.
Если вы из вышесказанного не поняли ничего, не заморачивайтесь, понимание придет с практикой.
А пока что выберите каждое из наших колес и удалите у них Capsule Collider (Правой кнопкой по нему и Remove Component). Нажмите Play, теперь автомобиль больше не стоит на колесах, они прошли сквозь террейн и взаимодействует с поверхностью у нас теперь только кузов.
2. Добавляем Wheel Colliders
Нажмите Play, автомобиль упадет и опять встанет на колеса (кстати если колеса все равно проходят сквозь террейн, это значит что автомобиль падает на землю с очень большой скоростью, и вам просто напросто нужно уменьшить расстояние до земли, либо увеличите параметр Drag у Rigidbody). Как видите результат не сильно отличается от того где у нас на колёсах стояли Capsule Colliders, все правильно, потому, что мы не задали нашим Wheel Collider’ам никаких параметров.
Итак, нажмите Play сейчас, посмотрите, наш автомобиль ведет себя теперь совсем по другому, теперь он пружинит от поверхности террейна, а если вы поставите его на склон какой нибудь горки, он покатится с неё, вот так у нас работают Wheel Collider’ы.
Но это далеко не все на что они способны, давайте выясним как с помощью них управлять автомобилем и сделать так чтобы наши колеса крутились и реагировали на неровности ландшафта. Начинаем скриптовать!
3. Управляем Wheel Collider’ами
В этом уроке я буду писать скрипты на C#, простите меня JavaScript’еры, он мне привычнее, я думаю вы разберетесь.
Далее работаем с нашими коллайдерами, дополняем скрипт:
Теперь можете нажать Play, и используя кнопки W,S или стрелки вперед — назад, привести в движение нашу «формулу один», а кнопками A,D, или стрелками влево – вправо, поворачивать.
Давайте обо всем по порядку.
4. Центр тяжести
Задается он удивительно просто, во первых нам надо создать пустой GO, назовем его Center of mass, затем перетянуть его на объект Car, и разместить его приблизительно там где вы считаете он должен быть, например чтобы моё авто не переворачивалось при повороте на высокой скорости мне пришлось сделать его вот так:
5. «Оживляем» колеса
Ну вот мы и добрались до финальной, на мой взгляд самой интересной в этом уроке и в то же время довольно сложной темы.
Для того чтобы оживить колесо, нам необходимо вычислять позицию и угол его вращения в каждом фиксированном кадре, в этом нам опять поможет чудесный WheelCollider, его метод GetGroundHit(), который способен вернуть структуру WheelHit в которой в свою очередь содержится точка соприкосновения коллайдера и террейна (переменная point). Благодаря методу GetGroundHit() мы можем вычислить позицию колеса на основе движения пружины подвески. Ну а что касается угла поворота – это совсем просто, в WheelCollider’е есть float переменная rpm, это аббревиатура от rotation per minute, на её основе мы и можем определить угол вращения колеса.
Переходим собственно к скрипту, он вырос, потолстел и теперь выглядит так:
Скопируйте его, вставьте в свой скрипт, затем во вкладке hierarchy выберите наш объект Car, как вы можете видеть в инспекторе у нас появились новые переменные и массивы в скрипте, в массивы wheelsF и wheelsB необходимо передать передние и задние колеса соответственно, (колеса а не Wheel Collier’ы!) как сделаете это нажмите Play. Если колеса уходят под террейн то поменяйте значение переменной wheelRadius, оно должно примерно совпадать с радиусом ваших коллайдеров.
Итак должно произойти чудо, ваши колеса теперь будут вращаться и реагировать на неровности ландшафта прям как настоящие.
Заключение
Ну вот и все что я могу рассказать про то как построить механику обычного автомобиля на Unity3D, прочитав и осознав все вышесказанное вы можете прямо сейчас отправляться делать гоночный симулятор.
Ну а в следующей части урока я как и обещал расскажу о том как построить механику гусениц танка, также я расскажу о методах его моделирования в 3D редакторе и немного про экспорт модели из него и импорт в Unity ну и естественно я не буду вас заставлять моделировать то что вы видели в данном демо, а предоставлю уже готовую модель. Спасибо за внимание и удачи в изучении Unity3d.