Почему при вращении объекта по оси z он вращает также x и y, а не устанавливает z в 0? - PullRequest
0 голосов
/ 06 февраля 2020

Я хочу, чтобы объект вращался только на z. Чтобы сохранить x и y и изменить z на 0.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Whilefun.FPEKit;

public class PlayAnimation : MonoBehaviour
{
    public List<GameObject> cameras = new List<GameObject>();
    public GameObject head;

    private Animator anim;
    private bool started = true;
    private float animationLenth;
    private bool rotateHead = false;

    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
    }

    private void Update()
    {
        if (FPESaveLoadManager.gameStarted == true && started == true)
        {
            FPEInteractionManagerScript.Instance.BeginCutscene();

            anim.enabled = true;
            anim.Play("Stand Up", 0, 0);
            animationLenth = anim.GetCurrentAnimatorStateInfo(0).length;
            StartCoroutine(AnimationEnded());
            started = false;
        }

        if(rotateHead == true)
        {
            head.transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(transform.rotation.x, transform.rotation.y, 0f), 1.0f * Time.deltaTime);
        }
    }

    IEnumerator AnimationEnded()
    {
        yield return new WaitForSeconds(animationLenth);

        anim.enabled = false;
        FPEInteractionManagerScript.Instance.EndCutscene();
        rotateHead = true;
    }
}

Я пытаюсь повернуть голову. Когда анимация заканчивается, вращение головы: X = -9.922001 Y = 6.804 Z = 4.167

Когда вращение головы заканчивается или, возможно, оно никогда не заканчивается, так как оно в обновлении? Поворот головы: X = -4,529 Y = -9,392 Z = 0,988 Почему x и y меняются, а z никогда не доходят до 0?

Еще одна странная вещь, которую я увидел, теперь - положение преобразования на X при анимации закончилась -5.089218e-12 что это за е-12?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Пример того, что я сказал на ответе Musaps:

using UnityEngine;

public class ExampleLerp: MonoBehaviour
{
    public float Start = 2.0f;
    public float End = 0.0f;
    public float TimeToTravel = 3.0f;

    private float elapsedTime = 0.0f;
    private float inverseTime;
    // Start is called before the first frame update
    void Start()
    {
      inverseTime = 1.0f/TimeToTravel;
    }

    private void Update()
    {
      float ratio = 0.0f;   
      // Increment our elapsedTime
      elapsedTime += Time.deltaTime;
      if(elapsedTime > TimeToTravel)
      {
        ratio = 1.0f;
      }
      else
      {
        ratio = elapsedTime * inverseTime // Or can be done as elapsedTime/TimeToTravel
      }

      Debug.log("value is: " + Math.Lerp(Start, End, ratio));

    }
}

Используя текущее вращение, используя то же вращение цели, и не сохраняя ваш прогресс с течением времени, вы увидите замедление, так как приближается к концу, но математически никогда не достигнет конца.

0 голосов
/ 06 февраля 2020

Прежде всего, e-12 - это 10 ^ -12 или, в вашем случае, -0.000000000005089218. Возможно, это происходит из-за математического числа с плавающей точкой.

z не достигает 0, потому что вы используете функцию lerp без изменения коэффициента интерполяции в пути. Лерп означает линейную интерполяцию. Третий параметр, который он получает ( 1.0f * Time.deltaTime в вашем коде) - это коэффициент интерполяции. Если бы это отношение было 0,5, значение z перешло бы к среднему значению разницы (то есть (0 - 4,167) * 0,5). Например; Lerp (0, 1, 0.5f) заставляет его перейти на 0,5 в следующем кадре и на 0,75 в другом.

Давайте рассмотрим, как ваша игра работает со скоростью 60 кадров в секунду. Это делает Time.deltaTime = 1/60. Когда Lerp начинает выполняться в вашем коде, z составляет 4,167 в первом кадре. Вы хотите, чтобы он достиг нуля. Коэффициент интерполяции равен 1,0f * Time.deltaTime, что составляет 0,01666 ... или 1/60. Это означает, что z переместится на 1/60 от разницы.

Во втором кадре z достигает (4.167 + (0 - 4.167) / 60) = 4.09755 В третьем кадре z достигает (4.09755 + (0 - 4.09755 / 60) = 4.0292575

Это можно преодолеть, проверив значение z по отношению к значению допуска.

if (rotateHead)
{
    const float end = 0f;
    var rotation = transform.rotation;
    var z = Mathf.Lerp(rotation.z, end, 1.0f * Time.deltaTime);
    const float tolerance = 1f;
    if (Math.Abs(z - end) < tolerance) z = 0;
    head.transform.rotation = Quaternion.Euler(rotation.x, rotation.y, z);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...