Faire pivoter l'objet pour faire face au joueur

8

Il s'agit probablement d'une simple question vectorielle, mais je ne sais pas comment le faire.

J'ai un objet en position vectorielle (ox,oy). Potentiellement à chaque mise à jour, l'utilisateur parcourt l'écran et sera en position (px,py)à tout moment. Comment faire en sorte que l'objet soit toujours face au joueur? J'ai besoin d'obtenir l'angle en degrés.

C'est ce avec quoi je me suis amusé, mais la direction ne pointe pas immédiatement vers où se trouve l'utilisateur. Au lieu de cela, il augmente lentement dans la direction dans laquelle l'utilisateur marche.

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

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

Je me trompe peut-être complètement, donc toute aide est appréciée!

XSL
la source

Réponses:

13

Pensez différemment au problème. Vous voulez toujours vous opposer à "faire face" au joueur, ce qui signifie que vous voulez que son vecteur "avant" tourne autour pour être parallèle au vecteur de lui-même au joueur. En supposant que son vecteur "avant" est normalement à obj.Rotation = 0, la rotation appropriée est fondamentalement l'arctangente de Vector2.Subtract(playerPos, objectPos). La plupart des bibliothèques mathématiques auront quelque chose comme atan2ça qui prend deux arguments ou un Vector2qui trouvera automatiquement le bon quadrant pour vous.

EDIT: J'ai réalisé que vous êtes en C # et ce sont en fait des classes intégrées. Vous n'avez donc pas à aller chercher la documentation de la bibliothèque de mathématiques, je peux le faire pour vous. Le bon code doit être:

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

Notez l'inversion X / Y; pour les raisins secs hystériques, Atan2 a toujours les arguments inversés.

Paul Z
la source
Merci, ça marche. Je pense que j'ai déjà essayé cela, mais une fois que j'ai supprimé la normalisation, cela a fonctionné.
XSL
1
Il est tentant de normaliser tous les vecteurs que vous rencontrez, mais ce n'est pas toujours une bonne idée. Vous voulez vous assurer de garder clair la différence entre une position et une direction; les directions peuvent être normalisées en toute sécurité, mais les positions ne devraient jamais l'être. Dans ce cas, objVec et playerVec sont clairement les positions des entités respectives et ne doivent jamais être normalisés.
Paul Z
9
De quels raisins hystériques parlez-vous? Sont-ils délicieux?
Olhovsky