Unity 3D: Занимательная физика

» Раздел: Физика

Unity - очень мощный, прогрессивный движок с большим потенциалом. Он обладает множеством уже встроенных функций (в том числе и физическим движком NvidiaPhysX), которые нам, пользователям, прописывать вручную не придется. :)
В этой небольшой статье я бы хотел обсудить физические возможности движка. Итак, начнем:

Rigidbody

Что это такое?

За функцией Rigidbody скрывается Абсолютно Твердое Тело (АТТ). Если объяснять грубо и понятно, то АТТ в физике и механике - это идеальное твердое тело, которое под воздействием силы не может менять свои свойства, но может (под ее воздействием) перемещаться в 3х измерениях (вниз, вверх, вперед и т.д., т.е. в наших X-Y-Z осях), а также вращаться в 3х измерениях (опять же по осям X-Y-Z).
В Unity, как и в других игровых движках (опять же называю их именно "игровыми" движками грубо), Rigidbody используется для различных объектов, с которыми мы можем взаимодействовать, толкая, пиная и т.п. Подобные объекты под нашим влиянием будут далее под воздействием гравитации кататься, передвигаться и сталкиваться с другими предметами.

Какое применение мы можем найти этой функции?

К примеру, для создания автомобиля, кроме Rigidbody нам понадобятся 4 Wheel Collider'а и код (скрипт), применяющий силовое воздействия к колесам, в зависимости от нажатых клавиш.

Настраиваемые характеристики

  • Mass - Масса нашего объекта в килограммах. Рекомендуется не ставить значения массы в 100 раз больше или меньше масс других АТТ.
  • Drag - Насколько тело подвержено сопротивлению воздуха, когда оно движется под воздействием сил. При значении 0 сопротивления нет, а бесконечное значение мгновенно остановит наш объект.
  • Angular Drag - Насколько тело подвержено сопротивлению воздуха, когда оно вращается под воздействием сил. При значении 0 сопротивления нет, а бесконечное значение мгновенно прекратит вращение нашего объекта.
  • Use Gravity - При включении, объект становится подвержен влиянию гравитации.
  • Is Kinematic - При включении, объект становится не подвержен влиянию физического движка и может изменяться только его функцией Transform. Это может быть полезно для создания движущихся платформ, к примеру.
  • Interpolate - Применяется только в случае, если движения вашего АТТ кажутся вам странными или неуклюжими и т.п.:
    1. None: Интерполяция не применяется
    2. Interpolate: По-сравнению с трансформацией предыдущего кадра (фрейма), следующий будет сглажен.
    3. Extrapolate: Трансформация текущего кадра сглаживается, по-сравнению с оценочной (примерной) трансформацией следующего.
  • Freeze Rotation - Запрещает любое вращение, как скриптовое, так и при столкновениях. Однако, вращение можно будет выполнять функцией transform.Rotate()
  • Collision Detection - Используется для того, чтобы быстро-движущиеся объекты не проходили сквозь другие объекты, не находя Collision'ов (специальная "сетка" на объектах, которой они сталкиваются друг с другом и с игроком).
    1. Discrete: Значение по-умолчанию для того, чтобы наш объект "замечал" все другие объекты, с которыми может столкнуться.
    2. Continuous: Используйте Discrete Сollision с динамическими объектами столкновения (у которых имеется АТТ), а Continuous Сollision для статических MeshCollider'ов (без АТТ). Режим Continuous Dynamic использует Continuous Сollision для одного конкретного АТТ. Остальные АТТ будут использовать режим Discrete. (Это сильно скажется на нагрузке физического движок, просто оставьте Discrete, если не возникает проблем со столкновением быстрых объектов)
    3. Continuous Dynamic: Используется для объектов в режиме Continuous или Continuous Dynamic Collision. Continuous Сollision также будет использоваться для статических MeshCollider'ов (без АТТ). Для всех остальных используется режим Discrete. Используется для быстро движущихся объектов.

Как мы можем использовать эту функцию?

Базовые знания.

