画一个立方体
#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;
}