Postavio sam temu i na OpenGL forum. Dobio sam odgovor da je to 'vjerovatno' zato sto je objekat van clipping prostora, i da je podrazumijevana transformacija projekcije obicno glOrtho2d(-1.0, 1.0, -1.0, 1.0), mada se u to ne treba uzdati jer nije definisano specifikacijom, i da je uvijek potrebno definisati svoju projekciju. Meni je to bilo razumljivo objasnjenje, jer je u slucaju kad mi je kamera na poziciji (0.0, 0.0, 1.1) kvadrat van clipping prostora (near=-1, far=1).
Medjutim, to objasnjenje mi je djelovalo prihvatljivo dok nisam poceo da eksperimentisem oko ortografske projekcije, gdje mi je sve objasnjeno izgubilo smisao. Pomjerio sam kameru malo unazad, na poziciju (0.0, 0.0, 1.5), kvadrat je i dalje u Z=0 ravni, i pokusao da podesim ortografsku projekciju tj. clipping prostor. Kakve god vrijednosti koristio za near i far, nisam uspio da prikazem kvadrat. Moje shvatanje je bilo da su near i far udaljenosti clipping ravni od kamere, mjereci u smijeru prema kojem kamera gleda. Slijedeci primjer me je nacinio totalno zbunjenim, jer za novi polozaj kamere nisam uspio da prikazem kvadrat ni sa jednim podesavanjem ortografske projekcije:
Code:
void Redraw() {
glClearColor( 0.0, 0.0, 0.0, 0.0 );
glClear(GL_COLOR_BUFFER_BIT);
// VIEW TRANSFORMATION
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
gluLookAt( 0.0, 0.0, 1.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ); // camera point moved to z=1.5 position
// MODEL TRANSFORMATION
glColor3f( 1.0, 0.0, 0.0 );
glBegin(GL_LINE_LOOP);
glVertex3f( 0.5, 0.5, 0.0 );
glVertex3f( 0.5, -0.5, 0.0 );
glVertex3f( -0.5, -0.5, 0.0 );
glVertex3f( -0.5, 0.5, 0.0 );
glEnd();
// PROJECTION TRANSFORMATION - none of these below work
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -1.0, 1.0, -1.0, 1.0, -5.0, 5.0);
// glOrtho( -1.0, 1.0, -1.0, 1.0, 0.0, 5.0);
// glOrtho( -1.0, 1.0, -1.0, 1.0, -5.0, 0.0);
// glOrtho( -1.0, 1.0, -1.0, 1.0, 5.0, -5.0);
// etc.
glFlush();
}
int main(int argc, char **argv) {
glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE );
glutInit( &argc, argv );
glutInitWindowPosition( 200, 200 );
glutInitWindowSize( 300, 300 );
glutCreateWindow( "Test" );
glutDisplayFunc( Redraw );
glutMainLoop();
return 0;
}