2009-01-28 7 views
15

So, es ist ein paar Monate seit ich schrieb this question, seitdem habe ich mit "rohem" C++ D3D, die Ogre und Irrlicht Grafik-Engines und in letzter Zeit Microsoft XNA gespielt. Ich habe ein paar 2D-Spiele gebaut (hauptsächlich Nachbildungen von alten Sachen wie Tetris, Astroiden, etc.) und in den oben genannten Technologien einige (sehr) kleine Schritte in die 3D-Welt gemacht.Lernen Spiel Programmierung (Teil 2) (Mathematik)

Ich habe wenig bis keine Probleme beim Erstellen der eigentlichen Spiellogik, abstrahieren Objekt Interaktionen, damit ich verschiedene Formen der Kontrolle (Computer, Player, über das Netzwerk usw.) einstecken kann, Threading oder eines der anderen Dinge tun Ich bin es gewohnt von meiner täglichen Arbeit - das fühlt sich für mich ganz natürlich an. Ich habe sehr wenig mit HLSL und Partikeleffekten (sehr, sehr einfach) vermasselt.

Aber 3D Mathematik beteiligt Matrizen und Vektoren (und Quaternionen (?) In Ogre3D, werden diese wirklich benötigt?) ... wird mir wirklich, ich kann Beispiele folgen (zB das Learning XNA 3.0 Buch, das ich gekauft von O'Reilly, das ist ein tolles Buch btw) und ich verstehe warum und wie passiert etwas in dem Beispiel, aber wenn ich versuche, etwas selbst zu tun, fühle ich, dass mir das Verständnis für diese Art von Mathe fehlt in der Lage sein, wirklich bekommen Sie es und machen es selbst funktionieren.

Also ich bin auf der Suche nach Ressourcen zum Lernen 3D Mathematik (meist) und einige Shader/Partikel Effects Bücher. Ich würde Ressourcen bevorzugen, die pädagogisch sind und es langsam über etwas wie eine Doktorarbeit über Vektormathematik nehmen, die Weg über meinen Kopf sein wird. Die ideale Ressource wäre etwas, das alles in D3D demonstriert.

Antwort

24

Ok, ein Schnellgang Matrix/Vektor-Berechnung:

Eine Matrix ist eine Sammlung von Zahlen in einem rechteckigen Raster geordnet wie:

[ 0, 1, 2 ] 
[ 2, 3, 5 ] 
[ 2, 1, 3 ] 
[ 0, 0, 1 ] 

Die obige Matrix 4 Reihen und 3 Spalten und als solche ist eine 4 x 3-Matrix. Ein Vektor ist eine Matrix mit 1 Zeile (ein Zeilenvektor) oder 1 Spalte (ein Spaltenvektor). Normale Zahlen werden im Gegensatz zu Matrizen Skalare genannt.

Es ist auch üblich, Großbuchstaben für Matrizen und Kleinbuchstaben für Skalare zu verwenden.

Wir können grundlegende Berechnung mit Matrizen durchführen, aber es gibt einige Bedingungen.

Zusatz

Matrices hinzugefügt werden können, wenn sie die gleichen Abmessungen haben. So kann eine 2x2-Matrix zu einer 2x2-Matrix hinzugefügt werden, aber nicht zu einer 3x5-Matrix.

[ 1, 2 ] + [ 2, 5 ] = [ 3, 7 ] 
[ 2, 4 ] [ 0, 3 ] [ 2, 7 ] 

Sie sehen, dass durch Addition jede Zahl an jeder Zelle zu der Nummer an der gleichen Position in der anderen Matrix hinzugefügt wird.

Matrixmultiplikation

Matrices multipliziert werden kann, aber das ist ein wenig komplexer. Um Matrix A mit Matrix B zu multiplizieren, müssen Sie die Zahlen in jeder Zeile multiplizieren, wenn Matrix A mit jeder Spalte in Matrix B ist. Das heißt, wenn Sie eine Axb-Matrix mit einer Acxd-Matrix multiplizieren, müssen b und c gleich sein Matrix ergibt, ist axd:

[1,2,3] x [4,6] = [1x4+2x2+3x2, 1x6+2x1+3x3 ] = [4+4+6, 6+2+9 ] = [14, 20] 
[1,4,5] [2,1] [1x4+4x2+5x2, 1x6+4x1+5x3 ] [4+8+10, 6+4+15 ] [22, 25] 
      [2,3] 

Wie Sie mit Matrizes sehen können, A x B von B x A. unterscheidet

Matrix Skalarmultiplikation

Sie eine Matrix mit einem Skalar multiplizieren . In diesem Fall wird jede Zelle mit dieser Zahl multipliziert:

3 x [1,2] = [ 3, 6] 
    [4,7] [12,21] 

eine Matrix Matrix Division Invertierung ist nicht möglich, aber man kann eine Inversion einer Matrix, so dass A x A-inv ist eine Matrix erstellen mit all den Null, außer dass der Hauptdiagonale:

[ 1, 0, 0 ] 
[ 0, 1, 0 ] 
[ 0, 0, 1 ] 

eine Matrix invertieren kann nur mit quadratischen Matrizen durchgeführt werden und es ist eine komplexe Aufgabe, die zu keinem Ergebnis geführt neccesary hat.

beginnen mit der Matrix A:

[ 1, 2, 3 ] 
A = [ 1, 3, 4 ] 
    [ 2, 5, 1 ] 

Wir fügen 3 zusätzliche Spalten und füllen sie mit der Einheitsmatrix:

[ 1, 2, 3, 1, 0, 0 ] 
[ 1, 3, 4, 0, 1, 0 ] 
[ 2, 5, 1, 0, 0, 1 ] 

Jetzt beginnen wir mit der ersten Spalte. Wir müssen die erste Zeile von jeder anderen Zeile subtrahieren, so dass die erste Spalte nur Nullen enthält, mit Ausnahme der ersten Zeile. Um das zu tun, dass wir die erste Zeile einmal aus dem zweiten und zweimal aus dem dritten subtrahieren:

[ 1, 2, 3, 1, 0, 0 ] 
[ 0, 1, 1,-1, 1, 0 ] 
[ 0, 1,-5,-2, 0, 1 ] 

Jetzt wiederholen wir diese mit der zweiten Säule (zweimal aus der ersten Reihe und einmal aus dem dritten)

[ 1, 0, 1, 3,-2, 0 ] 
[ 0, 1, 1,-1, 1, 0 ] 
[ 0, 0,-6,-1,-1, 1 ] 

Für die dritte Spalte haben wir ein kleines Problem. Die Pivot-Nummer ist -6 und nicht 1.Aber wir können dieses Problem lösen, indem Sie die gesamte Zeile multipliziert mit -1/6:

[ 1, 0, 1, 3, -2, 0 ] 
[ 0, 1, 1, -1, 1, 0 ] 
[ 0, 0, 1, 1/6, 1/6, -1/6 ] 

Und jetzt können wir die dritte Zeile von den ersten subtrahieren und den zweiten:

[ 1, 0, 0, 17/6,-13/6, 1/6 ] 
[ 0, 1, 0, -7/6, 5/6, 1/6 ] 
[ 0, 0, 1, 1/6, 1/6, -1/6 ] 

Ok jetzt haben wir die inverse von A:

 [ 17,-13, 1 ] 
1/6 * [ -7, 5, 1 ] 
     [ 1, 1, -1 ] 



    [ 1, 2, 3 ] [ 17,-13, 1 ]    [ 6, 0, 0 ] [ 1, 0, 0 ] 
A = [ 1, 3, 4 ] x [ -7, 5, 1 ] x 1/6 = 1/6 x [ 0, 6, 0 ] = [ 0, 1, 0 ] 
    [ 2, 5, 1 ] [ 1, 1, -1 ]    [ 0, 0, 6 ] [ 0, 0, 1 ] 
:

[ 17/6,-13/6, 1/6 ] 
[ -7/6, 5/6, 1/6 ] 
[ 1/6, 1/6, -1/6 ] 

wir dies als schreiben

Hoffe das hilft ein bisschen.

+2

"Jetzt beginnen wir mit der ersten Spalte. Wir müssen die erste Zeile von jeder anderen Zeile so subtrahieren, dass die erste Spalte nur Nullen enthält, mit Ausnahme der ersten Zeile. Dazu subtrahieren wir die erste Zeile einmal von der zweiten und zweimal von der dritten: "Kopfschmerzen! – jokoon

1

Für Vektoren speziell, ein Einführungstext oder Kurs über lineare Algebra sollte in der Lage sein, Sie ziemlich schnell zu beschleunigen.

+0

Sie haben irgendwelche Texte zu empfehlen? – thr

9

Fredrik - die kurze Antwort ist, dass Sie ja Matrizen und Vektoren lernen müssen, da sie die mathematischen Grundlagen für 3D-Arbeiten sind.

Während lineare Algebra ist definitiv nicht Doktorat-Ebene Mathematik, wird es ein bisschen Arbeit brauchen. Um loszulegen, check out this book auf Amazon: es sieht aus wie es genau das ist, was Sie suchen. Ich habe dieses Buch nicht gelesen (das, das ich in der Schule verwendet habe, ist etwas veraltet), aber es ist besonders gut bewertet.

Eine andere Sache: Es gibt verschiedene 3D-Modellierungs-Engines, die diese Arbeit für Sie auf dem Markt erledigen. Die berühmteste von diesen ist wohl die Source Engine von Valve. Sie können diese Engine (für HalfLife2 & CounterStrike) verwenden, um einige ziemlich anspruchsvolle Spiele zu erstellen, während über das Niveau der 3D-Modellierung arbeiten. Tatsächlich hat eines der beliebtesten Spiele im Steam-Netzwerk, Garry's mod, mit jemandem angefangen, der nur mit coolen Dingen spielt, die man mit der Steam Engine machen kann. Hier ist eine link zu einer Website, die Tutorials zum Erstellen eigener Welten mit der Source Engine bietet, falls Sie interessiert sind.

+0

Ich habe gerade dieses Buch. Es ist sehr gut und ich bin keineswegs ein Mathe-Experte. Ich habe versucht, Vektoren für eine lange Zeit zu verstehen, aber gescheitert. Dieses Buch hat mich fast sofort verstanden. – Skurmedel

2

Mathematics for Computer Graphics Applications‘ ist ein Einführungsniveau Lehrbuch und nimmt eine Klasse geeigneter Ansatz, um alle der grundlegenden mathematischen, die Sie mit für die 3D-Programmierung (Matrizen und Vektoren meist)

Und ein Hinweis zu quaternions vertraut sein müssen: Sie sind sehr nützlich für bestimmte Anwendungen. SLERP (Spherical Linear intERPolation) kann sehr praktisch sein, um unter anderem glatte/ansprechende Kamerabewegungen zu erzeugen. SLERP ist ein Schmerz (teuer) mit Matrizen, aber billig und einfach mit Quaternions. Lerne sie zu benutzen und zu lieben - auch wenn du sie nicht vollständig verstehst.

4

Sie müssen unbedingt lineare Algebra lernen. MIT veröffentlichte die ganze Klasse kostenlos auf youtube. Sie können von here starten. Es ist nicht so schwer, glaub mir! Viel Spaß;)

+1

Die YT-Verbindung ist unterbrochen (privates Video) Gibt es einen Ersatzlink? – aikeru

+0

@aikeru danke! Ich habe es aktualisiert. –