Чтобы использовать АТТ, нам нужен уже созданный игровой объект (GameObject), кликнув на нем, мы проходим в меню по следующему пути: Components - Physics - Rigidbody. Все, АТТ добавлено! :)
Теперь объект подвержен гравитации, к нему можно применять силы с помощью скриптов, но для того, чтобы объект вел себя именно так, как вам нужно, следует добавить Collider или Joint.

Код правит миром.

В скрипте манипулировать нашим объектом теперь мы будем с помощью функций AddForce() и AddTorque().
Так как я в Unity применяю JavaScript, мои примеры будут с ним, ссылки на другие примеры скриптинга (на C# или Boo) вы найдете ниже, в пункте Дополнительная информаия по АТТ.
» Rigidbody.AddForce
// Rigidbody.AddForce использует 2 типа формул, как и многие другие функции, связанные с перемещениями в пространстве.
// 1 тип: function AddForce (force : Vector3, mode : ForceMode = ForceMode.Force) : void 
// Сила, подбрасывающая объект вверх, относительно глобальной системы координат.

function FixedUpdate ()
{
	rigidbody.AddForce (Vector3.up * 10);
}

// Используется Vector3 - встроенная функция Unity, которая, в принципе, аналогична стандартной системе координат.
// 2 тип: function AddForce (x : float, y : float, z : float, mode : ForceMode = ForceMode.Force) : void
// То же самое, но тут используется X-Y-Z система координат.

function FixedUpdate ()
{
	rigidbody.AddForce (0, 10, 0);
}
» Rigidbody.AddTorque
// Функция раскручивает объект вокруг заданной оси.
// 1 тип: function AddTorque (torque : Vector3, mode : ForceMode = ForceMode.Force) : void
// Раскручивает АТТ вокруг глобальной оси Y.

function FixedUpdate ()
{
	rigidbody.AddTorque (Vector3.up * 10);
}

// 2 тип: function AddTorque (x : float, y : float, z : float, mode : ForceMode = ForceMode.Force) : void
// Делает то же самое, но снова в другой системе измерения.

function FixedUpdate ()
{
	rigidbody.AddTorque (0, 10, 0);
}

АТТ взаимодействует с объектами.

Для правильной работы наших АТТ их нужно снабдить Collider'ами (или Collision'ами, как вам будет угодно ^.^).
Подробно о коллайдерах читайте ниже.

Размер имеет значение!

Соблюдайте размеры вашего объекта, ведь они гораздо более значимы даже массы АТТ. Если ваш объект движется неправильно, висит в воздухе или не сталкивается, попробуйте настроить его величину (не АТТ, а самого объекта). При импортировании модели из 3D редактора ее размеры сохраняются, так что будьте внимательны на стадии моделирования и соблюдайте размеры всех моделей.

Дополнительная информация по АТТ

На этом, описывать АТТ или Rigidbody, я, пожалуй, закончу. Однако, есть пара подсказок, специально для тех, кто до сюда долистал :)
  1. Стандартный размер куба в Unity равен 1 метру, поэтому, проверять размер ваших моделей по нему очень удобно. Чтобы создать куб, выберите в меню GameObject - Create Other - Cube
  2. Относительный показатель Mass определяет, как два объекта будут взаимодействовать друг с другом.
  3. Mass не влияет на скорость падения с высоты, для этих целей используйте Drag.
  4. Чем выше значения Drag, тем больше весит предмет. стандартные значения варьируются от 0.001 (твердый кусок металла) до 10 (перышко).
  5. Если вам нужно изменять объект как с помощью скриптов, так и с помощью физики, добавьте к нему АТТ с параметром Kinematic.

Посмотреть скриптовые примеры воздействия внешних сил на объект с функцией АТТ можно по следующим ссылкам:
AddForce
AddTorque
Для изменения скриптового примера кликните на тексте с названием языка программирования!

Colliders

Что это такое?

