Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 13:39

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Jun 24, 2016 15:34 
Offline
DGL Member

Registriert: So Jun 12, 2016 13:05
Beiträge: 9
Programmiersprache: Lazarus 1.6.
Halllo,

Nach tagelangen probieren und durchforsten von Tutorials hab ich doch noch irgendwie ein Verständnisproblem mit den Matrizen..

Ich habe:
3 Rotationswinkel: RotX, RotY und RotZ (ob man alle brauch sei dahin gestellt)
6 Bewegungsrichtungen (deltaPosX(+-), deltaPosY(+-), deltaPosZ(+-)
2 Skalierungsrichtungen (Scale +-)

Als Haupterkenntnis meiner Recherchen war, das eine MVP Matrix gebildet (errechnet) werden muss....ist es richtig das es besser ist diese MVP von der CPU zu errechnen statt der GPU?

für die Modellmatrix bräuchte ich gesamt 4 4x4 Matrizen?
(Skalierungsmatrix x Skalierungsvektor) x (RotMatrixX mit RotX) x (RotMatrixY mit RotY) x (RotMatrixZ mit RotZ) = ModellMatrix ?

Die ViewMatrix ist eine eigene...

position der Kamera
Betrachtungspunkt der Kamera
Höhenwinkel der Kamera

Perspektivmatrix (perspektivisch oder orthogonal) jeweils eine Matrize (entweder oder)

Ist dieser Gedankengang soweit korrekt oder hab ich nen absoluten Fehler drinn?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 26, 2016 09:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
hartkern hat geschrieben:
Ich habe:
3 Rotationswinkel: RotX, RotY und RotZ (ob man alle brauch sei dahin gestellt)
6 Bewegungsrichtungen (deltaPosX(+-), deltaPosY(+-), deltaPosZ(+-)
2 Skalierungsrichtungen (Scale +-)
An sich richtig, aber an deiner Aufzählung stören mich mehrere Dinge.
  • Auch Rotationswinkel können natürlich positiv wie negativ sein. Dies würde ich jedoch überall nicht mitzählen.
  • Warum heißen deine Translationsvariablen deltaPosX, deltaPosY und deltaPosZ? Möchtest du hier eine Geschwindigkeit beschreiben oder die aktuelle Position?
  • Skalieren kannst du prinzipiell entlang jeder Achse (3 Freiheitsgrade) oder du gibst einen Wert an, der für alle Achsen gleichermaßen gilt (1 Freiheitsgrad).
Insgesamt hättest du also 3+3+3=9 Freiheitsgrade wenn du jede Achse individuelle skalieren willst oder 3+3+1=7 Freiheitsgrade mit einheitlicher Skalierung. Entsprechend viele floats bräuchtest du, um eine Transformation zu speichern.

Soviel zur Theorie. Jetzt mal praktisch. Du hast ja schon richtig erkannt, dass du eine Modelmatrix, eine Viewmatrix und eine Projektionsmatrix brauchst*. Diese drei Matrizen kannst du durch Multiplikation zu einer ModelViewProjectionMatrix (=Projection x View x Model) zusammenfassen. Wenn man das macht, macht man es auf der CPU, ja. Das hat den Vorteil, dass du im Vertexshader nur diese eine Matrix auf deine Vertices anwenden musst. Es entlastet also die GPU. Wenn du in einem Shader jedoch Zwischenergebnisse brauchst, z.B. für Beleuchtungsberechnungen, musst du mit den einzelnen Matrizen arbeiten (oder mit Zweierprodukten wie View x Model).

In der Modelmatrix wird die Transformation des zu rendernden Models festgehalten. Also Translation, Rotation und Skalierung. Du kannst für jede dieser Transformationsarten eine eigene 4x4-Matrix bauen und sie durch Multiplikation zu einer einzigen Matrix zusammenfassen. Oder du baust die Matrix in einem Schritt (was schwieriger ist) bzw. lädst sie aus einer Datei. Analog kannst du auch die Rotationsmatrix nochmal in drei Matrizen für Rotation um X-, Y-, und Z-Achse aufteilen und die Gesamtrotation durch Matrixmultiplikation berechnen. Beachte dabei, dass die Multiplikationsreihenfolge dabei im Allgemeinen nicht egal ist (hast du wahrscheinlich auch schon in den Tutorials gelesen).

Was du zu View- und Projektionsmatrix schreibst, ist alles richtig.

*manchmal braucht man auch nicht alle drei oder sogar gar keine von ihnen. Das wirst du aber selbst erkennen, wenn du das Prinzip verinnerlicht hast - bis dahin "brauchst" du diese drei Matrizen einfach immer.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 26, 2016 13:19 
Offline
DGL Member

Registriert: So Jun 12, 2016 13:05
Beiträge: 9
Programmiersprache: Lazarus 1.6.
Danke erstmal für deine ausführliche Antwort..das die Rotationswinkel natürlich auch negativ sein können..macht ja Sinn..

Was mir jedoch noch nicht so klar ist, wie wende ich die jeweiligen Matrizen auf ein bestimmtes Objekt an..bisher hab ich lediglich einen Würfel..(der gute alte Einsteigerwürfel)..der Würfel kommt als VBO daher..wenn jetzt nen 2 Würfel aus nen neuen VBO, wie "spreche" ich die beiden jeweils an?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 26, 2016 13:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Die Matrizen sind ja Uniformvariablen im Shader. Die musst du vor dem Rendern auf die richtigen Werte setzen (z.B. mit glUniformMatrix4fv). Für den Anfang würde ich es so machen, dass du immer erst das VAO für das zu rendernde Model bindest, dann die Matrizen mit glUniform setzt und schließlich mittels glDrawArrays oder glDrawElements renderst. Dann das gleiche mit dem nächsten Model und so weiter.

Wenn du irgendwann ans CPU-Limit stößt (was bei sehr vielen kleinen Objekten passieren wird), kannst du dir verschiedene Techniken zur Reduktion der API-Calls anschauen. Da wären z.B. Instancing und MultiDraws. Man kann sich im Shader auch ein Array von Uniform-Matrizen anlegen (eines für jedes Model), und das komplette Array mit einem glUniform-Aufruf aktualisieren oder an ein BufferObject binden. Das alles brauchst du aber für den Anfang nicht. Mach erstmal so wie im ersten Absatz beschrieben.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 26, 2016 21:21 
Offline
DGL Member

Registriert: So Jun 12, 2016 13:05
Beiträge: 9
Programmiersprache: Lazarus 1.6.
Ahh so langsam kommt Licht ins dunkel...

Macht es Sinn den ganzen Matrizenkram in eine eigene Unit auszulagern und dort die Mutter aller 4x4 Matrizen festzulegen und dann jeweils die Translation, Skalierung, Rotationsmatrizen davon abzuleiten , Proceduren für Matrizenmultiplikatione etc. und eigentlich die Imideate Funktionen nachzubauen wie aus der fixed Pipeline? Oder dgibts für Delphi auch so ne GLM Unit wie für C++? Oder erfindet jeder sein Rad neu?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 26, 2016 22:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Eine Matrixklasse mit all diesen Funktionen zu haben ist auf jeden Fall sinnvoll. Ob es da was fertiges für Pascal gibt - da bin ich als C++ler überfragt. Vielleicht weiß das ein anderes Forenmitglied.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jun 27, 2016 18:39 
Offline
DGL Member

Registriert: So Jun 12, 2016 13:05
Beiträge: 9
Programmiersprache: Lazarus 1.6.
SO ich mal wieder...

Als Frage vorn weg...

Wenn ich lediglich nur eine Translationsmatrix an den shader schicke, sollte sich mein Viereck anzeigen lassen?

Weil, ich hab eine Translationsmatrix die wie folgt aufgebaut ist,

Code:
  1. 1,0,0,x
  2. 0,1,0,y
  3. 0,0,1,z
  4. 0,0,0,1

Mein Viereck aber Sachen macht, die bei ner Translation eher nie Dasein sollten...ist jetzt mein Mathe Buch falsch?

Oder bin ich jetzt auf die Colum,Row Sache reingefallen?

Edit: ja bin ich...bei gluniform auf true setzen...dann gings


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jun 28, 2016 17:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Macht es Sinn den ganzen Matrizenkram in eine eigene Unit auszulagern und dort die Mutter aller 4x4 Matrizen festzulegen und dann jeweils die Translation, Skalierung, Rotationsmatrizen davon abzuleiten ,

Dies macht auf jeden Fall Sinn.

Ich habe zu diesem Zweck eine Klasse gebaut.

Code:
  1.  Ob es da was fertiges für Pascal gibt - da bin ich als C++ler überfragt. Vielleicht weiß das ein anderes Forenmitglied.

Ich hätte da eine fertige Klasse.

PS: Hast den Weg vom Lazarus-Forum hierher gefunden ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jun 28, 2016 18:52 
Offline
DGL Member

Registriert: So Jun 12, 2016 13:05
Beiträge: 9
Programmiersprache: Lazarus 1.6.
Ja den hab ich,

gelesen schon lange, aber spätestens seit den Matrizenkram auch aktiv zum nerven :)

Ich würde mir gerne mal dein Werk anschauen...wird vermutlich inhaltlich ähnlich sein, aber bestimmt besser geschrieben als meine ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 19 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.046s | 18 Queries | GZIP : On ]