画一个立方体

#include <windows.h>
#include <GL/GL.h>
#include <glut.h>
#include <GL/GLU.h>
#include <stdio.h>

#pragma  comment(lib, "glu32.lib")
#pragma  comment(lib, "opengl32.lib")


struct GLRGB
{
GLfloat r,g,b;
};

void init() {
glClearColor(1.0f, 0.0f, 1.0f, 1.0f);
glEnable(GL_DEPTH_TEST);
}

static float x_degs = 0.0f;
static float y_degs = 0.0f;

void keyboard(unsigned char key, int x, int y) {

switch (key) {

case 'q':

exit(EXIT_SUCCESS);

case 'h':
y_degs -= 1.0f;
break;

case 'j':
x_degs -= 1.0f;
break;

case 'k':
x_degs += 1.0f;
break;

case 'l':
y_degs += 1.0f;
break;

}
glutPostRedisplay();

glutSwapBuffers();
}

static const float card_half_size = 1.0f;
static const float space_half_size = 0.1f;

// number of cards per face
static const int NUM_CARDS_PER_FACE = 4;

void draw_card() {

glBegin(GL_QUADS);
glVertex3f(- card_half_size, - card_half_size, 0.0f);
glVertex3f(- card_half_size, card_half_size, 0.0f);
glVertex3f(card_half_size, card_half_size, 0.0f);
glVertex3f(card_half_size, - card_half_size, 0.0f);
glEnd();
}

// draw a cube face made up of cards

void draw_card_face(GLRGB rgbcolor) {

const float cube_half_size = 4 * (card_half_size + space_half_size);
const float start = - 3 * (card_half_size + space_half_size);
const float incr = 2 * (card_half_size + space_half_size);

glColor3f(0.0f, 0.0f, 0.0f);

glBegin(GL_QUADS);
glVertex3f(- cube_half_size, - cube_half_size, -0.001f);
glVertex3f(- cube_half_size, cube_half_size, -0.001f);
glVertex3f(cube_half_size, cube_half_size, -0.001f);
glVertex3f(cube_half_size, - cube_half_size, -0.001f);
glEnd();

glColor3f(rgbcolor.r, rgbcolor.g , rgbcolor.b);

for (int i = 0; i < NUM_CARDS_PER_FACE; i++)

for (int j = 0; j < NUM_CARDS_PER_FACE; j++) {

glPushMatrix();
glTranslatef(start + i * incr, start + j * incr, 0.0f);
draw_card();
glPopMatrix();

}

}

// draw a cube made up of cards

void draw_card_cube() {

const float cube_half_size = 4 * (card_half_size + space_half_size);

// front face
GLRGB rgbcolor = {1.0f, 0.5f, 0.5f };
glPushMatrix();
glTranslatef(0.0f, 0.0f, cube_half_size);
draw_card_face(rgbcolor);
glPopMatrix();

// back face

glPushMatrix();
rgbcolor.r = 0.5f;
rgbcolor.g = 0.0f;
glTranslatef(0.0f, 0.0f, - cube_half_size);
glRotatef(180.0f, 0.0f, 1.0f, 0.0f);
draw_card_face(rgbcolor);
glPopMatrix();

// right face

glPushMatrix();
rgbcolor.r = 0.25f;
rgbcolor.g = 1.0f;
glTranslatef(cube_half_size, 0.0f, 0.0f);
glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
draw_card_face(rgbcolor);
glPopMatrix();

// left face

glPushMatrix();
rgbcolor.r = 0.75f;
rgbcolor.g = 0.75f;
rgbcolor.b = 0.75f;
glTranslatef(- cube_half_size, 0.0f, 0.0f);
glRotatef(- 90.0f, 0.0f, 1.0f, 0.0f);
draw_card_face(rgbcolor);
glPopMatrix();

// top face

glPushMatrix();
rgbcolor.g = 1.0f;
rgbcolor.b = 1.0f;
glTranslatef(0.0f, cube_half_size, 0.0f);
glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
draw_card_face(rgbcolor);
glPopMatrix();

// bottom face

glPushMatrix();
rgbcolor.g = 0.25f;
rgbcolor.b = 0.0f;
glTranslatef(0.0f, - cube_half_size, 0.0f);
glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
draw_card_face(rgbcolor);
glPopMatrix();
}

void RenderScene(void) {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glRotatef(x_degs, 1.0f, 0.0f, 0.0f);
glRotatef(y_degs, 0.0f, 1.0f, 0.0f);

gluLookAt(-0.6f, 0.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
draw_card_cube();
glutSwapBuffers();

}

void reshape(int w, int h) {

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-15.0f, 15.0f, -15.0f, 15.0f, -15.0f, 15.0f);
glViewport(0, 0, w, h);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

}

int main(int argc, char *argv[]) {

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow(argv[0]);
init();
glutKeyboardFunc(keyboard);
glutDisplayFunc(RenderScene);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
posted @ 2011-11-12 19:49  Thomas Hwang  阅读(260)  评论(0编辑  收藏  举报