В предыдущем разделе мы рассмотрели принцип работы Rigidbody и упомянули так называемые коллайдеры. Коллайдер для нас - вспомогательный объект в виде сетки простой примитивной или, наоборот, сложной формы, который находится вокруг нашей модели или части модели и взаимодействует с другими объектами, если те тоже окружены коллайдерами.
Чтобы наглядно объяснить знатокам редактора мира *Warcraft 3*, представьте себе импортированную нами модель, которой мы в редакторе дудадов не присвоили текстуры путей - это будет наш объект; а роль коллайдеров тут будут играть блокираторы пути вокруг модели. Естественно, это довольно грубое сравнение, ведь в Unity они гораздо более функциональны. Что-ж, рассмотрим поподробнее.

Виды коллайдеров.

Коллайдеры добавляются через меню Component - Physics. Есть несколько видов:
  • Box Collider - в форме куба.
  • Sphere Collider - в форме сферы.
  • Capsule Collider - в форме капсулы.
  • Mesh Collider - автоматически создает коллайдер по форме сетки объекта, не может сталкиваться с другими коллайдерами этого же типа. В основном используется для статических объектов, например, окружение гоночной трассы.
  • Wheel Collider - используется для колес, очень полезная вещь.
  • Compound Collider - комбинации примитивов, которые вместе действуют как один. Чтобы создать такой сложный коллайдер нужно к нашему базовому коллайдеру добавить дочерние объекты, а к ним уже привязать по примитиву. Таким образом, к примеру, очень удобно делаются простенькие коллайдеры для машин.

Настраиваемые характеристики

В принципе, все коллайдеры похожи друг на друга, просто используются для объектов разных форм, однако у них есть несколько разных параметров.
  • Куб
    • Material - Показывает, как коллайдер взаимодействует с остальными объектами, при этом присваивая физический материал, например, металл, лед и т.п.
    • Is Trigger - Если параметр включен, то на объект воздействует скрипт, а не физика.
    • Size - Размер коллайдера по осям X-Y-Z.
    • Center - Положение коллайдера, относительно локальных координат объекта.
  • Сфера
    • Radius - Радиус сферы, заменяет параметр Size.
    • Остальные параметры без изменений.
  • Капсула (параметры заменяют размер)
    • Radius - Толщина капсулы.
    • Height - Высота цилиндрической части коллайдера (без скругленных оснований).
    • Direction - Направление коллайдера, относительно локальных координат объекта.
  • Mesh Collider (параметры заменяют размер)
    • Mesh - Выбор нужного меша для создания коллайдера.
    • Smooth Sphere Collisions - Включение этой функции сглаживает поверхность коллайдера. Использовать следует на гладких поверхностях, к примеру, наклонный ландшафт без лишней углоатости, по которому должны скатываться сферы.
    • Convex - При включении позволяет нашему коллайдеру сталкиваться с другими такими же. Convex Mesh Collider'ы ограничены до 255 трианглов.
  • Wheel Collider (параметры заменяют размер)
  • Radius - Радиус колеса.
  • Suspension Distance - Максимальная дистания увеличения подвески колеса. Подвеска всегда увеличивается вниз по локальной оси Y.
  • Suspension Spring - Подвеска пытается достигнуть указанной точки, используя различные силы.
  1. Spring:// Пытается достигнуть указанной точки (позиции). Чем выше параметр, тем быстрее она достигается.
  2. Damper:// Смягчает, замедляет скорость движения подвески. Чем выше значение, тем медленнее двигается амортизатор.
  3. Target Position:// Полный "путь", который может "пройти" подвеска. 0 означает полностью расправленный амортизатор, а 1 - полностью сжатый. Значением по-умолчанию является 0, что соответствует обычной автомобильной подвеске..
  • Mass - Масса колеса.
  • Forward/Sideways Friction - Параметры трения при простом качении колеса и при качении боком (такое бывает в заносах или при дрифте).

Просмотров: 19 787

» Лучшие комментарии


