Единство. Попытка поддельной внутренней гравитации корабля. Жесткие тела детей вращающегося объекта продолжают скользить вокруг

Я пытаюсь смоделировать корабль / космическую станцию ​​с внутренней гравитацией.

Для этого я делаю игрока и все содержимое корабля дочерними. Сам корабль имеет коллайдеры, но нет компонентов твердого тела. Идея заключается в том, что по мере движения корабля будет изменяться и все его содержимое. Довольно просто пока.

Для имитации силы тяжести на корабле у контроллера игрока и всех твердых тел гравитация по умолчанию отключена. Вместо стандарта на каждый фрейм применяется сила, направленная вдоль вектора отрицательного роста родительского корабля.

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

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

Я пытался обойти все физические свойства физических материалов, чтобы перетащить их в массу и т. Д. Ни одно из них не сработало, и я уверен, что это из-за фундаментального факта, что пол движется, даже если РБ являются детьми объекта, частью которого является пол.

У кого-нибудь есть решение, которое не является клейкой лентой? Я мог бы попытаться сделать все кинематографическим и только "проснуться", когда происходят определенные внешние столкновения или что-то в этом роде, но это может стать очень громоздким. Мне нужно, чтобы это работало как можно более универсально.

Некоторый код:

На корабле

void Update () 
{
    transform.Rotate(new Vector3(Time.deltaTime * 0.125f,Time.deltaTime*0.5f,0));
}

void FixedUpdate()
{
Vector3 tempVec;

foreach(Rigidbody rb in rigidBodies)
    {
        //Gravity!!

        tempVec = transform.up * -9.81f * rb.mass * Time.deltaTime;         
        rb.AddForce(tempVec, ForceMode.Acceleration);
    }

}

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

1 ответ

Если вы приравниваете это к сценарию реального мира, единственное, что мешает нам скользить по полу, это трение.

Правильно ли применяет библиотека физики трение на основе контактирующих материалов? Если не применять определенное количество трения (или минимальное усилие, необходимое для его преодоления), это должно препятствовать скольжению по полу.

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

Как указано выше, проблема заключается в том, как физический движок применяет трение. Если я не ошибаюсь, на объекты во вращающейся рамке будут действовать другие силы (некоторые из них очень не интуитивны - посмотрите это видео: https://www.youtube.com/watch?v=bJ_seXo-Enc). Однако, несмотря на все это (плюс вероятные ошибки округления, возникающие из-за самого двигателя и радостей математики с плавающей точкой), в реальном мире статическое трение больше, чем движущееся (кинетическое) трение. Я не думаю, что это часто реализуется в движках игровой физики, поэтому мы так часто видим "шаткие" почти статические объекты. Кроме того, вы можете столкнуться с проблемой, заключающейся в том, что даже если это реализовано, физический движок может интерпретировать два контактирующих вращающихся тела как нестатические (даже если их контактные поверхности статичны с локальной точки зрения, движок может мыслить глобально)... [Вставьте шутку о споре Ньютона и Эйнштейна].

показывает идеализированную версию того, как на самом деле выглядит трение в реальном мире: пока вы не преодолеете статическое трение, ничто не движется.

Одним из способов реализации этого (если вы можете получить доступ к физическому движку низкого уровня) было бы округлить все силы движения ниже определенного порога до нуля - т.е. сила < 0,001* установлена ​​на 0 (или, возможно, установлена ​​скорость < 0,001) в ноль - в зависимости от того, что проще).

* Какой-то порог - вам придется решить, что это такое.

В противном случае, возможно, вы могли бы дать указание этим объектам прекратить вычислять физику и "прикрепить" их к родительской поверхности, пока вы не захотите что-то с ними сделать? (Вероятно, это плохое решение, но большинство других идей, приведенных выше, основаны на взломе базового физического кода).

Другие вопросы по тегам