Стабилизировать твердое тело судна на воздушной подушке в вертикальном положении, используя крутящий момент - PullRequest
2 голосов
/ 16 октября 2019

В настоящее время я создаю игру, включающую ховер-байк. когда мотоцикл сталкивается с чем-то, его углы меняются естественным образом. Я хотел бы создать какой-то способ вернуть его к 0. Вот что я пробовал:

if (hoverbike.rotation.x != 0 || hoverbike.rotation.z != 0)
        {
            hoverbike.AddTorque(x: Mathf.MoveTowardsAngle(hoverbike.rotation.x, 0, 0.01f), y: hoverbike.rotation.y, z: Mathf.MoveTowardsAngle(hoverbike.rotation.z, 0, 0.01f));
        }

        transform.Rotate(0.0f, -Input.GetAxis("Mouse X") * 0.5f, 0.0f);

Трудно объяснить, что он делает, потому что я не понимаю, что он делает, этопросто, кажется, раскручивается. Вот остальная часть моего кода, если интересно: https://pastebin.com/kzMDQMVF, это беспорядок, но я все еще учусь использовать Unity.

Oh, и угол y не должен стремиться к 0, потому что это горизонтальный угол.

1 Ответ

1 голос
/ 16 октября 2019

Вы можете определить кватернион, который будет вращать судно на воздушной подушке от его текущего до мирового уровня, используя Quaternion.FromToRotation:

Rigidbody hoverRB; // hovercraft's rigidbody

Quaternion deltaQuat = Quaternion.FromToRotation(hoverRB.transform.up, Vector3.up);

Затем используйте Quaternion.ToAngleAxis чтобы преобразовать это в угол и ось:

Vector3 axis;
float angle
deltaQuat.ToAngleAxis(out angle, out axis);

Затем отмените некоторые из существующих вращений, чтобы в итоге достичь цели:

float dampenFactor = 0.8f; // this value requires tuning
hoverRB.AddTorque(-hoverRB.angularVelocity * dampenFactor, ForceMode.Acceleration);

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

float adjustFactor = 0.5f; // this value requires tuning
hoverRB.AddTorque(axis.normalized * angle * adjustFactor, ForceMode.Acceleration);

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

Убедитесь, что все это делается в FixedUpdate (или функции, вызываемой / работающей во время FixedUpdate) из-за того, что направление крутящего момента, вероятно, должно будет измениться от одной физикишаг к другому. Итак, всего:

Rigidbody hoverRB; // hovercraft's rigidbody

...

void FixedUpdate() 
{    
    Quaternion deltaQuat = Quaternion.FromToRotation(hoverRB.transform.up, Vector3.up);

    Vector3 axis;
    float angle
    deltaQuat.ToAngleAxis(out angle, out axis);

    float dampenFactor = 0.8f; // this value requires tuning
    hoverRB.AddTorque(-hoverRB.angularVelocity * dampenFactor, ForceMode.Acceleration);

    float adjustFactor = 0.5f; // this value requires tuning
    hoverRB.AddTorque(axis.normalized * angle * adjustFactor, ForceMode.Acceleration);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...