Visit our Sponsor   Visit our Sponsor
delphi3000.com - the free delphi knowledge platform
delphi3000.com - the free delphi knowledge platform
Have a look at your member-status

connecting people's knowledge


  - Recent ArticlesRSS feed for Recent Articles on delphi3000.com
  - List of All Articles
  - Top Viewed Articles
  - Articles (+Attachem.)
  - Articles Of Interest
  - Categories
  - Top Uploader
  - Search
  - Index

  - My Home
  - Submit an Article
  - My Articles
  - My Personal Data
  - My Bookmarks
  - Activities
  - Login/Logout

  - Sign Up
  - Why Sign Up
  - Newsletter

  - Press
  - Advertise

  - Contact
  - Feedback





Community
Borland
ClubeDelphi
Dr. Bob
UK-BUG
Delphi Meetings
Planeta Delphi







Startblatt.de






Share this article with friendsShare this article with friends
Rate this articleRate this article - to keep the quality of delphi3000.com !
Comment this article or read through previous comments (0)


OpenGL II: moving and rotating 2D shapesComponent available for this articleFormat this article printer-friendly!Bookmark function is only available for registered users!
and get some concept of how openGL works
Product:
Delphi all versions
Category:
Games
Skill Level:
Scoring:
Last Update:
03/20/2003
Search Keys:
delphi delphi3000 article borland vcl code-snippet opengl moving rotating move rotate shape shapes
Times Scored:
16
Visits:
12670
Uploader: Eber Irigoyen
Company: BTXSys
Reference: N/A
Component Download: http://e.irigoyen.home.attbi.com/opengl2.zip
 
Question/Problem/Abstract:
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





Please rate this article!
Skill level:
BeginnerExpert

Useful:
No!Very!

Overall rating:
PoorExcellent



Comments to this article
Write a new comment













 
Sign up to consume product discounts for Bronze memberships !

read more


  Visit our Sponsor

 

  Community Ad of
I. Siticov
 
   














 







     
  Copyright © 2000 - 2007 delphi3000.com - All rights reserved. Terms of use. || Privacy
delphi3000.com is a service by bluestep.com IT-Services GmbH (Vienna)