Vektoren in der Spieleentwicklung

19

Ich bin neu im Programmieren und Spielprogrammieren. Ich habe etwas über Vektoren und Mathematik gelesen, aber ich habe eine Frage - wo verwende ich Vektoren bei der Spielprogrammierung? Vielleicht kann jemand ein einfaches Beispiel geben, wo Sie Vektoren verwenden (in 2D)?

Ich habe Beispiele gefunden, aber meistens befinden sie sich in der Konsole, wo sie Zahlen ausgeben, und große Beispiele, die ich nicht verstehe.

vqwer
quelle
Grundlegende TL; DR-Vektoren sind Teil des Themas Lineare Algebra und führen zu Matrizen. Mit Matricies und Linear Algebra schreiben Sie alles von einem Minesweeper-Solver bis zu einer 3D-Weltprojektion, um zu sehen, welches Objekt sich unter Ihrem Cursor befindet. Die lineare Algebra ist der nützlichste und notwendigste Zweig der Mathematik für jeden Spieleentwickler. Lerne es jetzt; Du wirst es nicht bereuen.
Robert Massaioli
Danke an alle für die tollen Antworten! Aber warum verwenden Sie in diesem Tutorial nicht Vektoren ?: zetcode.com/tutorials/javagamestutorial Oder verwenden Entwickler andere Nein?
vqwer
Schwer zu sagen, wahrscheinlich wollte der Autor es für Anfänger einfach und grundlegend halten.
Maik Semder
Eigentlich benutzt der Autor sie, schauen Sie sich das class Star
Punktefeld
Auch hier wird Point2Dinclass ResizeRectangle
Maik Semder

Antworten:

31

Was sind Vektoren?

Vektoren sind Sätze von Koordinaten unterschiedlicher Dimension. Jede Koordinate in einem Vektor repräsentiert eine absolute Position in der Richtung des Raums, in dem sich der Vektor befindet.

  • Ein 1-D-Vektor wäre {1} . Dies könnte beispielsweise eine Position bei X = 1 sein oder eine Zeit t = 1.
  • Ein 2D -Vektor wäre {-4,3} . Dies könnte beispielsweise eine Position bei -4 auf der X-Achse und 3 auf der Y-Achse sein. Es könnte sich auch um die Temperatur (3 Grad) an einer Position (-4 Meter) auf der X-Achse handeln.
  • Ein 3D-Vektor wäre {1,2,3} . Dies könnte eine Position in Raum 1 entlang der X-Achse, 2 zurück auf der Y-Achse und 3 nach oben auf der Z-Achse sein. Oder es könnte 1 Rot, 2 Grün und 3 Blau in einer Farbe sein. Oder es könnte zu einem Zeitpunkt T ( {3} ) eine XY-Position ( {1,2 } ) sein.

Beachten Sie, dass wir in allen Fällen den Vektoren für unser Problem eine Bedeutung zugewiesen haben. Während Sie in Spielen häufig Vektoren finden, die für Geometrie verwendet werden, gibt es keinen Grund, warum Sie nichts anderes damit anfangen können.

Warum verwende ich Vektoren?

Erstens, die Sie nie haben Vektoren zu verwenden. Solange Sie x und y oder die Koordinaten, die Ihnen wichtig sind, im Auge behalten, geht es Ihnen in gewisser Weise gut.

Der Vorteil bei der Verwendung von Vektoren besteht jedoch darin, dass sie ordentlich Dinge wie Richtung und Position darstellen und auch mehrere mathematische Operationen definiert haben, die Ihnen das Leben erleichtern.

Betrachten Sie für ein einfaches Beispiel das Skalarprodukt .

Angenommen, Sie haben ein Radarsystem in einem Spiel von oben nach unten. Jeder Feind, der im Radarsektor auftaucht (ein kuchenförmiger Keil in 2D), sollte einen kleinen roten Punkt auf Ihrem Bildschirm haben. Sie müssen also herausfinden, welche Feinde sich in Ihrem Radarbereich befinden.

