Неустойчивое движение камеры с плавным движением
Я вижу, как камера заикается, когда я использую плавное следование, чтобы рыскать за моим игроком с моей камерой в многопользовательской браузерной игре. Позиция игрока принимается с сервера, игрок переходит на эту позицию, и моя цель - чтобы камера плавно следовала за игроком с его собственным, дополнительным сглаживанием.
Вы можете найти мою игру на 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 для плавного вращения между двумя вращениями.