Проблема со Slerp Rotation Coroutine Unity3D - PullRequest
0 голосов
/ 19 мая 2019

У меня есть объект, который я хочу плавно повернуть на 90 градусов при проверке условия.

У меня проблема в том, что вращение работает нормально и плавно, но объект не достиг конечного вращения(90 градусов), он достигает 81 градуса и останавливается!что не так в моем коде?

Сценарий:

void Update() {
    if (Objects.Length == 0)
    {
        if (!Rotated)
        {
            StartCoroutine(RotateMe(Vector3.up * 90, 1f));
            Rotated = true;
        }
    }
}

IEnumerator RotateMe(Vector3 byAngles, float inTime)
{
    var fromAnglePlat = Platform.transform.rotation;
    var toAnglePlat = Quaternion.Euler(Platform.transform.eulerAngles + byAngles);

    for (var t = 0f; t < 1; t += Time.deltaTime / inTime)
    {
            Platform.transform.rotation = Quaternion.Slerp(fromAnglePlat, toAnglePlat, t);

            yield return null;
    }

}

Ответы [ 2 ]

3 голосов
/ 19 мая 2019

t < 1

t никогда не будет равно 1, поэтому окончательное вращение (до 90 градусов) не будет выполнено.

Вы должны добавить Platform.transform.rotation = toAnglePlat после циклачтобы убедиться, что точное желаемое вращение является последним до завершения сопрограммы (это всегда будет верно, в то время как t <= 1 все равно потерпит неудачу, потому что 0.995 меньше 1, но добавление 0.02 от времени дельты будет большечем 1).

1 голос
/ 19 мая 2019

Когда вы имеете дело со slerp и lerp, важно помнить, что параметр 't' - это процент (в десятичной форме, поэтому 0 - 1, а не 0 - 100), а не линейное увеличение. Вы упускаете важную переменную, то есть продолжительность, которую вы хотите, чтобы ваш slerp длился. Формула, которую вы обычно используете для получения параметра 't': t = timeSinceStart / duration.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...