eulerAngles из Vector3 приводит к странному повороту - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь изменить eulerAngle X поворота камеры, сохраняя y и z на 0.

Однако следующий IEnumerator приводит к странным eulerAngles, таким как 10, -74.653, 0.

enter image description here

Я не понимаю, как значение y может изменяться в следующей функции:

private IEnumerator LerpCameraNormalRot()
{
    float duration = 0.5f;

    for (float t = 0f; t < duration; t += Time.deltaTime)
    {
        float f = Mathf.Lerp(camera.transform.eulerAngles.x, 10, t / duration);
        Vector3 vNew = new Vector3(f, 0, 0);
        camera.transform.eulerAngles = vNew;
        yield return 0;
    }
}

Разве это не странно?Я никогда не меняю значения Y и Z!

Я только хочу изменить вращение X (eulerAngle.x) с его текущего значения на 10.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вы устанавливаете eulerAngles, но это приведет к другим localEulerAngles, которые обозначены красной рамкой на вашем изображении.Если у объекта есть повернутые предки, они, вероятно, не будут совпадать!

Чтобы решить вашу непосредственную проблему, вы можете использовать localEulerAngles вместо eulerAngles:

float f = Mathf.Lerp(camera.transform.localEulerAngles.x, 10, t / duration);
Vector3 vNew = new Vector3(f, 0, 0);
camera.transform.localEulerAngles= vNew;

.Проблема в том, что он не учитывает возможность перехода от 359 градусов к 0 градусам.Еще лучше было бы использовать Quaternion.Euler и Quaternion.Slerp для использования кватернионов, а не углов Эйлера:

private IEnumerator LerpCameraNormalRot()
{
    float duration = 0.5f;
    Quaternion startRotation = camera.transform.localRotation;
    Quaternion goalRotation = Quaternion.Euler(10f, 0f, 0f);

    for (float t = 0f; t < duration; t += Time.deltaTime)
    {   
        camera.transform.localRotation = Quaternion.Slerp(startRotation, goalRotation, t/duration);
        yield return 0;
    }

    camera.transform.localRotation = goalRotation;
}
0 голосов
/ 13 декабря 2018

Unity использует два представления вращения, положения, углов euler и т. Д.

  • один находится в мировом пространстве
  • другой находится в локальном пространстве

значения, не включающие local в их названии, находятся в мировом пространстве.Если у вашего объекта есть какие-либо родители, которые повернуты / масштабированы / переведены, вы не увидите значений, которые вы установили в Unity, поскольку инспектор Transform отображает локальные координаты.

Если вы хотите установить local вместо точных координат используйте вместо этого localPosition, localRotation или localEulerAngles.

Мне кажется, вы хотите повернуть камеру вокруг своей локальной оси x на 10 ° в 0,5секунд.

Так что я думаю, что вы могли бы вместо этого сделать это как

private IEnumerator LerpCameraNormalRot()
{
    float duration = 0.5f;

    float initialRotationX = camera.transform.localEulerAngles.x;
    float targetRotationX = 10;

    for (float t = 0f; t < duration; t += Time.deltaTime)
    {
        float currentX = Mathf.Lerp(initialRotationX, targetRotationX, t / duration);

        camera.transform.localEulerAngles = new Vector3(currentX , 0, 0);

        // Which would be the same as using 
        // camera.transform.localRotation = Quaternion.Euler(new Vector3(currentX, 0, 0));

        yield return null;
    }

    // to be sure you have no overshooting you could set the target rotation fix here as well
    camera.transform.localEulerAngles = new Vector3(targetRotation, 0 ,0);

    // or
    // camera.transform.localRotation = Quaternion.Euler(new Vector3(targetRotation, 0, 0));
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...