Basic Movement in OpenGL

Started by
2 comments, last by ilnar 12 years, 6 months ago
I just started with openGL and I'm just trying to get a Rectangle to move back and forth without going off the edge of the screen whenever the 'a' & 'd' keys are pressed. I know that I need a Switch Statement but I don't know how to get the movement to happen.

If anyone could help me learn this, that would be appreciated.
Advertisement
I don't know the rules on "Bumping" in this forum, But I realy could use some help. I have been surfing the web for info about this, but all I have found for OpenGL is 3d this, 3d that, nothing about just moving something back and forth.
It depend greatly on your implementation on how you use OpenGL and what you actually want to know.
Do you want to know how to catch inputs? In this case, do you use Win32 with a message loop, SDL with events, maybe glut?
Once you know which key is pressed, you just have to change the position of either 1. actual rectangle vertex positions (change the geometry), 2. world matrix of the object (move the object) or 3. view matrix position (move the camera). Of course, OpenGL IS a 3D api, so everything about movements will always be in 3D, even if you use a "2d" ortho projection­.

And if you don't know what is the world/view/projection matrices, you better start with learning about that. It's the basic about how to position and move objects in a 3D world.
#include <iostream>
#include <stdlib.h>
#include <GL/gl.h>
#include <GL/glut.h>

using namespace std;




int k=0,d=0;
float camx=0.0,camy=0.0,camz=-10.0;
float camrotx=0.0,camroty=0.0,camrotz=0.0;
float camrotdeg = 0.0;
void RenderScene(void)
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(camx,camy,camz); //this guy translates the object into any place you like.

//here you could just say glTranslatef(10,2,7); or anything you like.
//however if you need to controll the translation by keys, you need to set float variables here. and controll
//numbers inside variable's . switch statement below does that. if a keyboard key a or s or w was clicked, switch statement
//grabs for example camx and adds 0.1 to it. if before clicking it was 2.0 , ufter clickeng 'a' it will be 2.1. translatef
// will get new coordinate and translate object onto it.



glRotatef(camrotdeg,camrotx,camroty,camrotz);
glPushMatrix();
glBegin(GL_QUADS); //your rectangle drawing starts here
glVertex3f( -0.5, 0.5,0.0);
glColor3f(1.0, 0.0, 255.0);
glVertex3f( 0.5, 0.5,0.0);
glColor3f(0.0, 255.0, 0.0);
glVertex3f( 0.5, -0.5,0.0);
glColor3f(120.0, 15.0, 0.0);
glVertex3f( -0.5, -0.5,0.0);


glColor3f(1.0f, 0.0f, 1.0f);
glVertex3f( 0.5f, -0.5f,0.0f);
glVertex3f( 0.5f, 0.5f,0.0f);
glVertex3f( 0.5f, 0.5f,0.5f);
glVertex3f( 0.5f, -0.5f,0.5f);

glEnd();


glPopMatrix();
glFlush();
}



void SetupRC(void)
{
glClearColor(0.0f, 0.0f, 0.5f, 1.0f);
glEnable(GL_COLOR_MATERIAL);
}

void camcontroll(unsigned char key, int x,int y) //camcontroll grabs keys that are pressed, then switch statement
//checks different cases.

{
switch (key) {

case'a': //in case if key 'a' was clicked, add 0.1 to camx.see glTranslatef above.
camx += 0.1;
glutPostRedisplay(); //without this, translation will happen but you wont see it on screen. it refreshes the screen
break; //its simple switch statement's guy. ufter every "case" ends, add "break".

case'd':
camx -= 0.1;
glutPostRedisplay();
break;
case'w':
camy -=0.1;
glutPostRedisplay();
break;
case's':
camy +=0.1;
glutPostRedisplay();
break;
case'q':
camz+=0.1;
glutPostRedisplay();
break;
case'e':
camz-=0.1;
glutPostRedisplay();
break;
case'f':
camroty=1.0;
camrotdeg-=1.1;
glutPostRedisplay();
break;
case'h':

camroty=1.0;
camrotdeg+=1.1;
glutPostRedisplay();
break;


default :
break;
}
}


int main(int argc, char* argv[]) //program starts here
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("GLRect");
glutDisplayFunc(RenderScene);
SetupRC();
glutKeyboardFunc(camcontroll); //keyboard input starts working here, see function camcontroll.
glutMainLoop();

return 0;
}

This topic is closed to new replies.

Advertisement