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

Aktuelle Zeit: Sa Jul 19, 2025 02:24

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Nov 16, 2006 00:08 
Offline
DGL Member

Registriert: Mi Aug 28, 2002 17:03
Beiträge: 37
Wohnort: ABG
Wir versuchen hier gerade einen Softwarerenderer umzusetzen. Ich versuche es auf Wegen von OpenGL...

Was mich schon seit Ewigkeiten nicht klar werden will, in welcher Reihenfolge die Matrizen multipliziert werden und welche davon tranponiert sind(ist ja entscheident für die Reihenfolge)

gehen wir mal von folgenden Code aus:
Code:
  1. glViewport(0, 0, 500, 400);
  2. glDepthRange(0.0, 1.0);
  3.  
  4. glMatrixMode(GL_PROJECTION);
  5. glLoadIdentity();
  6. gluPerspective(90.0, 500.0/400.0, 0.1, 100.0);
  7.  
  8. glMatrixMode(GL_MODELVIEW);
  9. glLoadIdentity();
  10. glScalef(1.0, 2.0, 3.0);
  11. glRotatef(45.0, 0.0, 1.0, 0.0);
  12. glTranslatef(5.0, 6.0, 7.0);
  13.  
  14. glVertex3f(8.0, 9.0, 10.0)


ich benutze mal die Matrizenbezeichnungen P für Projection und M für Modelview.
Code:
  1. // Modelview x Object coords = Eye coords
  2. |Ex|       |Ox|
  3. |Ey| = M x |Oy|
  4. |Ez|       |Oz|
  5. |Ew|       |Ow|
  6.  
  7.  
  8. // Projection x Eye coords = Clip coords
  9. |Cx|       |Ex|
  10. |Cy| = P x |Ey|
  11. |Cz|       |Ez|
  12. |Cw|       |Ew|
  13.  
  14. // Normalized Device coords
  15. |Dx| = Cx/Cw
  16. |Dy| = Cy/Cw
  17. |Dz| = Cz/Cw
  18. |Dw| = ????
  19.  
  20. // Window coords
  21. Wx = (Px/2)Dx + Ox
  22. Wy = (Py/2)Yd + Oy
  23. Wz = ((f - n)/2)Dz + (n + f)/2
  24.  
  25. gluProjection(fov, aspect, zNear, zFar)
  26. f = cotangent(fovy/2)
  27. |    f                                     |
  28. |  ------  0        0            0         |
  29. |  aspect                                  |
  30. |                                          |
  31. |    0     f        0            0         |
  32. |                                          |
  33. |               zFar+zNear  2*zFar*zNear   |
  34. |    0     0    ----------  ------------   |
  35. |               zNear-zFar   zNear-zFar    |
  36. |                                          |
  37. |    0     0       -1            0         |


So stehts in den OpenGL Specs....

Angewand mal auf das obrige Beispiel:
Code:
  1. // glViewport(0, 0, 500, 400)
  2. Px = 500
  3. Py = 400
  4. Ox = 250 // = 0 + 500/2
  5. Oy = 200 // = 0 + 400/2
  6.  
  7. // glDepthRange(0.0, 1.0)
  8. n = 0.0
  9. f = 1.0
  10.  
  11. /* glMatrixMode(GL_PROJECTION);
  12.    glLoadIdentity();
  13.    gluPerspective(90.0, 500.0/400.0, 0.1, 100.0) */
  14.  
  15. F      = 1.0  // = cotangent(90.0/2.0)
  16. Aspect = 1.25 // 500/400
  17.  
  18. |    F                                    |
  19. |  ------  0         0            0       |
  20. |  Aspect                                 |
  21. |                                         |
  22. |    0     F         0            0       |
  23. |                                         |
  24. |               100.0 + 0.1  2*100.0*0.1  |
  25. |    0     0    -----------  ------------ |
  26. |               0.1 - 100.0  0.1 - 100.0  |
  27. |                                         |
  28. |    0     0        -1           0        |
  29.  
  30.  
  31. |   0.8    0       0      0   |
  32. |                             |
  33. |    0     1       0      0   |
  34. |                             |
  35. |    0     0    -1.002 -2.002 |
  36. |                             |
  37. |    0     0      -1      0   |


