/* * 立方体 */ #include GLuint cube0; /* 立方体 */ void cube(void) { int i, j; /* 座標を8個用意 */ GLdouble vertex[][3] = { { -0.5, 0.5, 0.5 }, { -0.5, -0.5, 0.5 }, { 0.5, -0.5, 0.5 }, { 0.5, 0.5, 0.5 }, { -0.5, 0.5, -0.5 }, { -0.5, -0.5, -0.5 }, { 0.5, -0.5, -0.5 }, { 0.5, 0.5, -0.5 }, }; /* 座標をつないで面を作るデータを6個用意 */ int face[][4] = { { 0, 1, 2, 3 }, { 4, 0, 3, 7 }, { 7, 3, 2, 6 }, { 6, 2, 1, 5 }, { 5, 1, 0, 4 }, { 7, 6, 5, 4 } }; /* 面ごとの法線データ */ GLdouble normal[][3] = { { 0.0, 0.0, 1.0 }, { 0.0, 1.0, 0.0 }, { 1.0, 0.0, 0.0 }, { 0.0, -1.0, 0.0 }, { -1.0, 0.0, 0.0 }, { 0.0, 0.0, -1.0 } }; /* 面ごとの色データ */ GLfloat color[][4] = { { 0.0, 0.0, 1.0, 1.0 }, { 0.0, 1.0, 0.0, 1.0 }, { 1.0, 0.0, 0.0, 1.0 }, { 1.0, 1.0, 0.0, 1.0 }, { 1.0, 0.5, 0.0, 1.0 }, { 0.0, 1.0, 1.0, 1.0 } }; glBegin(GL_QUADS); for (j = 0; j < 6; j++) { glMaterialfv(GL_FRONT, GL_DIFFUSE, color[j]); glNormal3dv(normal[j]); for (i = 0; i < 4; i++) { glVertex3dv(vertex[face[j][i]]); } } glEnd(); } /* 初期化 */ void init(void) { GLfloat lightAmb[] = {0.0, 0.0, 0.0, 1.0}; GLfloat lightPos[] = {0.0, 0.0, -1.0, 1.0}; GLfloat lightDif[] = {1.0, 1.0, 1.0, 1.0}; /* 背景色の指定 RGBA */ glClearColor(1.0, 1.0, 1.0, 0.0); /* デプスバッファの有効化 */ glEnable(GL_DEPTH_TEST); /* カリングの有効化 */ glEnable(GL_CULL_FACE); /* Culling GL_BACK or GL_FRONT */ glCullFace(GL_BACK); /* 光源の設定 */ glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmb); glLightfv(GL_LIGHT0, GL_POSITION, lightPos); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDif); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } void resize(int w, int h) { /* ビューポートの設定 */ glViewport(0, 0, w, h); /* 射影変換モードに */ glMatrixMode(GL_PROJECTION); /* 変換行列を単位行列に */ glLoadIdentity(); /* 透視射影の視野台形 左、右、下、上、手前、奥 */ glFrustum(-1.33, 1.33, -1.0, 1.0, 1.0, 5.0); /* モデル変換モードに戻す */ glMatrixMode(GL_MODELVIEW); } /* 画面表示 */ void display(void) { int i, t; /* 背景色でクリア */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslated(0.0, 0.0, -3.0); for(t = 0; t <= 2; t++){ for(i= 0; i <= 2; i++){ glPushMatrix(); glTranslated(-1.5 + 1.5 * i, -1.5 + 1.5 * t, 0.0); glCallList(cube0); glPopMatrix(); } } glFlush(); } int main(int argc, char *argv[]) { /* GLUT の初期設定 */ glutInit(&argc, argv); glutInitWindowPosition(100, 50); glutInitWindowSize(400, 300); glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH); glutCreateWindow(argv[0]); /* 各関数の指定 */ glutDisplayFunc(display); glutReshapeFunc(resize); /* 初期設定 */ init(); /* ディスプレイリストの作成 */ cube0 = glGenLists(1); glNewList(cube0, GL_COMPILE); cube(); glEndList(); /* メインループ */ glutMainLoop(); glDeleteLists(cube0, 1); return 0; }