Я нашел этот скрипт, который возвращает скорость вращения (учитывая, где применяется сила и расстояние от центра масс).
public Vector3 ForceToTorque(Vector3 force, Vector3 position, ForceMode forceMode = ForceMode.Force)
{
Vector3 t = Vector3.Cross(position - body.worldCenterOfMass, force);
ToDeltaTorque(ref t, forceMode);
return t;
}
private void ToDeltaTorque(ref Vector3 torque, ForceMode forceMode)
{
bool continuous = forceMode == ForceMode.VelocityChange || forceMode == ForceMode.Acceleration;
bool useMass = forceMode == ForceMode.Force || forceMode == ForceMode.Impulse;
if (continuous) torque *= Time.fixedDeltaTime;
if (useMass) ApplyInertiaTensor(ref torque);
}
private void ApplyInertiaTensor(ref Vector3 v)
{
v = body.rotation * Div(Quaternion.Inverse(body.rotation) * v, body.inertiaTensor);
}
private static Vector3 Div(Vector3 v, Vector3 v2)
{
return new Vector3(v.x / v2.x, v.y / v2.y, v.z / v2.z);
}
С 2100 ньютонами я получаю 0,6 радиана (36 градусов)вращение.
var test = rotationScript.ForceToTorque(shipFront.right * 2100, shipFront.position, ForceMode.Force);
Debug.Log(test + " " + test * Mathf.Rad2Deg);
// Above gives (0, 0.6, 0) and (0, 36.1, 0)
Но используя AddForceAtPosition
, чтобы вращать корабль с той же силой, я не получаю тот же результат
if (currTurn > 0) {
body.AddForceAtPosition(shipFront.right * 2100, shipFront.position, ForceMode.Force);
body.AddForceAtPosition(-shipBack.right * 2100, shipBack.position, ForceMode.Force);
} else if (currTurn < 0) {
body.AddForceAtPosition(-shipFront.right * 2100, shipFront.position, ForceMode.Force);
body.AddForceAtPosition(shipBack.right * 2100, shipBack.position, ForceMode.Force);
}
Это не дает мне 36 градусов в секунду -Я проверил, посчитав, сколько времени потребовалось, чтобы сделать полный оборот 360, предположительно, это должно было быть сделано за 10 секунд, но потребовалось 10 секунд, чтобы повернуть только ~ 90º.
В этом я многое не понимаюпервый сценарий, как и большая часть физики, но я не вижу его с учетом массы моих кораблей (body.worldCenterOfMass
?), может ли это быть?
Мне нужно это, чтобы я мог вращать свой корабльточнее.