Objekte werden nach glTranslatef() nicht angezeigt

Tubbycore

Grünschnabel
Hi zusammen,
ich wollte ein bisschen openGL lernen und komm einfach nicht weiter.
Könnt ihr mir helfen bzw. wisst ihr warum mein Rechteck nicht mehr angezeigt wird, wenn ich glTranslatef() davor ausführe?
Wenn ich es weglasse wird's angezeigt. Das ganze wird läuft in Qt.
Danke im vorraus.

Code:
void GLWidget::paintGL()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-3.0, 3.0, -3.0, 3.0, -1.0, 100.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
//    glTranslatef(0.0f, 2.0f, 0.0f);     //move
    glBegin(GL_POLYGON);                //start draw
        glVertex3f(1.0f, 1.0f, 0.0f);   //top right
        glVertex3f(1.0f, 0.0f, 0.0f);   //bottom left
        glVertex3f(0.0f, 0.0f, 0.0f);   //bottom right
        glVertex3f(0.0f, 1.0f, 0.0f);   //top left
    glEnd();                            //end drawing
}
 
Hallo Tubbycore

Prüfe alle Funktionen von OpenGL immer auf Fehler! glFrustum schlägt in deinem Fall fehl da zNear mit -1 keinen Sinn ergibt. Daher bleibt glFrustum ohne Effekt, daher sind world, view und projection alle identity und die Daten die du angibst bei glVertex3f werden als normalisierte Devicekoordinaten verstanden.

Normalisierte Devicekoordinaten sind ein Würfel von -1 bis 1 für alle 3 Achsen wobei x für die Horizontale, y für die Vertikale und z für die Tiefe steht. Ein Quadrat von 0/0 nach 1/1 füllt also genau den oberen rechten Quadranten des Backbuffers aus. Verschiebst du dein Quadrat um 2 Einheiten in y-Richtung bist du auf jeden Fall schon ausserhalb des Bereichs in dem die normalisierten Koordinaten liegen würden.

Grüsse
Cromon
 
Ah ok danke für die Infos. Jetzt habe ich zNear positiv gesetzt
Code:
glFrustum(-3.0, 3.0, -3.0, 3.0, 1.0, 100.0);
aber nun wird mein Rechteck wieder nicht angezeigt. Hab's irgendwie doch noch nicht ganz verstanden. Die Parameter Werte müssten doch jetzt stimmen. Warum schlägt es immernoch fehl?
 
Hallo

Das Frustum das du da definiert hast mappt Koordinaten der Tiefe 1 auf die z-Koordinate 0 und die der Tiefe 100 auf die z-Koordinate 1. Entsprechend sind deine Vertices mit Tiefe 0 im negativen Bereich und daher "hinter dem Bildschirm".

Hier hast du einen Artikel der die Bascis etwas abdeckt. Ich habe ihn selber nicht gelesen, weiss nicht ob er gut ist, macht aber einen sympathischen und korrekten Eindruck:
http://www.falloutsoftware.com/tutorials/gl/gl0.htm

Grüsse
Cromon
 
Habs mir mal durchgelesen und ich habs inzwischen auch hinbekommen das es den Sichtbaren bereich kommt. Trotzdem kommen mir noch sind noch ein par Fragezeichen in meinen Kopf ;).
Und zwar wo genau ist denn die Default koordinate von der "Kamera", etwa im Ursprung aso (0,0,0)?
Wie bekomme ich den Ursprung in die Bildschirmmitte?
Was ist stimmt hier nicht?
Code:
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
//    glTranslatef(0.0f, 0.0f, 10.0f);
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 100.0);
Ich kann noch mit glTranslatef auf die Kamera verschieben oder etwa nicht? Wenn ja dann müsst doch die Kamera 10 Units weiter hinten (also auf mich zu) bewegt worden sein. Und mit glFrustum kann sie 100 Units in die Tiefe schauen. D.h. der mittelpunkt ist eig. im Sichtbaren bereich oder verwechsel ich da etwas?
 
Hallo

Du hast kein Kamera wenn du keine view matrix setzt, wenn man so will. Die Koordinaten werden 1:1 so an die Projektionsmatrix übergeben wie sie an den input assembler übergeben werden. Wenn du eine enstprechende Kamera willst solltest du eine view matrix erstellen zum Beispiel über gluLookAt.

Dein Code funktioniert nicht weil das folgende Passiert:
Zuerst werden deine Koordinaten mit der Frustummatrix in den Bereich -1/-1/-1 bis 1/1/1 gebracht, anschliessend wird die z-Koordinate mit der Translationsmatrix um 10 erhöht. OpenGL verwendet folgende Reihenfolge der Multiplikation: matrix * vector. Wenn jetzt matrix = translate * frustum ist wie in deinem Fall gibt das translate * frustum * vector = result.

Wenn du also das Objekt verschieben willst musst du zuerst translation auf das Objekt anwenden (dafür ist die modelview matrix da) und dann die projektion. Es ist eine gute Idee als Projektionsmatrix nicht viel mehr zu haben als entweder gluPerspective für perspektivische Projektion oder gluOrtho für orthographische Projektion ausser du möchtest irgendwelche fancy Effekte.

Grüsse
Cromon
 
ah dankeschön. jetzt hats klick gemacht. Ich hab den ganze Bildschirm in betracht gezogen, bis mir aufgefallen ist das nur ein kleiner Bereich unten links verwendet wird. Werde noch ein bisschen mit rumspielen müssen aber das gröbste hab ich jetzt verstanden. Dankeschön schonmal :)

Nichtsdestotrotz muss ich doch noch eine kleine Frage stellen. Wenn das ganze Widget benutzen als sichtbaren Bereich benutzen will, was muss ich da definieren?
 
Zurück