Jenseits von „Novice“ -Spielprojekten


22

Ich las diese Antwort über die Art von Mathematik, die ein Spieleentwickler kennen sollte, und dieser Teil fiel mir wirklich auf:

How do I move my game object? The novice might say:

"I know! I'll just do:" object.position.x++.

So würde ich denken, um es zu tun, denke ich, das zeigt meine Fähigkeitsstufe. Zumindest für die Arten von 2D-Side-Scrolling-Spielen im Arcade-Stil, die ich in der Vergangenheit gemacht habe, war das alles, was ich brauchte. Das und ein bisschen Trigonometrie.

Tatsächlich habe ich nicht viel lineare Algebra verwendet oder von Quaternionen gehört, bevor ich diesen Beitrag gelesen habe. Liegt es daran, dass diese Mathematik erst angezeigt wird, wenn Sie mit 3D arbeiten, oder daran, dass meine 2D-Spiele ziemlich einfach sind, dass ich mit naiven Implementierungen davongekommen bin.

Anschlussfrage: Wenn ich mich mit dieser Art von Mathematik vertraut machen möchte, welche Art von Projekten sollte ich durchführen? IE: Schreiben Sie eine Game-Engine, arbeiten Sie an einem 3D-Spiel usw.


1
khanacademy.org ist ideal für Anfänger und Fortgeschrittene. Plus theres Leistungen! Nichts wie eine Spieltheorie, die eine langweilige Akademie belebt.
verzögerte

Antworten:


16

Der eigentliche Trick dabei ist die Wissenschaft auf Hochschulniveau; was Sie sollten getan haben. Für den Fall , dass Sie bekommen nicht eine schnelle Google - Suche haben Sie begonnen . Um zu erklären, wie Sie die Denkweise von „Anfängern“ umgehen, nehmen Sie das Beispiel der Mondlandefähre .

Sobald Sie gelesen haben, dass [change in position] = [velocity] * [time passed]es klar wird, dass Sie diese Variablen im Auge behalten müssen:

float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.

Anschließend würden Sie die Velocity einfach auf die Position jedes Frames anwenden:

// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

Jetzt möchten wir die Geschwindigkeit jedes Frames ändern, damit wir die Schwerkraft hinzufügen können. Nach genau der gleichen Quelle [change in velocity] = [acceleration] * [time passed]. Deshalb können wir genau dasselbe Prinzip anwenden:

const float gravity = 9.8f; // The gravity of the earth.

// Add gravity to the vertical velocity.
vy = vy + gravity * deltaTime;
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

Jetzt brauchen Sie eine Möglichkeit für den Spieler, sein Raumschiff zu steuern. Wenn Sie mehr über die Grundlagen der Physik lesen, werden Sie feststellen, dass Bewegung das Ergebnis von Gewalt ist - ich kann jedoch keine Quelle finden [change in acceleration] = ([force] / [mass]) * time(soweit ich mich erinnere). Wenn der Player also eine Taste drückt, setzen Sie einfach die Variablen fxund fyauf etwas und wenden die Gleichung während des Updates an.

Letztendlich müssen Sie über die Physik rund um die Objekte in Ihrem Spiel nachdenken - und anstatt zu versuchen, sie so zu bewegen, wie Sie es denken würden, sollten Sie die Gleichung nachschlagen .

Zukunft Hinweis: Denken Sie daran , dass dies definitiv nicht der beste Weg , Physik zu tun (dies wird Euler Integration bezeichnet und kann bei niedrigeren Frameraten zu einigen ungeradeen Szenarien führen) - Sie in schauen müssen andere Möglichkeiten , Dinge zu tun (Dieser Artikel hat eine ganze auch eine nette Zusammenfassung der Grundlagen). Bleiben Sie jedoch vorerst bei der Euler-Integration, denn dies bedeutet, dass Sie versuchen, eine Sache weniger zu lernen.

Welche Spiele würden Sie lehren, wie man in der richtigen Denkweise denkt?

Wie würden Sie testen, ob Sie die Dinge richtig und mit der richtigen Einstellung gemacht haben? Fügen Sie eine Sleep(10 milliseconds)in Ihre Spieleschleife ein und alles sollte sich noch bewegen und genauso reagieren wie die volle Bildrate.

