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

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

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

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

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

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

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

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

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

На корабле

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);
    }

}

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


person Meathelix    schedule 04.09.2013    source источник
comment
Одно из решений является общим, но не простым: создайте где-нибудь статическую копию корабля (только жесткие тела + коллайдеры), которая содержит копии всех жестких тел + коллайдеры внутри корабля. Всякий раз, когда к кораблю будет приложена сила, которая должна двигать предметы внутри, примените ее к затененным твердым телам. Обновите локальное положение и поворот объектов внутри корабля, чтобы они соответствовали затененным твердым телам. Это гарантирует, что внутренняя система отсчета корабля статична для физического движка - и твердые тела тоже будут спать правильно.   -  person adurdin    schedule 17.09.2013
comment
Это вроде того, что я сделал, когда пару лет назад реализовал это в XNA с помощью сторонней библиотеки физики. Однако там было чище, потому что я мог полностью разделить физические миры, а затем преобразовать внутреннее содержимое, чтобы оно соответствовало коробкам, представляющим массу корабля в глобальном мире. В этом случае мне интересно, смогу ли я уйти, поместив все эти вещи в начало координат, но распределив их по слоям и сделав невидимыми, чтобы они не взаимодействовали с остальным миром.   -  person Meathelix    schedule 17.09.2013
comment
Это должно сработать - хотя, если у вас будет много таких кораблей для моделирования, у вас закончатся слои.   -  person adurdin    schedule 17.09.2013


Ответы (2)


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

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

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

person Ehrys    schedule 02.10.2013

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

https://i.stack.imgur.com/AMDr2.gif показывает идеализированный версия того, как на самом деле выглядит трение в реальном мире: пока вы не преодолеете статическое трение, ничего не движется.

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

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

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

person BevanFindlay    schedule 01.05.2019