Как я могу предотвратить движение твердых тел через друг друга, используя встроенную физику Unity?

8

Я пытаюсь создать игру, в которой объекты можно перетаскивать, но у меня проблемы с физикой. С твердыми телами, которые имеют одинаковые массы, они иногда проталкивают друг друга при перетаскивании и вызывают нежелательные движения. Вот демо .

Я хотел бы сделать это, используя только встроенную физику Unity 3D .

В демоверсии вы можете использовать мышь для перетаскивания объектов. Все цилиндры имеют коробчатые коллайдеры и массы 10000. Они также имеют различные ограничения в зависимости от их ориентации (ни один не может вращаться, и все ограничены по x или y). Сфера имеет массу 1, коллайдер и ограничение az.

Сфера и цилиндры хорошо взаимодействуют. Однако перетаскивание цилиндров друг на друга вызывает пересечение. Я не хочу это!

Цилиндры имеют интерполяцию, установленную на «Интерполировать», а обнаружение столкновений установлено на «Непрерывный». Я бросил скрипт DontGoThroughThings на все цилиндры, но он, похоже, ничего не делает. Что касается установки скорости твердых тел, я использовал обе эти следующие строки с в основном одинаковым результатом:

rb.AddForce(speed * diff * Time.deltaTime - rb.velocity, ForceMode.VelocityChange);
//rb.velocity = speed * diff * Time.deltaTime;

Без написания собственного кода обнаружения столкновений у меня заканчиваются идеи. Есть простая настройка или я что-то пропустил?

С объяснением контекста, вот более точный вопрос: «Как я могу заставить цилиндры в моей демонстрации не перемещаться друг через друга?»

Джефф
источник
Имеет ли какое-то значение уменьшение массы цилиндров?
МГБ
Нет, я думаю, это сделает их легче. Также, если масса подобна сфере, сфера тоже начнет проходить через цилиндры.
Джефф
Что заставляет тебя так думать? Когда массовые отношения больше, у физического движка возникает больше проблем с точностью.
МГБ
Потому что я попробовал: PI может загрузить демонстрацию, где все массы установлены в 1, если хотите.
Джефф
Я думаю, что это может быть связано с тем, как я меняю скорость. Вместо этого я попытаюсь измениться на силу
Джефф

Ответы:

2

Не глядя на ваш проект / код, я хотел бы предложить это:

private bool _mouseOverObject = false;

void Update(){
    if(_mouseOverObject && Input.GetMouseDown(0){
        rigidbody.isKinematic = false; //Let Unity Physics affect the item.
    } else {
        rigidbody.isKinematic = true; //Let it affect other physics but not be affected itself
    }
}

void OnMouseOver(){
    _mouseOverObject = true;
}

void OnMouseExit(){
    _mouseOverObject = false;
}

Это позволит вам ограничить физику, но в рамках Unity и физического движка. Вы можете поиграться со скриптом, чтобы он заблокировал только один объект для перемещения и т. Д., Но это должно помочь вам начать.

Том Блю Пиддок
источник
0

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

(Имейте в виду, что непрерывное обнаружение столкновений стоит дорого, поэтому используйте его экономно)

BlueRaja - Дэнни Пфлугхофт
источник
Я получаю те же результаты, когда устанавливаю каждый из цилиндров в режим непрерывной динамики. Это то, что вы имели в виду?
Джефф