girvel #1 - 3 года назад 0
Вы меня раздражаете. Вот я зашел в ваше Юнити... Открыл... Опа, АТТ. Пойду ка я сделаю атт, мне ведь вообще нечем заняться.
ehnaton #2 - 3 года назад 1
girvel, может ты займешься созданием игры а не физичных кубов и сфер. Попробуй.
ScorpioT1000 #3 - 3 года назад 3
хотелось бы видео в действии )
Mihahail #4 - 3 года назад 3
Блин, сначала подумал что тут статья по теоретической механике =)
NoSilence #5 - 3 года назад 0
ScorpioT1000:
хотелось бы видео в действии )
Я, конечно, извиняюсь, но что заставило шпалы в верхней части взлететь?
ScorpioT1000 #6 - 3 года назад 1
обязательно было цитировать пол экрана?
zumm #7 - 3 года назад -6
Не айс. По мне что с 3джи движками не твори, без норм вложений один хрен ничё не сделаеш+надо будет всёравно делать свой движок.
П С: 2д реально рулит
SageOne #8 - 3 года назад 0
NoSilence:
ScorpioT1000:
хотелось бы видео в действии )
Я, конечно, извиняюсь, но что заставило шпалы в верхней части взлететь?
Там что-то с настройками самих боксов. Они отпружинивают друг от друга, если смотреть дальше (когда уже падают они). Поэтому мне кажется когда был взорван шарик, от нижних боксов пошёл импульс вверх, поэтому они и подскочили
ehnaton #9 - 3 года назад 3
Не айс. По мне что с 3джи движками не твори, без норм вложений один хрен ничё не сделаеш+надо будет всёравно делать свой движок.
Сразу видны гигантские познания в геймдеве.
NoSilence #10 - 3 года назад 0
zumm:
Не айс. По мне что с 3джи движками не твори, без норм вложений один хрен ничё не сделаеш+надо будет всёравно делать свой движок.
Я думаю, что это ни к чему для одного или пары человек. Тут предлагают не только готовый движок, но и набор софта. Пока всё это напишешь весь энтузиазм пройдет. :)
lentinant #11 - 3 года назад 3
Физика в Юньке несколько унылая. Даже на вышеуказанном видео видно неадекватное поведение некоторых шпал. Кроме того, есть несколько глюков с коллайдерами (если делать идеально ровную поверхность с префабов, ваш ГО с ригидбоди все равно будет натыкаться на что-то).
zumm:
Не айс. По мне что с 3джи движками не твори, без норм вложений один хрен ничё не сделаеш+надо будет всёравно делать свой движок.
Без норм вложений ничего не сделаешь, не важно, работаешь ли ты с движками, SDK или чем-то еще. А вот насчет своего движка - глупость несусветная. Сделать нормальный движок - очень трудно, и даже если одному человеку удастся, по качеству он все равно будет проигрывать проверенным движкам, созданным профессионалами.
Mihahail #12 - 3 года назад 0
А откуда берутся движки?)
Ответ: их пишут те, кто хочет сделать движок, а не игру.
prog #13 - 3 года назад 0
Mihahail, вот только, как правило, их пишет группа разработчиков и далеко не из двух-трех человек и не за месяц и даже не за два. По крайней мере если рассматривать 3d движки и игнорировать любительские движки, которые дохнут от лишнего десятка сущностей в пределах одной локации.
Mihahail #14 - 3 года назад 0
вот только, как правило, их пишет группа разработчиков
Не ожидал такого недоверия к себе. Я ведь тебя не удивлю, если скажу, что знаю это?)
вообще-то я и написал:
Mihahail:
пишут те, кто
а не "тот"
Впрочем, я понимаю зачем ты это написал - это подходит к контексту фразы лейтенанта "нормальный движок - очень трудно, и даже если одному человеку удастся".. А я как-то не обратил внимания именно на эти слова.
Но смею тебе заверить, я в курсе о том, о чём ты написал)
prog #15 - 3 года назад 0
Mihahail, а если предположить что движков больше одного, то те с тем-же успехом может относиться и к попыткам десяти разных людей писать десять разных движков)
ничего личного - это не была попытка в чем-то тебя попрекнуть и мое сообщение было адресовано всем читающим, просто так получилось что оно было написано в продолжение именно к твоему, отсюда и обращение в начале.
RSQR #16 - 3 года назад 0
lentinant:
Физика в Юньке несколько унылая. Даже на вышеуказанном видео видно неадекватное поведение некоторых шпал. Кроме того, есть несколько глюков с коллайдерами (если делать идеально ровную поверхность с префабов, ваш ГО с ригидбоди все равно будет натыкаться на что-то).
>
лолшто. Поправьте клешни, сударь.
lentinant #17 - 3 года назад 0
Rescuer, окей, давай свое предложение, как сию проблему поправить, буду рад решению.
RSQR #18 - 3 года назад (отредактировано ) 0
lentinant:
Rescuer, окей, давай свое предложение, как сию проблему поправить, буду рад решению.
Все очень элементарно ведь. Автор видео настолько криворук, что не удосужился расчитать массу тела и неправильно использовл баунс материал. В юнити один из мощнейших физ движков, имхо.
А что касается спотыканий - впервые слышу. Делал плеера разными способами: и через чарактер контроллер, и через тело, произвольных трясок не наблюдалось.
ehnaton #19 - 3 года назад (отредактировано ) 0
Rescuer, nvidia physix, если быть точнее, который, вроде бы, пока что лучший.
основываясь на личном опыте, предположу, что проблема в использовании character controller, Он и правда имеет несколько багов в реализации, для решения которых у меня было написано в свое время куча костылей, после чего я отказался от его использования вообще.
lentinant #20 - 3 года назад (отредактировано ) 0
ehnaton, если ты насчет моей проблемы, то нет, контроллер персонажа у меня свой. По сути, контроллера-то и нет - есть выстроенная из префабов дорожка, есть тело, которое толкается в сторону дорожки средствами ригидбоди. И получаю рандомные скачки на местах составления префабов, несмотря на то, что они на одной высоте. Более того, даже если каждый следующий префаб будет немного ниже предыдущего, это не меняет факта, что персонаж может подпрыгнуть.

