Неустойчивое движение камеры с плавным движением

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

Вы можете найти мою игру на http://orn.io/ чтобы увидеть текущее состояние, без плавного отслеживания движения камеры, что лучше, но вызывает прерывистое движение и создает головную боль. Текущий код для камеры:

void LateUpdate ()
{
    if (Target == null) {
        return;
    }

    currentScale = Mathf.Lerp(currentScale, -GameManager.TotalMass, Mathf.Clamp01 (Time.deltaTime * heightDamping));

    Vector3 h = currentScale * 2f * Target.up;
    Vector3 f = currentScale * 3f * Target.forward;

    // tried lerping to this value but it causes choppy stutters
    Vector3 wantedPosition = new Vector3(Target.position.x, Target.position.y, currentScale * 2) + h + f;

    myTransform.position = wantedPosition;

    myTransform.LookAt (Target, -Vector3.forward); // world up
}

и я несколько дней пытался повозиться со значениями, использовать фиксированные временные метки, поместить движение камеры в FixedUpdate/Update, использовать MoveTowards и другие изменения, но все еще возникают проблемы.

Часть моей проблемы заключается в том, что позиция игрока изменяется в середине lerp, что вызывает заикание, так как целевая позиция изменяется в середине lerp. Это заставляет камеру подпрыгивать / дрожать из-за того, что целевое положение рычага изменяется в середине рычага, и дрожит из-за LookAt.

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

1 ответ

Есть ли какая-то конкретная причина, по которой вам нужно использовать функцию Mathf.Lerp?

В Unity есть функция Vector3.SmoothDamp, специально разработанная для прохождения движения:

void FixedUpdate() {
   // Code for your desired position
   transform.position = Vector3.SmoothDamp(transform.position, wantedPosition, ref moveVelocity, dampTime);     
}

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

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

Чтобы уточнить, цитируя из документации, влажность в приведенном выше:

Примерно время, необходимое для достижения цели. Меньшее значение быстрее достигнет цели.

Также рассмотрите возможность использования Quaternion.slerp для плавного вращения между двумя вращениями.

Другие вопросы по тегам