Mega Code Archive

 
Categories / Delphi / Graphic
 

OpenGL II moving and rotating 2D shapes

Title: OpenGL II: moving and rotating 2D shapes Question: on this article I'll show you some basic movement and rotating, I also try to explain how openGL works Answer: After showing you how to setup an openGL window and draw a simple quad (OpenGL I: Hello World) plus doing all the message handling and correctly shutting down your openGL application on this article we will add some movement and rotating to our shapes This article is based on the first article, so if you didn't read it you may do so now, so it makes more sense after reading this article you should be able to move shapes around the screen and rotate them in all the different axis, what can you do with that? well, some basic 2D games... of course moving a quad on the screen is not so exciting, but at least we're moving now =o) later we will see how to add textures to our shapes so they look way better Drawing in openGL is relatively easy, because when you draw, say a quad and you want to rotate it, you don't have to do any calculations, openGL works using a turtle graphics kinda of thing, where the pen that is drawing just follows instructions like "go forward", "turn left 90 degrees", etc... and so, as I say the advantage on this is that that many paths are more simply described in relative than in absolute terms. For example, it's easy to indicate the absolute coordinates of the corners of a square with vertical and horizontal sides, but it's not so easy to find the corners of an inclined square. A good way to describe this is if you hold a map (is the screen) and then walk following the directions, then you find a square that is facing you, you see it with vertical and horizontal sides to you (then pen), but when you first saw the map that same square was inclined, make sense? those instructions in OpenGL look like this: glTranslatef(-1.5,0.0,PosZ); //move to position 3.0, 0.0, PosZ (coming and going to/from view) glRotatef(Angle,0.0,0.0,1.0); // Rotate The quad On The Z axis glBegin(GL_QUADS); // Draw A Quad glVertex3f(-1.0, 1.0, 0.0); // Top Left glVertex3f( 1.0, 1.0, 0.0); // Top Right glVertex3f( 1.0,-1.0, 0.0); // Bottom Right glVertex3f(-1.0,-1.0, 0.0); // Bottom Left glEnd(); // end of the Quad the glTranslatef is the "go -1.5 in the X axis", "go O in the Y" and "go PosZ in the Z axis", as you can see there's only one variable, and that's the one that is going to allow my shape to move (only in the Z axis for now, which is going into the screen depth or coming out) then the glRotatef is "rotate Angle degrees in the Z axis", if I had put 1.0 in the second parameter is would rotate in the X axis, the third parameter in the Y axis and the last parameter in the Z axis then I tell openGL, glBegin(GL_QUAD): "I'm going to draw a square", and then you specify the four points of the Quad, because you already told openGL that you're going to draw a square is expecting four points if you give it five or six points it will discard them, it will only take four by four (which make a quad) If I put 8 points it will create 2 quads, and so on the same applies if you tell openGL that you are going to draw triangles, you have to give 3 by 3 points ok, with no more here's the main code of our article: Since we are going to do some movement, we now need some variables Var Angle:glfloat; //angle of the shapes PosZ:glfloat; //Position in the Z axis DForward:Boolean; //going forward? or backwards if false that's all we need, now we initialize our variables on the InitGL part of our program: Angle:=0; PosZ :=-20.0; DForward:=True; and that's all we need, we can draw now: function DrawGLScene(): Bool; { All Rendering Done Here } begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Clear Screen and Depth Buffer glLoadIdentity(); //Reset The View (move to 0, 0, 0) glColor3f(0.0,0.0,1.0); //set the color (1.0=totally blue) glTranslatef(-1.5,0.0,-15.0); //Draw triangle always at same position glRotatef(Angle,0.0,1.0,0.0); // Rotate The Triangle On The Y axis ( NEW ) glBegin(GL_TRIANGLES); // Drawing Using Triangles glVertex3f( 0.0, 1.0, 0.0); // Top glVertex3f(-1.0,-1.0, 0.0); // Bottom Left glVertex3f( 1.0,-1.0, 0.0); // Bottom Right glEnd(); // end of the triangle glLoadIdentity(); //move to position 0, 0, 0 glColor3f(0.5,0.0,0.5); //set the color (0.5 red and 0.5 blue) glTranslatef(-1.5,0.0,PosZ); //move to position 3.0, 0.0, PosZ (coming and going to/from view) glRotatef(Angle,0.0,0.0,1.0); // Rotate The quad On The Z axis glBegin(GL_QUADS); // Draw A Quad glVertex3f(-1.0, 1.0, 0.0); // Top Left glVertex3f( 1.0, 1.0, 0.0); // Top Right glVertex3f( 1.0,-1.0, 0.0); // Bottom Right glVertex3f(-1.0,-1.0, 0.0); // Bottom Left glEnd(); // end of the Quad If (DForward) Then //control the position of the quad, it just goes forward or backward Begin PosZ:=PosZ+0.05; //go Forward If (PosZ-10.5) Then //have I gone too far? go backwards now (towards screen depth) DForward:=False End Else Begin //go backward PosZ:=PosZ-0.05; If (PosZ-20.0) Then //have I gone too far into depth? go forward (towards user) DForward:=True End; Angle:=Angle+0.4; //change the angle DrawGLScene := True end; simple right? once you understand how the drawing is done "internally" it's easier to figure out what we can do with openGL that's all for this article, let me know what you think about these openGL articles I try to make them as easy to understand as posible, because I know that is not that easy at the begining but let me know if you are interested in more advanced openGL articles and I will try to post some more topics soon you can download the code for the article here: salu2 EberSys