PDA

View Full Version : OpenGl :- Problem in Mapping Cartesian Cordinates

sandy123
11-01-2009, 10:08 PM
hi... how are you

i am very new to openGL i am studing some very basic concepts of openGL and Glut Related function

i tried to map a rectangle onto window position through reference of bible book...

but i did't get "" How openGL maps Cartesian cordinates to window position"" and how to know where it will place the drawn rectangle by cartesian cordinates into window(i mean i am confused about position of rectange in window also...)

thx

sandeep

marshats
11-02-2009, 07:26 PM
By default openGL maps the coordinates you draw into the window as follows

(-1,1)*--------------*(1,1)
| |
| *(0,0) |
| |
(-1,-1)*--------------*(1,-1)

Notice openGL scales everything so you do NOT think in terms of pixel coordinates. You can see this with the following minimal code that draws a rectangle just ever so slightly smaller than (+-1,+-1) -- otherwise you wouldn't see the rectangle right on the windows edge.

//your header paths may be different depending on your OS
#include <GL/glut.h>
#include <stdlib.h> //for exit()

void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
}

void display() {
glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0,1.0,1.0);
GLfloat S = 0.95;
glBegin(GL_LINE_STRIP); {
glVertex2f(-S, -S);
glVertex2f( S, -S);
glVertex2f( S, S);
glVertex2f(-S, S);
glVertex2f(-S, -S);
}
glEnd();

glutSwapBuffers();
}

void timer(int value)
{
glutTimerFunc(33,timer,33); // come back here in 33mSeconds
glutPostRedisplay(); // ask for display callback call ASAP
}

void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27: // escape key
exit(0);
break;
default:
break;
}
}

int main(int argc, char** argv) {
glutInit(&amp;argc, argv);
glutInitDisplayMode(GLUT_DOUBLE);
glutCreateWindow("HelloGLUT");

glutTimerFunc(0,timer,0);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);

init();

glutMainLoop();
return 0;
}

Try compiling, running, and resizing the window and watch what happens -- the rectangle scales with the window automatically! No need for you to think in pixel dimensions, just the default +-1 coordinate system.

But having a coordinate system limited to +-1 is inconvenient so openGL gives you a convenience function ( gluOrtho2d (http://www.emi.u-bordeaux.fr/imm/glu/ortho2d.html)) to redefine the default behavior. There are other convenience functions but this serves the purpose of explaining the answer to your question. Suppose you want a coordinate system that goes from -10 to 10 instead ... you would simply change the GL_PROJECTION matrix with a gluOrtho2d call. Specifically, adding three lines to the beginning of init as follows

void init() {
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-10.,10.,-10.,10.); // added to change Cartesian cooridinate map to screen

glClearColor(0.0, 0.0, 0.0, 0.0);
}

accomplishes the following mapping of Cartesian coordinates to the window as

(-10,10)*--------------*(10,10)
| |
| *(0,0) |
| |
(-10,-10)*--------------*(10,-10)

A good resource to understand this all in more detail is OpenGL Redbook (http://www.glprogramming.com/red/chapter03.html)