Jetzt würde mich die Matrixreihenfolge interessieren:
Code:
  1. // glMatrixMode(GL_MODELVIEW);
  2. // glLoadIdentity();
  3. // glScalef(1.0, 2.0, 3.0);
  4. // glRotatef(45.0, 0.0, 1.0, 0.0);
  5. // glTranslatef(5.0, 6.0, 7.0);
  6. M = Identity
  7. M = M x Scale
  8. M = M x Rotate
  9. M = M x Translate

Stimmt das so?

Ist beispielsweise die Translatematrix dann so aufgebaut?
Code:
  1. | 1 0 0 X |
  2. | 0 1 0 Y |
  3. | 0 0 1 Z |
  4. | 0 0 0 1 |

(Ist praktisch eine transponierte Tranlsationsmatrix)

Verändert gluPerspective glDepthRange? Wie kann gluProject ohne Angabe von Depthrange arbeiten?

Es geht in dem Thread vorallem um die WindowZ Koordinaten, damit endlich ein Depthbuffer eingebaut werden kannn. Theoretisch sollten sich ja die WindowZ Werte im bereich -1.0 und +1.0 (nach oder bevor?) der Viewporttransformation bewegen, oder?

mfg olli

Edit: Habe mal noch 640,480 durch 500,400 beim Viewport geändert, weil ich die Werte schon in gluPerspective hatte.

_________________
Programmieren beginnt im Kopf und endet im Compiler


Zuletzt geändert von Vertex am Do Nov 16, 2006 07:58, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Nov 16, 2006 02:59 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 19:15
Beiträge: 172
Ganz schön viel 8)
Ich übernehme mal einen einfachen Teil
Vertex hat geschrieben:
Jetzt würde mich die Matrixreihenfolge interessieren:
Code:
  1. // glMatrixMode(GL_MODELVIEW);
  2. // glLoadIdentity();
  3. // glScalef(1.0, 2.0, 3.0);
  4. // glRotatef(45.0, 0.0, 1.0, 0.0);
  5. // glTranslatef(5.0, 6.0, 7.0);
  6. M = Identity
  7. M = M x Scale
  8. M = M x Rotate
  9. M = M x Translate

Stimmt das so?

Ist beispielsweise die Translatematrix dann so aufgebaut?
Code:
  1. | 1 0 0 X |
  2. | 0 1 0 Y |
  3. | 0 0 1 Z |
  4. | 0 0 0 1 |

(Ist praktisch eine transponierte Tranlsationsmatrix)

Ja das stimmt so. Bei der Translationsmatrix und überhaupt stellst du dir am besten garnicht erst vor das die Matrix transponiert sei, sondern das die schon immer so ausgesehen hat. Dann kannst du einen Vertex durch die Matrix jagen, in dem du ihn rechts-oben drüber schreibst und multiplizierst.
Code:
  1.  
  2.              VX
  3.      x       VY
  4.              VZ
  5.              1
  6. | 1 0 0 X | VX + X
  7. | 0 1 0 Y | VY + Y
  8. | 0 0 1 Z | VZ + Z
  9. | 0 0 0 1 | 1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 16, 2006 08:00 
Offline
DGL Member

Registriert: Mi Aug 28, 2002 17:03
Beiträge: 37
Wohnort: ABG
Super, das hilft mir schonmal erheblich weiter, dass die Vektoren Spaltenvektoren sind und dass die Matrix-Vektor Reihenfolge beim Multiplizieren so richtig herum ist.

_________________
Programmieren beginnt im Kopf und endet im Compiler


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.015s | 16 Queries | GZIP : On ]