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

Aktuelle Zeit: Do Mär 28, 2024 19:45

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Matrizen
BeitragVerfasst: So Mär 02, 2014 14:20 
Offline
DGL Member

Registriert: Fr Apr 13, 2012 10:06
Beiträge: 3
Programmiersprache: AHK,Delphi,C,Java
Hi
Ich habe eine Frage zu Matrizen.
Ich habe bereits die beiden Tutorials durchgelesen und viel bei Google gesucht, jedoch die Information die ich suche nicht gefunden.
Es kann sein das ich die Information überlesen habe.
Ich verstehe nicht für was der eine äußere Teil gut ist:
Bild
Zu diesem rechten äußeren Rand finde ich keine Informationen.
Es wäre nett wenn mir jemand erklären könnte wie ich diese mit einem 3 Dimensionalen Vektor verechnen muss.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrizen
BeitragVerfasst: So Mär 02, 2014 15:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Mathematisch gesehen ist eine Multiplikation von 4x4-Matrix und 3-komponentigem Vektor nicht möglich. In einer 3x3-Matrix lässt sich jedoch keine Translation unterbringen* (weshalb deine Grafik eigentlich falsch ist*). Daher verwendet man in der 3D-Grafik einen Trick: Man ergänzt den 3er-Vektor um eine vierte Komponente (meist "w"), die man auf 1.0 setzt. Den 4er-Vektor kann man dann nämlich mit einer 4x4-Matrix (in der auch Translation enthalten sein kann) transformieren. (Mathematische Details hier.)

Solange es dir nur um Translation, Rotation und Skalierung geht, würde eigentlich eine 4x3-Matrix reichen, wie du schon erkannt hast. Matrizen haben in OpenGL aber auch andere Aufgaben, z.B. wird auch das Frustum als 4x4-Matrix gespeichert. Dabei werden alle Spalten und Zeilen gebraucht (siehe gluPerspective und glOrtho). Wenn man nun auch für die ModelView-Matrix (wo man üblicherweise nur Translation, Rotation & Skalierung braucht) das Format 4x4 wählt, hat das den Vorteil, dass man sie ohne Konvertierungen mit der Frustum-Matrix multiplizieren kann und als Ergebnis wieder eine 4x4-Matrix bekommt. Die Vertices können nun alle mit diesem Ergebnis multipliziert werden - also nur eine Transformation pro Vertex statt zwei.

Edit:
*) Stimmt im 3D-Fall, jedoch nicht für den 2D-Fall, wie Lord Horazont richtigerweise anmerkt.

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


Zuletzt geändert von glAwesome am Mo Mär 03, 2014 11:07, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrizen
BeitragVerfasst: So Mär 02, 2014 15:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
glAwesome hat geschrieben:
Mathematisch gesehen ist eine Multiplikation von 4x4-Matrix und 3-komponentigem Vektor nicht möglich. In einer 3x3-Matrix lässt sich jedoch keine Translation unterbringen (weshalb deine Grafik eigentlich falsch ist). Daher verwendet man in der 3D-Grafik einen Trick: Man ergänzt den 3er-Vektor um eine vierte Komponente (meist "w"), die man auf 1.0 setzt. Den 4er-Vektor kann man dann nämlich mit einer 4x4-Matrix (in der auch Translation enthalten sein kann) transformieren. (Mathematische Details hier.)


Ich möchte folgendes Anmerken: mit dem gleichen Trick wie OpenGL ihn für 3D verwendet, kann man für 2D in einer 3×3 Matrix sehr wohl Translation unterbringen, wie es wohl in dem Bild gezeigt wird (der Lineare Anteil ist eine Drehmatrix).

Ansonsten: Generell geht Translation nicht mit Matrizen, da es sich um lineare Abbildungen handelt (und Translation affin linear ist). Um das zu beheben, wendet OpenGL den w=1-Trick an: damit wird die letzte Zeile der Matrix einfach auf den Vektor addiert.

grüße,
Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrizen
BeitragVerfasst: Mo Mär 03, 2014 09:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Die Grafik ist falsch:

