Giro meu personagem do jogo para assistir ao alvo usando o seguinte código:
transform.rotation = Quaternion.Slerp(startQuaternion, lookQuaternion, turningNormalizer*turningSpeed/10f)
startQuaternion é a rotação atual do personagem quando um novo alvo é dado.
lookQuaternion é a direção que o personagem deve olhar e está definido assim:
destinationVector = currentWaypoint.transform.position - transform.position;
lookQuaternion = Quaternion.LookRotation(destinationVector, Vector3.up);
TurnNormalizer é apenas Time.deltaTime
incrementado e turningSpeed
é um valor estático fornecido no editor.
O problema é que, embora o personagem gire como deveria na maioria das vezes, ele tem problemas quando precisa fazer perto de 180 graus. Às vezes, ele se agita e reflete a rotação:
Nesta imagem mal desenhada, o personagem (à direita) começa a girar em direção ao círculo à esquerda. Em vez de apenas virar pela esquerda ou direita, inicia esta "dança do espelho":
- Começa a girar em direção ao novo revestimento
- De repente, ele se encaixa no mesmo ângulo, mas do outro lado e continua girando
Faz esse "espelhamento" por tanto tempo até olhar para o alvo. Isso é uma coisa com quaternions, slerping / lerping ou algo mais?
EDIT1: Aparentemente, o problema não surge da própria rotação. O problema mais provável é que o personagem se mova na direção do rosto enquanto gira. Como limitar o ângulo, entre o rosto e o alvo, quando o personagem pode se mover, reduz e às vezes elimina a rotação de tremulação / espelhamento.
É claro que isso levanta mais questões: por que o personagem não pode se mover e girar ao mesmo tempo sem problemas? Código usado para o movimento:
transform.Translate(Vector3.forward * runningSpeed/10f * Time.deltaTime);