Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

27.07.2010, 08:21

Was bewirkt glOrtho? (OpenGL)

Hallo,


ich hab mich auf http://www.kddresearch.org/... und http://msdn.microsoft.com/... (für beide: siehe Abschnitt 2) über glOrtho informiert.
Dort ist die Matrix O definiert, mit der die aktuelle Matrix M durch den Aufruf von glOrtho multipliziert wird.
Dabei habe ich mich über das Vorzeichen der Einträge von O mit folgenden Indizes (Mathematiker-Indizierung, beginnend bei 1) gewundert:
(1, 4), (2, 4), (3, 4)
Deswegen habe ich ein Experiment gestartet, wodurch ich tatsächlich auf einen Widerspruch gestossen bin.
Allerdings weiß ich jetzt nicht, was ich falsch gemacht / verstanden habe und hoffe, dass mir hier jemand helfen kann.


Übrigens: Hier gibts Probleme mit der Formatierung. Deswegen habe ich die Original-Textdatei angehängt.




void glOrtho(double left,
double right,
double bottom,
double top,
double near,
double far)


=====================================================================================


Formel:


2 / (right-left)00tx
02 / (top-bottom)0ty
00-2 / (far-near)tz
0001


wobei


tx = (right+left) / (right-left)
ty = (top+bottom) / (top-bottom)
tz = (far+near) / (far-near)


siehe:
http://www.kddresearch.org/Courses/CIS736/Resources/OpenGL_PG_Blue/glOrtho.html
oder
http://msdn.microsoft.com/en-us/library/dd373965(VS.85).aspx


=====================================================================================


Beispiel


void ausgabe4x4(float* matrix)
{
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
{
cout << setw(15) << matrix[i + j * 4];
}
cout << endl;
}
cout << endl;
}
void RenderScene()
{
int matrixModus = 0;
glGetIntegerv(GL_MATRIX_MODE, &matrixModus);
assert(matrixModus == GL_MODELVIEW);


float matrix[16];


glLoadIdentity();
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
ausgabe4x4(matrix);// Ausgabe 1


glOrtho(0., 50., 0., 50., 50., -50.);// glOrtho
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
ausgabe4x4(matrix);// Ausgabe 2




=====================================================================================


Ausgabe 1 liefert die Identity
1000
0100
0010
0001


Aufruf von glOrtho mit
left= 0
right= 50
bottom= 0
top= 50
near= 50
far= -50


Ausgabe 2 liefert
0.0400-1
00.040-1
000.020
0001


=====================================================================================


Setzt man aber die Argumente, mit denen glOrtho auferufen wurde, in die Formel ein,
erhält man ein abeweichendes Ergebnis:


wegen
tx = (right+left) / (right-left)= (50+0) / (50-0)= 50 / 50 = 1
ty = (top+bottom) / (top-bottom)= (50+0) / (50-0)= 50 / 50 = 1
tz = (far+near) / (far-near)= 0 /-100 = 0


berechne ich
0.04001
00.0401
000.020
0001
»georg« hat folgende Datei angehängt:
  • glOrtho.txt (2,75 kB - 118 mal heruntergeladen - zuletzt: 14.04.2024, 20:35)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »georg« (27.07.2010, 08:33)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

27.07.2010, 09:04

Hi georg,

die Quelle www.kddresearch.org scheint falsch zu sein. In allen anderen Quellen (msdn, OpenGL SDK Documentation, ...) enthält die Matrix folgende Werte:

§ \begin{pmatrix} \frac{2}{right-left} & 0 & 0 & -\frac{right+left}{right-left} \\ 0 & \frac{2}{top-bottom} & 0 & -\frac{top+bottom}{top-bottom} \\ 0 & 0 & \frac{-2}{farVal-nearVal} & -\frac{farVal+nearVal}{farVal-nearVal} \\ 0 & 0 & 0 & 1 \end{pmatrix} §
@D13_Dreinig

3

27.07.2010, 09:55

OK, dann werd ich www.kddresearch.org schonmal nicht mehr benutzen.
Vielen Dank

Werbeanzeige