Halten Sie sich bitte von 3D fern (und erzwingen Sie Quaternions und Matrizen), bis Sie eine gute Erfahrung damit haben, 2D-Spiele zum Laufen zu bringen. Ich möchte sagen, dass einige Spieleentwickler nicht wirklich wissen, wie Quaternions oder Matrizen funktionieren - sondern nur wissen, wie man sie verwendet -, um sich ihnen viel später zu nähern (oder nie, 2D-Spiele machen viel Spaß und können recht sein erfolgreich). Sie müssen die lineare Algebra und so weiter nicht wirklich kennen, um dies auf der Grundstufe zu tun (aber es hilft wirklich, also gehen Sie zu einigen Nachtklassen, wenn Sie können).

Letzter Bonus: Eine Sache, die mir mein Kunstlehrer immer sagte, ist: "Zeichne nicht, was du denkst , was du siehst, sondern zeichne , was du siehst." Dasselbe gilt hier: "Modelliere nicht, was du denkst, passiert ( object.position++), modelliere, was passiert (` object.position + = velocity * time) "- zumindest bis zu vernünftigen Grenzen (du modellierst kein perfekt genaues System, sondern machst etwas, das eine gute Nachahmung ist).


Ich mag Ihre Idee, künstliche Verzögerungen zum Testen einzufügen. Die Schwerkraft der Erde beträgt 9,8, nicht 9,1
Steve

Seien Sie vorsichtig mit "modellieren Sie nicht, was Ihrer Meinung nach passiert, modellieren Sie, was passiert", es sei denn, Sie schreiben eine tatsächliche Simulation. Skalieren Sie nach Bedarf für Ihr Projekt. Manchmal ist "was du denkst passiert" eine gute Antwort für dein Design.
ChaosTechnician

@chaosTechnician auf dieser Ebene "was Ihrer Meinung nach passiert" ist object.position++. Ich werde die Antwort klären.
Jonathan Dickinson

-1 für instead of trying to make them move in the way you would think, rather look up the equation. Es geht darum , die Gleichungen zu verstehen und nicht nachzuschlagen. Das Wichtigste ist, dass das Spiel Spaß macht, und wer weiß, vielleicht werden Sie feststellen, dass eine variable Beschleunigung die Schwerkraft unterhaltsamer macht. Aber es wird sehr schwer zu überlegen sein, wie man das macht, wenn man die Gleichungen nicht versteht .
BlueRaja - Danny Pflughoeft

3
@ BlueRaja-DannyPflughoeft genau das habe ich ihm erklärt: Wenn man die Gleichung überhaupt nicht kennt, kann man sie nie verstehen - und die einzige Möglichkeit, sie zu verstehen, besteht darin, sie in einer realen Situation anzuwenden.
Jonathan Dickinson

3

Ich denke, Teile der Antwort, auf die Sie verwiesen haben, sind in ihrer Präsentation etwas elitär. Die Tugenden der Vektormathematik zu preisen und dann zu sagen, dass ein Objekt eine Position, Richtung und Beschleunigung benötigt, ist inkonsistent spezifisch, weil es sich wirklich nur auf so etwas wie das beschränkt, object.position.x += (object.velocity.x + object.acceleration.x) * deltaTimewas sich im Grunde nicht wesentlich davon unterscheidet object.position.x++. Quaternionen sind eine von vielen Möglichkeiten, Rotationen darzustellen. Ich mag sie, aber sie sind nicht wesentlich für das Verständnis von 3D-Rotationen. Ungeachtet dessen, was viele Quaternion-Benutzer implizieren, sind sie nicht der Heilige Gral der Rotationsmathematik.

Die Prinzipien der linearen Algebra liegen in einfachen 2D-Bewegungen, Rotationen usw. vor, aber die Mathematik ist einfacher, da es nur zwei Dimensionen gibt. Hier ist ein Beispiel .

Es gibt viele Möglichkeiten, Ihre Kenntnisse der linearen Algebra zu erlernen / zu verbessern:

  1. Ich habe darüber nachgedacht, einen Kurs in linearer Algebra zu belegen, aber mein Lehraufwand ist bereits ziemlich hoch, sodass ich die zusätzliche Arbeit nicht rechtfertigen konnte.
  2. Mein Verständnis der linearen Algebra hat erheblich zugenommen, da ich eine Reihe von Programmierkursen für Spiele-Engines besucht habe. Für mich war die Verwendung von Vektoren, Matrizen usw. (im Allgemeinen) auf der Engine-Seite der Dinge vorherrschender als auf der Spieleseite. Das heißt natürlich nicht, dass ich keine Matrizen im Spielcode verwendet habe - ich verwende sie nur nicht so oft wie bei der Engine-Codierung. ymmv
  3. Es gibt auch viele Bücher, die Ihnen helfen können, die Mathematik zu verstehen, die Sie auch wissen müssen. Ich mag dieses Buch, das ein Kapitel mit dem Titel "3D Math for Games" hat.