А еще в этом "одном из мощнейших физ движков" проблема с быстро движущимся ригидбоди - например, пуля с ригидбоди на большой скорости будет пролетать сквозь стены. Да, я знаю о возможности настройки режима обнаружения столкновения, однако печально, что единственное нативное решение серьезно грузит проц.
ehnaton #21 - 3 года назад (отредактировано ) 0
Думаю, в этом случае могу посоветовать разобратьс как следует просто напросто. Гдето ты там таки накосячил.
А насчет пуль - сомневаюсь, что много где именно на ригидбодях строится выстрел, когда есть лучи.
lentinant #22 - 3 года назад 0
ehnaton, большинство современных шутеров использует пули как физические объекты.
ScorpioT1000 #23 - 3 года назад 0
контроллер персонажа у меня свой. По сути, контроллера-то и нет - есть выстроенная из префабов дорожка, есть тело, которое толкается в сторону дорожки средствами ригидбоди
самый извращённый способ движения, который я видел)
пуля с ригидбоди на большой скорости будет пролетать сквозь стены. Да, я знаю о возможности настройки режима обнаружения столкновения, однако печально, что единственное нативное решение серьезно грузит проц.
а ты пробовал на других движках?) ты в курсе, что это общая проблема для всех движков, а не для юнити онли?
lentinant #24 - 3 года назад 0
Косяков нет - только в физическом движке. У меня выстроена идеально ровная поверхность. Тем не менее, у меня есть идея решения - вместо кучи префабов использовать один отмасштабированный префаб. Раньше я не хотел его использовать, так как думал, что буду использовать префабы-модели, которые, будучи растянутыми, будут не особо красивыми, но сейчас я понял, что графику и коллизию для нее можно создавать отдельно, и я попросту могу создавать отдельно префабы пололочек и префабы графики для них.
ScorpioT1000:
самый извращённый способ движения, который я видел)
Типичный метод придачи импульса персонажу в Юньке. Почему-то редкий тутор учит нас передвигать персонажа каким-то Translate, большинство завязано на AddForce.
ScorpioT1000:
а ты пробовал на других движках?) ты в курсе, что это общая проблема для всех движков, а не для юнити онли?
В том же UDK никаких проблем с быстродвижущимися телами не замечал.
ScorpioT1000 #25 - 3 года назад 0
значит, плохо тестировал. это есть и в havok, и в physx, и в bullet, для этого всегда есть специальные средства
Thread #26 - 3 года назад 2
Rigidbody
Collaider"ы
Неужели вам это интересно? Ведь там много недочётов))
Я сам на Unity 2 года работаю вот прибыл сюда
Если кто хочет я могу сделать сцену с этой физикой?
zumm #27 - 3 года назад -2
Вот меня тут критикуют, но вы же сами знаете что разрабы используют свои движки, или допиливают туда с введением библиотек и тд. Может для вас я и тупой но здесь вы облажались.
И ваще 2д на андройд это золотая жила. А 3джи проекты единичны, и чтоб их сделать нужны большие ресы. Вот сморел игры, чтот нормальные люди этим двигом не пользуются.
lentinant #28 - 3 года назад 3
zumm:
Может для вас я и тупой но здесь вы облажались.
Хватит нести никому не понятный бред
И ваще 2д на андройд это золотая жила. А 3джи проекты единичны, и чтоб их сделать нужны большие ресы. Вот сморел игры, чтот нормальные люди этим двигом не пользуются
Заходишь сюда, и ищешь все, что с припиской Android. Само собой, среди разработчиков этих игр нормальных людей нет. А среди самых игр нет 2D.
Да, кстати, сделать красивую 2D игру ни разу не легче, чем красивую 3D игру.
3 комментария удалено
ehnaton #32 - 3 года назад 0
lentinant, ему просто завидно, что есть люди, которым хватило мозгов(хотя там их много не надо) которые смогли во всем этом разобраться)
lentinant #33 - 3 года назад 0
ehnaton, ты забыл inXile и Obsidian Entertainment.
ehnaton #34 - 3 года назад -1
lentinant, они не так сильно известны. А те всегда на виду у всех.
lentinant #35 - 3 года назад 0
ehnaton:
lentinant, они не так сильно известны.
Даа, разработчики классики жанра РПГ не сильно известны.
ehnaton #36 - 3 года назад (отредактировано ) 0
lentinant, для людей плохо знакомых с этим жанром - нет.
Они не мелькают так часто.
SageOne #37 - 3 года назад (отредактировано ) 4
они не так сильно известны.
знакомьтесь, Obsidian Tntertainment
прикреплены файлы
ehnaton #38 - 3 года назад 2
Пиначет, не играл ни в одну игр из этого списка, кстати.
lentinant #39 - 3 года назад 4
ehnaton, ну, человек, который не играл ни в Плейнскейп, ни в Невервинтер, ни в Фоллаут, ни в Котор - редкость.
GeneralElConsul #40 - 3 года назад 3
не играл ни в одну игр из этого списка, кстати.
Очень зря. Все игры весьма достойные кроме, может быть только, Apha Protocol.
ScorpioT1000 #41 - 3 года назад 6
Thread, мы бы с радостью посмотрели твои (видео) уроки.
ehnaton, согласен насчет невервинтер и фаллаута) что за молодежь пошла =)
GeneralElConsul #42 - 3 года назад 2
Ого, так это ведь перевод официальной статьи с оффсайта. Спасибо за перевод.
Audes #43 - 2 года назад 0
Уважаемые, извиняюсь за дико нубский вопрос, но как изменить массу и прочие характеристики в коде?
Jusper #44 - 2 года назад 2
Audes:
Уважаемые, извиняюсь за дико нубский вопрос, но как изменить массу и прочие характеристики в коде?
Привет! Ты можешь оставить вопрос тут xgm.guru/p/unity/qa.
Audes #45 - 2 года назад 0
Jusper, спасибо!