Moin!
Ich schreibe derzeit ein kleines Spiel (eine Art Tower-Defense) und bastle wie in der Überschrift beschrieben derzeit an einer Methode, die feststellen soll, ob der eine Spieler im SIchtfeld eines anderen Spieler auftaucht.
Meine Spieler-Klasse besitzt X- und Y-Koordinate sowie eine Rotation um die Z-Achse (Yaw). Sollte einfach sein, da 2D. Denkste.
Mein Ansatz:
So dachte ich mir das:
(Entsprechendes Bild im Anhang, Variablen aus meinem Quellcode entsprechend benannt)
1. Erstelle einen Vektor, der quasi die Luftlinie zwischen beiden Spielern angibt. (line)
2. Erstelle einen Vektor, der in die Blickrichtung von SpielerA zeigt. (yawLine)
3. Normalisiere beide Vektoren, um den acos bilden zu können.
4. Bilde den Winkel zwischen der Luftlinie und der Blickrichtung (angle)
(4.1 Bilde den Acos aus dem Skalarprodukt beider Vektoren)
5. Übersetze zurück in Grad (degree)
6. Wenn der Betrag des Winkels kleiner als 90° ist, sollte sich SpielerB in einem 180° Sichtfeld von SpielerA befinden.
Problem:
Meine Methode erkennt nur Spieler in >einer< Hälfte des Sichtfeldes von SpielerA, in der anderen "erkennt" er Spieler, die sich eigentlich auf der gegenüberliegenden Seite hinter ihm befinden.
-> Irgendwas mache ich hier falsch, komme aber auch nach Stunden der Recherche und des Nachrechnens nicht darauf. (Ist auch mein erstes Projekt dieser Art)
Es würde mich sehr freuen, wenn mir hier jemand helfen könnte! Trigonometrie und Vektorräume sind nicht gerade mein Fachgebiet, aber ich arbeite dran :).
[Btw.: Da das hier in erster Linie ein mathematisches Problem ist, hab' ich es als "Allgemein" gekennzeichnet. Ich selbst schreibe in C#, jedoch sollte sich meine Methode, sobald fertig, auch in anderen Sprachen nutzen lassen]
MfG,
X-Zat / Mo
Ich schreibe derzeit ein kleines Spiel (eine Art Tower-Defense) und bastle wie in der Überschrift beschrieben derzeit an einer Methode, die feststellen soll, ob der eine Spieler im SIchtfeld eines anderen Spieler auftaucht.
Meine Spieler-Klasse besitzt X- und Y-Koordinate sowie eine Rotation um die Z-Achse (Yaw). Sollte einfach sein, da 2D. Denkste.
Mein Ansatz:
Quellcode
- private bool PlayerSeesPlayer(Player playerA, Player playerB)
- {
- Vector2 line = playerA.Vector2 - playerB.Vector2;
- float yaw = DegToRad(playerA.Yaw);
- Vector2 yawLine = new Vector2((float)Math.Sin(yaw), (float)Math.Cos(yaw));
- line.Normalize();
- yawLine.Normalize();
- float angle = (float)Math.Acos(DotProduct(line,yawLine));
- float degree = RadToDeg(angle);
- return Math.Abs(degree) < 90;
- }
- private float DegToRad(float deg) { return (float)(deg * (Math.PI / 180f)); }
- private float RadToDeg(float rad) { return (float)(rad * (180f / Math.PI)); }
- private float DotProduct(Vector2 v1, Vector2 v2) { return (v1.X * v2.X) + (v1.Y * v2.Y); }
So dachte ich mir das:
(Entsprechendes Bild im Anhang, Variablen aus meinem Quellcode entsprechend benannt)
1. Erstelle einen Vektor, der quasi die Luftlinie zwischen beiden Spielern angibt. (line)
2. Erstelle einen Vektor, der in die Blickrichtung von SpielerA zeigt. (yawLine)
3. Normalisiere beide Vektoren, um den acos bilden zu können.
4. Bilde den Winkel zwischen der Luftlinie und der Blickrichtung (angle)
(4.1 Bilde den Acos aus dem Skalarprodukt beider Vektoren)
5. Übersetze zurück in Grad (degree)
6. Wenn der Betrag des Winkels kleiner als 90° ist, sollte sich SpielerB in einem 180° Sichtfeld von SpielerA befinden.
Problem:
Meine Methode erkennt nur Spieler in >einer< Hälfte des Sichtfeldes von SpielerA, in der anderen "erkennt" er Spieler, die sich eigentlich auf der gegenüberliegenden Seite hinter ihm befinden.
-> Irgendwas mache ich hier falsch, komme aber auch nach Stunden der Recherche und des Nachrechnens nicht darauf. (Ist auch mein erstes Projekt dieser Art)
Es würde mich sehr freuen, wenn mir hier jemand helfen könnte! Trigonometrie und Vektorräume sind nicht gerade mein Fachgebiet, aber ich arbeite dran :).
[Btw.: Da das hier in erster Linie ein mathematisches Problem ist, hab' ich es als "Allgemein" gekennzeichnet. Ich selbst schreibe in C#, jedoch sollte sich meine Methode, sobald fertig, auch in anderen Sprachen nutzen lassen]
MfG,
X-Zat / Mo