Girar objeto para enfrentar o jogador

8

Provavelmente, essa é uma pergunta simples do vetor, mas não sei como fazê-lo.

Eu tenho um objeto na posição do vetor (ox,oy). Potencialmente, a cada atualização, o usuário percorre a tela e estará na posição (px,py)a qualquer momento. Como faço para que o objeto esteja sempre voltado para o jogador? Eu preciso obter o ângulo em graus.

É com isso que eu ando brincando, mas a direção não aponta imediatamente para onde o usuário está localizado. Em vez disso, aumenta lentamente na direção em que o usuário está caminhando.

 objVec.Normalize(); 
 playerVec.Normalize();

 obj.Rotation = MathHelper.ToDegrees((float)Math.Acos(Vector2.Dot(objVec, playerVec)));

Eu posso estar fazendo algo completamente errado, então qualquer ajuda é apreciada!

XSL
fonte
possível duplicata de Orientando um modelo para enfrentar um alvo
Nicol Bolas

Respostas:

13

Pense sobre o problema de maneira diferente. Você deseja sempre objetar "encarar" o player, o que significa que você deseja que o vetor "forward" girado seja paralelo ao vetor de si mesmo ao player. Supondo que seu vetor "forward" esteja normalmente em obj.Rotation = 0, a rotação adequada é basicamente o arco tangente de Vector2.Subtract(playerPos, objectPos). A maioria das bibliotecas de matemática terá algo parecido com atan2isso: dois argumentos ou um Vector2que descobrirão automaticamente o quadrante certo para você.

Edição: Eu percebi que você está em c # e estas são realmente classes internas. Para que você não precise procurar pela documentação da biblioteca de matemática, eu posso fazer isso por você. O código certo deve ser:

Vector2 facingVec = playerVec - objVec;
obj.Rotation = MathHelper.ToDegrees((float)Math.Atan2(facingVec.Y, facingVec.X));

Observe a reversão X / Y; para passas histéricas, o Atan2 sempre inverte os argumentos.

Paul Z
fonte
Obrigado, isso funciona. Acho que tentei isso antes, mas depois que removi a Normalização, funcionou.
XSL
11
É tentador normalizar todos os vetores que você encontrar, mas nem sempre é uma boa ideia. Você quer ter certeza de manter clara a diferença entre uma posição e uma direção; as direções podem ser normalizadas com segurança, mas as posições nunca devem ser. Nesse caso, objVec e playerVec são claramente as posições das respectivas entidades e nunca devem ser normalizados.
Paul Z
9
De quem são essas passas histéricas de que você fala? Eles são deliciosos?
Olhovsky