Skip to main content
gamedev.net
🔒 Locked

moving camera?

Started by En3my 6 replies 400+ views
Original Post
En3my
En3my
i am new to 3d programming and opengl, and i am still playing around trying to get the basics. some months ago i did a clone of the old classic sokoban using directx. since the logic and gameplay is very simple i thought it would be a good exercise trying to convert it to 3d. however i there is something fundamental i don't understand about camera movement. i hope someone reading this can help me out. what i did was to simply convert my 2d tile rendering code to 3d rendering. what i do is loop through an array containing the level data, and render to the screen. basically all i do is render a lot of textured cubes to the screen. since i don't understand camera movement i render using X Y coordinates creating the illusion of a top down perspective, but i will switch to X Z rendering as soon as i get the right camera perspective working. i would like to be able to look at the map from an isometric angle or something, but i can't get the gluLookAt function to work, since i am doing something wrong in my map rendering. i am still in a learning phase, started out 3d programming only last week. thanks in advance! if necessary i will post more info...
      
// Part of rendering code

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

for (int z=0; z < MAPSIZE_Z; z++)
   for (int x=0; x < MAPSIZE_X; x++)
      {
	glLoadIdentity();

        // zdepth is just a temp float used for zooming

	glTranslatef (x*2.0f, z*2.0f, zdepth);
        // i have to rotate since i switched from X Z

        // to X Y rendering. this makes the cubes face the

        // camera the right way  

	glRotatef (90.0f, 1.0f, 0.0f, 0.0f);
        
        switch (map[x][z])
	{
	case EMPTY:
	   break;
	case WALL:
	   glBindTexture (GL_TEXTURE_2D, texture[0]);
	   glCallList(box);
	   break;
	case FLOOR:
	   glBindTexture (GL_TEXTURE_2D, texture[1]);
	   glBegin(GL_QUADS);
           // code for drawing textured quad

           glEnd();
	   break;
	case BOX:
	   glBindTexture (GL_TEXTURE_2D, texture[3]);
	   glCallList(box);
	   break;
	default:
	   break;
	} // end switch

} // end for


// Some game logic goes here				

				
glFlush();
SwapBuffers(g_HDC);
// End of rendering code

      
Edited by - en3my on September 1, 2001 4:40:22 PM Edited by - en3my on September 1, 2001 4:41:55 PM
Sneftel
Sneftel
Matrix multiplication is not commutative... where you call gluLookAt in relation to glTranslate, glRotate, etc. matters. Make sure you have the order right.
En3my
En3my
I tried calling gluLookAt() after my first call to glLoadIdentity() (before entering the for loop)... But it didn''t work...
ECKILLER
ECKILLER
Is your current matrix set to the model/view matrix ?

ECKILLER
ECKILLER
En3my
En3my
i did some experiments and placed the gluLookAt call inside the for loops, and it works... i still don''t understand why, so please explain if you know what is going on...

  
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

for (int z=0; z < MAPSIZE_Z; z++)
for (int x=0; x < MAPSIZE_X; x++)
{
glLoadIdentity();
gluLookAt(0.0f, 0.0f ,15.0f,
0.0f, 60.0f, -100.0f,
0.0f, 1.0f, 0.0f);
Sneftel
Sneftel
glLoadIdentity resets the transformation matrix. So if you called it after gluLookAt, gluLookAt''s effect would be nullified.
En3my
En3my
thanks guys! now i have a better understanding on how things work!

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.