Unity 6.3
0 онлайн 25 гостей 3 в системе
Вход

Введение в физику жестких тел

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

Чтобы моделировать основанное на физике поведение, например движение, гравитацию, столкновения и соединения, необходимо настроить объекты сцены как твёрдые тела. Чтобы настроить GameObject как твёрдые тела в системе PhysX Unity, можно назначить им Rigidbody Компонент Rigidbody представлен в API следующим образом: Rigidbody class.

Жесткий корпус GameObjects с физическим движением

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

В большинстве случаев, если GameObject имеет Rigidbody, вы должны использовать Rigidbody свойства, чтобы переместить GameObject, вместо Transform свойств. Rigidbody свойства применяют силы и крутящий момент из физической системы, которые изменяют GameObject’s Transform; если затем изменить Transform непосредственно Unity не может правильно рассчитать физику моделирования, и вы можете увидеть нежелательное поведение. Это особенно верно для жестких тел с Соединения.

Unity управляет движением на основе физики глобально, а не локально. GameObject с Rigidbody движется через движение, основанное на физике, он движется независимо от любого родителя или ребенка GameObjectРебенок GameObject который имеет Rigidbody по-прежнему использует свой родитель GameObject определить свое локальное положение для инициализации, но Unity рассчитывает его физическое движение в глобальном пространстве.

Для управления Rigidbody с помощью скрипта, основными методами являются AddForce (для добавления сил к GameObject) и AddTorque (для применения крутящего момента к GameObject).

Жесткий корпус GameObjects без движения, основанного на физике

Существуют случаи, когда вы хотите, чтобы система физики обнаруживала GameObject, но не контролировала его. Например, вы можете пожелать Коллайдеры для обнаружения GameObject, но вы намерены контролировать движение и положение GameObject через его Transform.

Движение в Unity, не основанное на физике, называется кинематическим движением. Компонент Rigidbody имеет свойство Is Kinematic. Когда оно включено, связанный GameObject определяется как объект, не управляемый физикой, и исключается из управления физическим движком. После этого объект можно перемещать кинематически через Transform, и расчёты физической симуляции Unity не будут переопределять изменения.

Кинематический Rigidbody может применять силу, основанную на физике, к Rigidbody GameObjects, основанному на физике, но не получает силу, основанную на физике. Например, кинематический Rigidbody может столкнуться и «толкнуть» Rigidbody, который имеет движение, основанное на физике, но Rigidbody с движением, основанным на физике, не может «толкнуть» кинематический Rigidbody.

Если вы используете Соединение для присоединения кинематического Rigidbody к некинематическому Rigidbody, Соединение не может приложить силы для перемещения кинематического Rigidbody. Оно может всегда перемещать только некинематическое Rigidbody. Однако, вы все еще можете перемещать кинематическое Rigidbody через Transform, и Соединение может настроить положение некинематического тела, чтобы удовлетворить ограничения соединения.

Rigidbody оптимизация

Когда Rigidbody движется медленнее, чем Sleep Threshold (см. Физика Project Settings), Unity устанавливает Rigidbody в «спящий» режим, что означает, что система физики не включает его в физические расчеты. Когда спящий Rigidbody получает столкновение или силу, Unity «будит» Rigidbody и продолжает включать его в физические расчеты.

По умолчанию, спящий и пробуждающийся режимы компонента Rigidbody происходят автоматически. Однако вы также можете управлять этим поведением самостоятельно с помощью скрипта, используя методы Rigidbody.Sleep и Rigidbody.WakeUp.

Rigidbody может не проснуться в ответ на движение и столкновения со статическими коллайдерами (то есть коллайдерами без Rigidbody), которые перемещаются через Transform положение, а не физическая система. Особенно вероятно это тогда, когда физическая система больше не может обнаружить статический коллайдер. В таком случае можно использовать Rigidbody.WakeUp чтобы разбудить спящего Rigidbody.

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

Для получения дополнительной информации о том, как физическая система PhysX обрабатывает спящий режим, см. документацию по динамике NVIDIA PhysX SDK Rigidbody в Спящий режим.