//コンパイル: gcc *.c -lglut -lGLU -lGL -lm
//-----------------------------------------------------------
#include
#include
/*立方体の座標*/
GLdouble vertex[][3] = {
{ 0.5, 0.5, 0.5 },
{ 1.0, 0.5, 0.5 },
{ 1.0, 1.0, 0.5 },
{ 0.5, 1.0, 0.5 },
{ 0.5, 0.5, 1.0 },
{ 1.0, 0.5, 1.0 },
{ 1.0, 1.0, 1.0 },
{ 0.5, 1.0, 1.0 }
};
/*頂点のグループ(辺)*/
int face[][4] = {
{ 0, 1, 2, 3 },
{ 1, 5, 6, 2 },
{ 5, 4, 7, 6 },
{ 4, 0, 3, 7 },
{ 4, 5, 1, 0 },
{ 3, 2, 6, 7 }
};
GLdouble normal[][3] = {
{ 0.0, 0.0,-1.0 },
{ 1.0, 0.0, 0.0 },
{ 0.0, 0.0, 1.0 },
{-1.0, 0.0, 0.0 },
{ 0.0,-1.0, 0.0 },
{ 0.0, 1.0, 0.0 }
};
GLfloat light0pos[] = { 0.0, 3.0, 5.0, 1.0 };
GLfloat light1pos[] = { 5.0, 3.0, 0.0, 1.0 };
GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 };
GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 };
GLfloat blue[] = { 0.2, 0.2, 0.8, 1.0 };
void cube(void)
{
int i;
int j;
glBegin(GL_QUADS);
for (j = 0; j < 6; ++j) {
glNormal3dv(normal[j]);
for (i = 0; i < 4; ++i) {
glVertex3dv(vertex[face[j][i]]);
}
}
glEnd();
}
void idle(void)
{
glutPostRedisplay();
}
void display(void)
{
int i,j;
static int r = 0; /* 回転角 */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/* 光源の位置設定 */
glLightfv(GL_LIGHT0, GL_POSITION, light0pos);
glLightfv(GL_LIGHT1, GL_POSITION, light1pos);
/* モデルビュー変換行列の保存 */
glPushMatrix();
/* 図形の回転 */
glRotated((double)r, 0.0, 1.0, 0.0);
/* 図形の色 (赤) */
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red); //図形の材質パラメータを設定
/* 図形の描画 */
cube();
/* 二つ目の図形の描画 */
glPushMatrix();
glTranslated(1.0, 0.0, 0.0);
// glRotated((double)(2 * r), 0.0, 1.0, 0.0);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, blue);
cube();
glPopMatrix();
/* モデルビュー変換行列の復帰 */
glPopMatrix();
glutSwapBuffers(); //ダブルバッファリング
/* 一周回ったら回転角を 0 に戻す */
if (++r >= 360) r = 0;
}
void resize(int w, int h)
{
glViewport(0, 0, w, h);
/* 透視変換行列の設定 */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
/* モデルビュー変換行列の設定 */
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
void mouse(int button, int state, int x, int y)
{
switch (button) {
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN) {
/* アニメーション開始 */
glutIdleFunc(idle);
}
else {
/* アニメーション停止 */
glutIdleFunc(0);
}
break;
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN) {
/* コマ送り (1ステップだけ進める) */
glutPostRedisplay();
}
break;
default:
break;
}
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'q':
case 'Q':
case '\033': /* '\033' は ESC の ASCII コード */
exit(0);
default:
break;
}
}
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glEnable(GL_DEPTH_TEST); //デプスバッフ
//カリング
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
//陰影付け
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glLightfv(GL_LIGHT1, GL_DIFFUSE, green); //光源のパラメータを設定
glLightfv(GL_LIGHT1, GL_SPECULAR, green);
}
int main(int argc, char *argv[])
{
glutInitWindowSize(720, 480);
glutInit(&argc, argv);//環境を初期化
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);//ディスプレイの表示モード
glutCreateWindow(argv[0]);//ウィンドを開く
glutDisplayFunc(display);//ウィンド内に描写する
glutReshapeFunc(resize); //ウィンドがリサイズされたときの実行関数のポインタ
glutMouseFunc(mouse);//マウスでのイベント
glutKeyboardFunc(keyboard);//キーボードでのイベント
init();
glutMainLoop();//イベント待ち無限ループ
return 0;
}