Как зажать вращение по вертикальной оси? - PullRequest
0 голосов
/ 26 сентября 2019

Я работаю со средством просмотра объектов, как sketchfab в Unity, и в настоящее время выполняю вращение камеры с помощью мыши.Пока что все работает, но я бы хотел зафиксировать вращение на вертикальной оси, но у меня возникли некоторые проблемы.

Вот как я сделал поворот камеры:

[SerializeField] Transform camPivot = null;
[SerializeField] float     speed    = 850.0F;

private Quaternion      _camRot         { get; set; } = Quaternion.identity;
private float           _polar          { get; set; } = 0;
private float           _elevation      { get; set; } = 0;

void DoRotation()
{
    this._polar     += Input.GetAxis("Mouse X") * this.speed * Mathf.Deg2Rad;
    this._elevation -= Input.GetAxis("Mouse Y") * this.speed * Mathf.Deg2Rad;

    this._camRot = Quaternion.AngleAxis(this._elevation, Vector3.right);
    this._camRot = Quaternion.AngleAxis(this._polar, Vector3.up) * this._camRot;
}
private void Update()
{
    this.DoRotation();

    this.camPivot.localRotation = Quaternion.Slerp(this.camPivot.localRotation, this._camRot, Time.unscaledDeltaTime * 5.0F);
}

Также я хочу всегда следить за тем, чтобы поворот z был равен нулю, так как мне нужно только поворачивать поворот камеры по горизонтали и вертикали,Я попытался установить значение camPivot euler z равным 0, но это дает мне очень странное поведение.

var euler = this.viewCamera.Pivot.eulerAngles; euler.z = 0.0f;
    this.viewCamera.Pivot.eulerAngles = euler;

enter image description here

1 Ответ

1 голос
/ 26 сентября 2019

Очень простое решение - зажать _elevation до ± 90 с помощью Mathf.Clamp:

void DoRotation()
{
    this._polar     += Input.GetAxis("Mouse X") * this.speed * Mathf.Deg2Rad;
    this._elevation -= Input.GetAxis("Mouse Y") * this.speed * Mathf.Deg2Rad;
    this._elevation = Mathf.Clamp(this._elevation, -90f, 90f);

    this._camRot = Quaternion.AngleAxis(this._elevation, Vector3.right);
    this._camRot = Quaternion.AngleAxis(this._polar, Vector3.up) * this._camRot;
}
...