Найти тему
Uniread | Блог про Unity

Физика объектов. Rigidbody

В этой статье я расскажу о компоненте Rigidbody и то как он влияет на объекты в Unity.

О компоненте Rigidbody

Rigidbody предоставляет основанный на физике способ управления движением и положением игрового объекта. Вместо свойств преобразования вы можете использовать смоделированные физические силы и крутящий момент для перемещения игрового объекта и позволить физическому движку рассчитать результаты.

Для начала создадим на сцене пару кубов, а затем в инспекторе добавим одному из них компонент Rigidbody.

-2

У Rigidbody есть несколько настроек о которых я сейчас расскажу.

-3
  • Mass - масса объекта, измеряется в килограммах. Чтобы имитировать силы сопротивления, замедляющие движение, используйте Drag.
  • Drag - определяет скорость затухания линейной скорости тела, чтобы имитировать лобовое сопротивление, сопротивление воздуха или трение. Низкие значения приводят к более низкой скорости затухания, так что игровой объект движется быстрее и дольше (тяжелые объекты). Высокие значения приводят к более высокой скорости затухания, так что игровой объект замедляется в течение короткого промежутка времени (легкие объекты).
  • Angular Drag - определяет скорость затухания скорости вращения твердого тела, чтобы имитировать лобовое сопротивление, сопротивление воздуха или трение.
  • Automatic Center of Mass - включите Automatic Center of Mass, чтобы использовать предсказанный физической системой центр масс для твердого тела на основе его формы и масштаба. Отключите, чтобы задать свои собственные координаты X, Y и Z для центра масс.
  • Automatic Tensor - включите Automatic Tensor, чтобы использовать предсказанный физической системой тензор и вращение тензора для тела на основе всех подключенных коллайдеров. В то время как масса влияет на линейное перемещение, тензор инерции влияет на вращательное движение. Отключите, чтобы вместо этого задать свои собственные координаты X, Y и Z для тензора.
  • Use Gravity - будет ли на тело влиять гравитация, если отключить, то тело будет летать в невесомости.
  • Is Kinematic - когда включена функция Is Kinematic, физическая система не может прикладывать усилия для перемещения или поворота игрового объекта, вместо этого Unity может перемещать и вращать его только с помощью своего преобразования (активация гравитации через скрипт).
  • Interpolate - параметрами являются интерполяция и экстраполяция. Интерполяция - использует положение и скорость твердого тела из предыдущих двух обновлений физики, чтобы рассчитать и применить положение твердого тела в текущем кадре. Экстраполяция - использует позу и скорость неподвижного тела из предыдущего обновления физики и спрогнозируйте позу неподвижного тела в следующем обновлении физики, чтобы рассчитать и спрогнозировать позу в текущем кадре.
  • Collision Detection - определяет, как физическая система обнаруживает столкновения между коллайдером этого твердого тела и другими коллайдерами в сцене. Параметры идут от простого обнаружения до сложного и соответственно более дорогого по ресурсам компьютера.

Запустим наш проект и посмотрим на результат.

-4

Как мы видим куб упал и все работает. Теперь поднимем кубы выше, добавим Rigidbody второму кубу, а первому изменим массу на 35. Как только мы запустим проект мы увидим что кубы упали одинаково хотя масса у них разная. На это влияет параметр Drag. Сейчас кубы находятся в вакууме, но если добавить правому Drag = 1, то на него начнет влиять сопротивление воздуха и падать он будет медленнее.

-5

Теперь уберем один куб и разберем Collision Detection.

У Collision Detection есть 4 параметра. Первый из них - это Discrete, он проверяет если в следующем кадре коллайдер объекта соприкоснулся с поверхностью то сработает коллизия. Это можно проверить подняв куб и отпустив его поставим проект на паузу (кнопка справа то Play). Далее начнем перематывать кадры (кнопка справа от Pause). Перед столкновением переключим кадр и увидим это:

Перед столкновением
Перед столкновением
Следующий кадр
Следующий кадр

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

С этим поможет параметр Continuous. Этот параметр выстраивает лучи по направлению движения куба, и если лучи пересекут место соприкосновения с поверхностью то куб вернется на это место, а не пролетит насквозь.

Continuous работает с не динамическими объектами, два летящих быстрых объекта такой параметр не отследит, в таком случае поможет параметр Continuous Dynamic.

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

Последнее о чем я хочу рассказать это о вкладка Constraints. В этой вкладке можно заморозить поворот или движение объекта.

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

-8

На этом все. Я рассказал о базовых вещах компонента Rigidbody. На этом он не ограничивается, можно сделать целое управление персонажем через Rigidbody и много другое.