Sie können testen, ob sich die Feinde in einem Dreieck befinden. Sie können auch testen, ob sich die Feinde im Schnittpunkt der beiden Halbräume der Ebenen / Linien befinden, die die beiden Seiten des Radarsektors definieren.

Oder Sie können einfach ein Skalarprodukt verwenden , um die Prüfung durchzuführen. Hier ist wie:

  1. Erstellen Sie einen Vektor, der von der Mitte des Radars zur "Vorderseite des Radars" zeigt. Normalisiere es.
  2. Erstellen Sie einen Vektor, der von der Mitte des Radars aus in Richtung des Objekts geht, dessen Radarsichtbarkeit überprüft werden soll. Normalisiere es.
  3. Nehmen Sie das Skalarprodukt der beiden normierten Vektoren.
  4. Nehmen Sie den Arkuscosinus dieses Produkts und prüfen Sie, ob er kleiner als der halbe Winkel der Radarbreite ist. Wenn dies der Fall ist, ziehen Sie einen Punkt.

Dies ist sehr praktisch und ermöglicht es Ihnen, Radare, die in unterschiedliche Richtungen zeigen (ändern Sie einfach den Vorwärtsvektor) und unterschiedliche Breiten (ändern Sie einfach den Radarbreitenwinkel), auf einfache Weise zu verwenden. In diesen Fällen können Sie auch denselben Code wiederverwenden !

Warum verwende ich sonst Vektoren?

Wenn Sie in 2D arbeiten, können Sie komplexe Effekte und Bewegungen (Drehen, Skalieren usw.) am besten mithilfe eines Szenendiagramms erzielen. Ein Planet hat ein umkreistes Schiff, das Schiff hat eine umkreiste Drohne. Die Berechnung dafür ohne die Verwendung von Vektormathematik ist wirklich sehr, sehr hässlich.

In der Vektormathematik stellen wir jeweils einen Punkt und eine 3x3-Transformationsmatrix dar. Der Planet nutzt seine Transformation, das Schiff nutzt seine Transformation und die Transformation des Planeten, und die Drohne nutzt seine Transformation und die Transformation des Schiffes und die Transformation des Planeten.

Wenn sich der Planet bewegt, ändert man seine Transformation und das Schiff und die Drohne werden automatisch "kostenlos" positioniert. Viel sauberer Code.

Immer noch nicht überzeugt. Vektoren sind auch die native Darstellung für Position, Geometrie und Bewegung, die von fast allen Grafikbibliotheken verwendet wird - und sicherlich auch von OpenGL und DirectX. Sie werden wahrscheinlich nicht davonkommen, ohne sie zu benutzen.

Fazit Vektoren sind ein leistungsstarkes Werkzeug zum Schreiben von klarem Code, mit dem geometrische Probleme sauber und elegant gelöst werden können.

ChrisE
quelle
14

Ein 2D-Beispiel sind Bildschirmkoordinaten. Sie identifizieren ein Pixel auf dem Bildschirm und haben eine x- und eine y-Komponente [x, y], dh die linke obere Bildschirmposition [0, 0].

Ein weiteres Beispiel: Stellen Sie sich einen Text vor, der vom rechten Bildschirmrand zum linken Bildschirmrand läuft. Jetzt müssen Sie die Geschwindigkeit des Lauftexts in Pixel pro Sekunde definieren, dh [-20, 0], was bedeutet, dass der Text 20 Pixel pro Sekunde nach links rollt und niemals die Höhe ändert.

Ein weiteres erweitertes Beispiel: Stellen Sie sich ein 2D-Spiel vor, das auf verschiedenen Bildschirmauflösungen (800 x 600, 1024 x 768 usw.) ausgeführt werden soll. Dies kann problemlos intern durch Verwenden einer Bildschirmbreite von 0,0 bis 1,0 und einer Höhe von 0,0 bis 1,0 erfolgen, um die Spielelogik zu entkoppeln von der tatsächlichen Bildschirmauflösung. Wenn Sie nun auf den Bildschirm zeichnen, multiplizieren Sie einfach den internen Vektor mit dem Auflösungsvektor:

screen_pos = internal_pos * screen_ressolution

