Я пытаюсь смоделировать корабль / космическую станцию с внутренней гравитацией.
Для этого я делаю игрока и все содержимое корабля дочерними элементами корабля. У самого корабля есть коллайдеры, но нет компонентов твердого тела. Идея состоит в том, что по мере движения корабля все его содержимое будет перемещаться вместе с ним. Пока все довольно просто.
Чтобы имитировать гравитацию на корабле, на контроллере игрока и всех твердых телах гравитация по умолчанию отключена. Вместо стандартного, в каждом кадре сила применяется вдоль отрицательного вектора вверх родительского корабля.
Это работает, но есть одна серьезная проблема, которую я должен решить, прежде чем эта штука станет прочной. Все твердые тела очень медленно скользят по внутренней части корабля.
Я знаю, что это, вероятно, связано с обновленным положением пола в сочетании с силой тяжести, приводящей к некоторой поперечной силе. Предметы всегда скользят против вращения корабля.
Я пробовал поиграть со всеми физическими свойствами, начиная с физических материалов до перетаскивания и заканчивая массой и т. Д. Ничего из этого не сработало, и я почти уверен, что это связано с тем фундаментальным фактом, что пол движется, даже несмотря на то, что 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);
}
}
Я также работал над версией, в которой корабль следил за движениями твердого тела. Я не мог выполнять прямое воспитание, поэтому мне пришлось просто вручную настраивать преобразование каждого кадра, чтобы оно соответствовало физическому прокси. Это по-прежнему имело тот же эффект, что и выше, хотя, вероятно, в конечном итоге я хочу переместить корабль, поскольку это будет более тесно связано с механикой полета.