PDA

winner
04-12-2002, 06:20 PM
Who can help me in this code to make my cube make movement in any direction (by the four arrow keys )and bounce off the viewport edges.
I tell you the truth I spent tow days but I failed !!!!

Winner

my cube code
/*

my cube
*/
#include <stdlib.h>
#include <GL/glut.h>

/*
define vertices {x,y,z} and colors {r,g,b}

*/
GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},
{1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0},
{1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}};

GLfloat normals[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},
{1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0},
{1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}};

GLfloat colors[][3] = {{0.0,0.0,0.0},{1.0,0.0,0.0},
{1.0,1.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0},
{1.0,0.0,1.0},{1.0,1.0,1.0},{0.0,1.0,1.0}};

/*

draw polygon

*/
void polygon (int a, int b, int c, int d)
{
/* draw a polygon via list of vertices */
glBegin(GL_POLYGON);
glColor3fv(colors[a]);
glNormal3fv(normals[a]);
glVertex3fv(vertices[a]);

glColor3fv(colors[B]);
glNormal3fv(normals[B]);
glVertex3fv(vertices[B]);

glColor3fv(colors[c]);
glNormal3fv(normals[c]);
glVertex3fv(vertices[c]);

glColor3fv(colors[d]);
glNormal3fv(normals[d]);
glVertex3fv(vertices[d]);
glEnd();

}

/*
draw cube

*/
void colorcube(void)
{
/* draw 6 faces of cube */
polygon(0,3,2,1);
polygon(2,3,7,6);
polygon(0,4,7,3);
polygon(1,2,6,5);
polygon(4,5,6,7);
polygon(0,1,5,4);
}

static GLfloat theta[] = {0.0,0.0,0.0};
static GLint axis = 0;

/*
rotate angle (theta) and display cube
*/
void display (void)
{
/* display callback*/
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glRotatef(theta[0],1.0,0.0,0.0);
glRotatef(theta[1],0.0,1.0,0.0);
glRotatef(theta[2],0.0,0.0,1.0);

/* draw cube */
colorcube();

glFlush();
glutSwapBuffers();

}

/*
increment angle (theta)
*/
void SpinCube()
{
theta[axis] +=2.0;
if (theta[axis] > 360.0) theta[axis] -=360.0;
display();
}

/*
use mouse to choose axis of rotation
*/
void mouse (int btn, int state, int x, int y)
{
if(btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)axis=0;
if(btn == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)axis=1;
if(btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)axis=2;
}

/*
define orthographic projection
*/
void myReshape (int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
if (w <= h)
glOrtho(-2.0,2.0,-2.0 * (GLfloat) h / (GLfloat) w,
2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0);
else
glOrtho(-2.0 * (GLfloat) h / (GLfloat) w,
2.0 * (GLfloat) h / (GLfloat) w, -2.0, 2.0, -10.0, 10.0);

glMatrixMode(GL_MODELVIEW);
}

/*
main program loop
*/
void main (int argc, char** argv)
{
glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("Use Left-Right-Middel buttons to rotate");

glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glutIdleFunc(SpinCube);
glutMouseFunc(mouse);
glEnable(GL_DEPTH_TEST);

glutMainLoop();

}