Eu tenho dois objetos (alvo e jogador), ambos têm Posição (Vetor3) e Rotação (Quaternion). Quero que o alvo gire e fique de frente para o jogador. O alvo, quando atira em alguma coisa, deve atirar diretamente no jogador.
Eu já vi muitos exemplos de slerping para o jogador, mas não quero rotação incremental, bem, suponho que tudo ficaria bem desde que eu possa fazer o slerp ser 100%, e enquanto ele realmente funcionou.
Para sua informação, sou capaz de usar a posição e a rotação para fazer muitas outras coisas e tudo funciona muito bem, exceto esta última peça que não consigo entender.
Amostras de código são executadas na classe Target, Position = posição do alvo, Avatar = jogador.
EDITAR
Agora estou usando o código c # de Maik que ele forneceu e funciona muito bem!
0*(rotation A) + 1*(rotation B)
- em outras palavras, você está apenas configurando a rotação para a rotação B pelo caminho mais longo. Slerp é apenas para determinar como deve ser a rotação (0% <x <100%) do caminho.Respostas:
Existem mais de uma maneira de fazer isso. Você pode calcular a orientação absoluta ou a rotação relativa ao seu avatar, o que significa sua nova orientação = avatarOrientation * q. Aqui está o último:
Calcule o eixo de rotação levando o produto cruzado do vetor de unidade para a frente do seu avatar e o vetor de unidade do avatar para o destino, o novo vetor para a frente:
Calcular o ângulo de rotação usando o produto escalar
Crie o quaternion usando rotAxis e rotAngle e multiplique-o com a orientação atual do avatar
Se você precisar de ajuda para encontrar o vetor para a frente atual do avatar, a entrada para 1. basta atirar :)
EDIT: calcular a orientação absoluta é realmente um pouco mais fácil, use o vetor direto da matriz de identidade em vez do vetor direto de avatares como entrada para 1) e 2). E não multiplique em 3); use-o diretamente como a nova orientação:
newRot = q
Importante observar: A solução possui 2 anomalias causadas pela natureza do produto cruzado:
Se os vetores avançados forem iguais. A solução aqui é simplesmente retornar o quaternion de identidade
Se os vetores apontam exatamente na direção oposta. A solução aqui é criar o quaternion usando avatares acima do eixo como eixo de rotação e o ângulo 180,0 graus.
Aqui está a implementação em C ++ que cuida desses casos extremos. Convertê-lo em c # deve ser fácil.
Edição: Versão corrigida do código XNA do Marc
fonte
newForward
rotAngle
rotAxis
e thereturned quaternion
. O código para o mob será o mesmo, uma vez que fizemos o trabalho com o avatar, será fácil alterar o cabeçalho de qualquer objeto.