Drehe das Objekt zum Spieler

8

Dies ist wahrscheinlich eine einfache Vektorfrage, aber ich bin mir nicht sicher, wie ich das machen soll.

Ich habe ein Objekt an der Vektorposition (ox,oy). Möglicherweise läuft der Benutzer bei jedem Update über den Bildschirm und ist zu (px,py)jedem Zeitpunkt an der richtigen Position . Wie mache ich es so, dass das Objekt immer zum Spieler zeigt? Ich muss den Winkel in Grad bekommen.

Damit habe ich herumgespielt, aber die Richtung zeigt nicht sofort, wo sich der Benutzer befindet. Stattdessen erhöht es sich langsam in die Richtung, in die der Benutzer geht.

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

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

Ich könnte völlig falsch vorgehen, daher ist jede Hilfe willkommen!

XSL
quelle
Mögliches Duplikat der Ausrichtung eines Modells auf ein Ziel
Nicol Bolas

Antworten:

13

Denken Sie anders über das Problem nach. Sie möchten immer Einwände erheben, um dem Spieler "ins Gesicht zu sehen", was bedeutet, dass sein "vorwärts" gedrehter Vektor parallel zum Vektor von sich selbst zum Spieler sein soll. Unter der Annahme, dass sein "Vorwärts" -Vektor normalerweise bei ist obj.Rotation = 0, ist die richtige Drehung im Grunde der Arkustangens von Vector2.Subtract(playerPos, objectPos). Die meisten Mathematikbibliotheken haben so etwas wie atan2zwei Argumente oder eines Vector2, das automatisch den richtigen Quadranten für Sie herausfindet.

EDIT: Ich habe festgestellt, dass Sie in C # sind und dies tatsächlich integrierte Klassen sind. Sie müssen also nicht nach Dokumentation für die Mathematikbibliothek suchen, ich kann das für Sie tun. Der richtige Code sollte sein:

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

Beachten Sie die X / Y-Umkehrung. Bei hysterischen Rosinen sind bei Atan2 die Argumente immer umgekehrt.

Paul Z.
quelle
Danke, das funktioniert. Ich glaube, ich habe das schon einmal versucht, aber als ich die Normalisierung entfernt habe, hat es funktioniert.
XSL
1
Es ist verlockend, jeden Vektor zu normalisieren, auf den Sie stoßen, aber es ist nicht immer eine gute Idee. Sie möchten sicherstellen, dass der Unterschied zwischen einer Position und einer Richtung deutlich bleibt. Richtungen können sicher normalisiert werden, Positionen sollten es jedoch niemals sein. In diesem Fall sind objVec und playerVec eindeutig die Positionen der jeweiligen Entitäten und sollten niemals normalisiert werden.
Paul Z
9
Von wem sind diese hysterischen Rosinen, von denen Sie sprechen? Sind sie lecker?
Olhovsky