beachten Sie, dass alle 3 Variablen hier 2D-Vektoren sind, sie haben eine x- und eine y-Komponente, dh für diese internal_pos [0.5, 0.25]:

[400, 150] = [0.5, 0.25] * [800, 600]

So wird die interne Position [0.5, 0.25] in die tatsächliche Bildschirmposition [400, 150] umgewandelt

Das war das grundlegende Zeug. Der eigentliche Vorteil von Vektoren ist die Anwendung in der Linearen Algebra, bei der Sie mithilfe von Matrizen Ihre Scheitelpunkte (Drehen, Skalieren, Spiegeln usw.) transformieren können, dh Ihre gesamte interne Position einfach um 90 Grad drehen können, oder Sie müssen den Bildschirm austauschen Position 0 von oben nach unten auf dem Bildschirm, da z. B. eine von Ihnen verwendete Drittanbieter-Bibliothek diese Konvention verwendet.

Maik Semder
quelle
Ist ein Vektor nicht ein eindimensionales Array, wie eine Liste? Wenn wir über Bildschirmauflösung sprechen, sprechen wir nicht von einem mehrdimensionalen Array (eine Koordinate für jede X- und Y-Achse)? Nur um sicherzustellen, dass hier "Vektor" nicht mit einer Matrix verwechselt wird. =)
Will Marcouiller
@Wird die vollständigen Pixeldaten für den Bildschirm als mehrdimensionales Array behandelt werden können, im Grunde eine Bitmap, aber die Werte für Breite und Höhe, mit anderen Worten die Auflösung, können nicht
Maik Semder
2
Beachten Sie, dass ein Vektor in der Mathematik und in der Programmierung oft sehr unterschiedlich behandelt wird. Mathematisch gesehen ist ein Vektor kein mehrdimensionales Array, obwohl seine Komponenten in Bezug auf eine bestimmte Basis zusammen ein solches Array definieren. Der Vektor selbst ist koordinateninvariant. Die Operation screen_pos = internal_pos * screen_resolutionist nicht so koordinateninvariant, wie Sie sie geschrieben haben. Sie könnte geeignetererweise geschrieben werden screen_pos = map_to_screen * internal_pos, wenn map_to_screenes sich um eine lineare Zuordnung handelt (die als Matrix, in diesem Fall als diagonale, geschrieben werden kann).
Leftaroundabout
6

Hier ist eine großartige Erklärung der Vektoren in der Spieleentwicklung auf Wolfire Games Blog:

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

schockierend
quelle
Dies ist derzeit eine Nur-Link-Antwort. Bitte ziehen Sie eine grobe Zusammenfassung der wichtigsten Punkte in Betracht, von denen Sie hoffen, dass ein Leser sie über diesen Link lesen kann, damit die Antwort für sich allein stehen kann, selbst wenn sich der Link ändert, abbricht oder in Zukunft nicht mehr verfügbar ist.
DMGregory
1

Ein Vektor ist eine Entität, die sowohl einen Wert als auch eine Richtung hat. Beispiele für Vektoren in der realen Welt und physikalisch basierte Spiele sind Geschwindigkeit und Impuls. Eigenschaften, die nur Werte, aber keine Richtung haben, werden Skalare genannt und umfassen Position, Masse, Dichte usw.

Vektoren werden für Spiele benötigt, die vektorähnliche physikalische Eigenschaften emulieren (wie erwähnt - Geschwindigkeit, Beschleunigung usw.). Die Mathematik, die für Vektorberechnungen verwendet wird, wird als lineare Algebra bezeichnet .

Eran Galperin
quelle
Geschwindigkeit ist ein Skalar, es ist die Länge des Geschwindigkeitsvektors
Maik Semder
Richtig - behoben
Eran Galperin
1
und der Ort wird normalerweise als Vektor betrachtet, es ist die Entfernung, die skalar ist.
Ali1S232
Die Position kann sowohl als Skalar (oder als Sammlung von Skalaren) als auch als Vektor betrachtet werden, der vom Startpunkt der Achse aus zeigt.
Eran Galperin
1