Multiplizierst du eine Matrix(n,n) mit einen Vektor(n) dann erhaelst du einen neuen Vektor(n). Jede Komponente dieses neuen Vektor entricht dabei dem Punkprodukt aus
Matrix-Zeile mit dem Urspruenglichen Vektor. Sprich um eine Translation einen Zweidimensionalen Vektors darzustellen brauchst du eigentlich eine Matrix(n+1,n). Fuer einen 2D Vektor sieht das also wie folgt aus:
Code:
  1.  
  2. mat = {
  3. 1,0,T[0].
  4. 0,1,T[1]
  5. }
  6. v = vec3(in[0],in[1],1.0f)
  7.  
  8. vec2(mat[0,0] * v[0] + mat[1,0] * v[1] +mat[2,0] * v[2], mat[0,1] * v[0] + mat[1,1] * v[1] +mat[2,1] * v[2]).
  9.  


Die Zusaetzliche Zeile ist fuer die Projektion auf die homogenen Koordinaten (also von -1.0 bis 1.0) von Bildschirm bzw. Tiefenbuffer zustaendig:

Code:
  1.  
  2. mat = {
  3. 1,0,T[0].
  4. 0,1,T[1],
  5. 320,240,1 //ungefaehr 640 * 480
  6. }
  7. v = vec3(in[0],in[1],1.0f)
  8.  
  9. vec2(mat[0,0] * v[0] + mat[1,0] * v[1] +mat[2,0] * v[2], mat[0,1] * v[0] + mat[1,1] * v[1] +mat[2,1] * v[2]) / mat[0,2] * v[0] + mat[1,2] * v[1] +mat[2,2] * v[2].
  10.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrizen
BeitragVerfasst: Mo Mär 03, 2014 10:59 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Genau das ist doch auch in der Grafik oben zu sehen?

Das man die Vekoren um "w" ergänzt, nennt sich übrigens homogene Koordinaten.
Zb. bei Normalen wird w=0 gesetzt. Eine Verschiebung macht dort nämlich keinen Sinn.

Die rechte Spalte ist für die perspektivische Transformation gut.
Die resultierenden Koordinaten X, Y, Z werden abschließend durch den "W"-Wert geteilt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrizen
BeitragVerfasst: Mo Mär 03, 2014 13:56 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Spalten != Zeilen mein lieber ;)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrizen
BeitragVerfasst: Mo Mär 03, 2014 18:37 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Das kommt doch auf die API an.
Bei Dx ist es zb. meines Wissens traditionell genau andersrum als bei OpenGL.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrizen
BeitragVerfasst: Mo Mär 03, 2014 19:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Theoretisch ja, praktisch nein. Auf dem Papier hast du einmal halt die Multiplikation nach Spalten (Column Major) (OpenGL, Blender) und halt die Multiplikation mit Zeilen (Row Major) (DirectX,Maya). Der einzig wirkliche Unterschied
ist halt das du bei CM die Matrix mal Vektor rechnest und bei RM den Vektor mal Matrix. Ansonsten ist es halt, meiner Meinung nach, reine Geschmackssache, man muss es halt nur richtig Dokumentieren (*hust* nicht so wie Biene *hust*).

Daher ist V*M

RM
Code:
  1.  
  2. x' = x * c00 + y * c10 + z * c20
  3. y' = x * c01 + y * c11 + z * c21
  4. z' = x * c02 + y * c12 + z * c22
  5.  


und M*V

CM
Code:
  1.  
  2. x' = c00 * x + c01 * y + c02 * z
  3. y' = c10 * x + c11 * y + c12 * z
  4. z' = c20 * x + c21 * y + c22 * z
  5.  


wenn also in der Formel MA*V*MB steht musst du also erst CM und dann RM rechnen. Oder am besten gleich die Fehlermeldung werfen.

OpenGL orientiert sich hier übrigens nicht an uns Programmierer sondern am Mathematiker und dort ist leider CM die bevorzugte Methode (sollte klar sein warum). Das Ganze wird noch Verwirrender wenn man bedenkt das in OpenGL noch ein kleiner Fehler aus Iris Zeiten steck. Denn früher wurde tatsächlich RM benutzt und daher ist das Speicherlayout auch immer noch genau wie bei RM. ;)

Komischerweise ist DX hier die einzige API die ich kenne wo alles von Vorne bis Hinten zusammenpasst (irgendwas müssen die ja auch mal besser machen lol)

_________________
Meine Homepage


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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.098s | 17 Queries | GZIP : On ]