Wenn das Design Ihrer Spiele nicht die komplexe Mathematik erfordert, sollten Sie es nicht verwenden. :) Aber lass dich natürlich nicht davon abhalten, ein Spiel zu entwerfen, das dies tut.


0

Quaternionen für 2D wären ein völliger Overkill, ganz zu schweigen von dem rechenintensiven Aufwand. Die Bitmap-Rotation (2D) wird implizit von vielen Plattformen / Bibliotheken verarbeitet, da sie für das Schreiben von Anwendungen von so grundlegender Bedeutung ist, und selbst wenn dies nicht der Fall ist, ist die Rotation von 2D-Bitmaps nichts weiter als ein einfacher Trigger. In 3D werden die Dinge für den Durchschnittsmenschen erheblich weniger intuitiv, es sei denn, der Mensch hat als Erwachsener 3D-Code geschrieben, als er eigentlich mit dem Fahrrad hätte fahren sollen.

Die lineare Algebra ist auf 2D wie auch auf 3D anwendbar und sollte etwas sein, mit dem Sie vertraut sind, auch wenn Sie nur Mathematik an der Mittelschule gemacht haben. Wenn Sie jemals Linienschnittpunkte oder periodisches Zeichnen auf einer Linie (Integration) durchgeführt haben, haben Sie lineare Algebra verwendet.

Das Erlernen von 3D-Mathematik beginnt normalerweise damit, ein einfaches Objekt (wie einen Würfel) im 3D-Raum zu platzieren und eine bewegliche Kamera zu implementieren, die dieses Objekt aus verschiedenen Perspektiven betrachten kann. Diese Perspektive kann auch orthogonal beginnen, um die Dinge noch einfacher zu gestalten. Es geht darum, Punkte auf eine 3D-Ebene zu projizieren, die Ihren Bildschirm darstellt (Formel hier : Erweitern Sie diese zusätzlich zu y auf die x- und z-Achse). Wirklich, das ist der Beginn des Schreibens einer 3D-Engine, unabhängig von Ihrer Erfahrung. Flash und Processing.js sind zwei großartige Möglichkeiten, um so etwas einfach zu prototypen.


0

Sie haben Recht, dass lineare Algebra und komplexere Mathematik normalerweise 3D-Grafiken und 3D-Raum beinhalten. Aber es gibt noch mehr Mathe, die in 2D-Spielen durchgeführt werden kann. Physikmathematik kann ziemlich hart werden und wird komplexer, wenn man die Physik des weichen Körpers und die B-Spline-Dynamik berücksichtigt (und immer noch in 2D, denken Sie daran).

Versuchen Sie, eine Physikbibliothek zu erstellen oder zu zerlegen, die die Handhabung von Kollisionen und die Reaktion auf gängige 2D-Formen behandelt. Die lineare Algebra ist sehr nützlich für die Berechnung von Bahnvektoren für Kollisionen. Das Skalarprodukt steht in enger Beziehung zum Einheitskreis, der in der Trigonometrie verwendet wird. Die Komplexität der Starrkörperphysik nimmt jedoch exponentiell zu, wenn sie in 3D angewendet wird.

Mit 3D-Grafiken erhalten Sie ein besseres Verständnis für Matrixberechnungen, Quaternionen, lineare Algebra und einige angewandte Berechnungen. Als Erstes werden Sie wahrscheinlich Matrizen verwenden, um Objekte im 3D-Raum zu bewegen und zu manipulieren.


0

Wenn Sie 2D-Spiele schreiben, verwenden Sie wahrscheinlich bereits lineare Algebra. Sie wissen es einfach nicht! Zumindest die Grundlagen über Vektoren formal zu erlernen, ist ziemlich einfach, trägt jedoch wesentlich dazu bei, das Denken über ansonsten komplexe Bewegungen zu vereinfachen.

Beispielsweise werden hier viele Fragen dazu gestellt, welche Gleichungen zur Simulation von Kurvenbewegungen verwendet werden sollen, z. Aber wenn Sie Vektoren verstehen, müssen Sie nur zwei Vektoren addieren. Darüber hinaus wird das Hinzufügen von Dingen wie Luftwiderstand oder Reibung unglaublich einfach. Berechnen Sie einfach den Widerstandsvektor und addieren Sie ihn zur Geschwindigkeit. Presto!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.