Überall dort, wo Sie eine Zahl für jede Dimension haben, um etwas darzustellen, kann die Sammlung dieser Zahlen als Vektor betrachtet werden. Position, Geschwindigkeit und Beschleunigung sind die Hauptbeispiele für Vektoren. In einigen Fällen kann es auch sinnvoll sein, die Blickrichtung als Vektor darzustellen.

Für grundlegende Dinge spielt es keine Rolle, ob Sie diese Zahlen als Vektoren betrachten oder nicht, aber wenn Sie irgendeine Art von Physik betreiben möchten, sollten Sie sich mit Vektor-Mathematik befassen.

aaaaaaaaaaa
quelle
Position ist kein Vektor
Eran Galperin
Weder ist Geschwindigkeit, es ist ein Skalar, Geschwindigkeit ist ein Vektor
Maik Semder
2
@Eran Galperin Ich weiß, dass das unter Mathematikern eine ziemlich verbreitete Ansicht ist. Die Unterscheidung zwischen einem Punkt und seinem entsprechenden Positionsvektor ist jedoch recht akademisch. Es gibt keinen praktischen Grund, um die Unterscheidung Aufhebens zu machen.
aaaaaaaaaaa
1
Es gibt praktische Gründe, wenn Sie mit 4D homogenen Koordinaten und Matrizen arbeiten, Sie haben , um diese Unterscheidung zu machen. Dies ist jedoch für den Umfang dieser Frage nicht relevant.
Maik Semder
@eBusiness es ist keine "Ansicht", es ist eine Tatsache. Und ich bin ausgebildeter Physiker und kein Mathematiker.
Eran Galperin
0

Ganz einfach, alles mit einer Position oder einer Richtung, die überall in einem Spiel vorkommt, verwendet Vektoren. Ein Vektor ist wie ein Punkt

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

Der Unterschied liegt jedoch wirklich darin. Ein Punkt ist nur ein Punkt, während ein Vektor ein Pfeil ist.

Wenn Sie haben

Point2.x = 5;

Point2.y = 10;

Sie sagen, dass ich an dieser Stelle x 5 und y 10 meine.

Wenn Sie jedoch einen Vektor deklarieren ...

Vector2.x = 5;

Vector2.y = 10; 

Du sagst wirklich, ich deklariere einen Pfeil von 0,0 bis x 5, y 10;

Sie können sogar festlegen, dass der Punkt, von dem aus Ihr Vektor zeigt, ein Punkt im Raum ist. Verwenden Sie beispielsweise einen Punkt und einen Vektor, um unser Objekt zu verschieben. Verwenden Sie einen Punkt2, um seine Position zu speichern, und einen Vektor2, um es zu verschieben .

point2.x = 10;

point2.y = 15;

Jetzt können Sie einen Vektor verwenden, um diesen Punkt zu verschieben. Nehmen wir an, wir möchten diesen Punkt um 10 Einheiten auf der x-Achse nach oben verschieben

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

Jetzt hat sich der Punkt dahin bewegt, wo Ihr Vektorpfeil es befohlen hat.

Punkt ist jetzt

point2.x = 20;

point2.y = 15;

Als letztes ist zu beachten, dass ein Vektor manchmal wie ein Punkt verwendet wird und umgekehrt, nur weil er denselben Datentyp enthält.

EddieV223
quelle
Ein Punkt ist ein Vektor. Es ist ein Vektor vom Ursprung bis zum Punkt P.
Die kommunistische Ente
1
@Duck technisch gesehen , das ist nicht richtig, die sich auf homogenen Koordinaten dass Vektor durch Subtraktion der origin_point vom position_point gefunden werden kann, aber das macht sie nicht gleich: v = pos - originso v != posseit Herkunft ist ein Punkt{0, 0, 0, 1}
Maik Semder
@Duck: Ein Punkt ist kein Vektor, sondern ein Punkt, und der Ursprung definiert einen Vektor, der genauso gut ist wie die meiste Zeit, wenn Ihr Ursprung 0 ist.
@Duck warum hast du es dann deinen Punkt P genannt? LOL
EddieV223