[[CG]]

 #include <GL/glut.h>
 
 static int	 turn = 1;
 static float   theta = 0.0;
 
 //
 //  ピラミッドを描画 
 //
 void  renderPyramid1()
 {
 	glBegin( GL_TRIANGLES );
 		// +Z方向の面
 		glNormal3f( 0.0, 0.53, 0.85 );
 		glVertex3f( 0.0, 1.0, 0.0 );
 		glVertex3f(-1.0,-0.8, 1.0 );
 		glVertex3f( 1.0,-0.8, 1.0 );
 
 		// -Z方向の面
 		glNormal3f( 0.0, 0.53,-0.85 );
 		glVertex3f( 0.0, 1.0, 0.0 );
 		glVertex3f( 1.0,-0.8,-1.0 );
 		glVertex3f(-1.0,-0.8,-1.0 );
 
 		// +X方向の面
 		glNormal3f( 0.85, 0.53, 0.0 );
 		glVertex3f( 0.0, 1.0, 0.0 );
 		glVertex3f( 1.0,-0.8, 1.0 );
 		glVertex3f( 1.0,-0.8,-1.0 );
 
 		// -X方向の面
 		glNormal3f(-0.85, 0.53, 0.0 );
 		glVertex3f( 0.0, 1.0, 0.0 );
 		glVertex3f(-1.0,-0.8,-1.0 );
 		glVertex3f(-1.0,-0.8, 1.0 );
 
 		// 底面1
 		glNormal3f( 0.0,-1.0, 0.0 );
 		glVertex3f( 1.0,-0.8, 1.0 );
 		glVertex3f(-1.0,-0.8, 1.0 );
 		glVertex3f( 1.0,-0.8,-1.0 );
 
 		// 底面1
 		glNormal3f( 0.0,-1.0, 0.0 );
 		glVertex3f(-1.0,-0.8,-1.0 );
 		glVertex3f( 1.0,-0.8,-1.0 );
 		glVertex3f(-1.0,-0.8, 1.0 );
 	glEnd();
 
 }
 
 
 //
 //  ウィンドウ再描画時に呼ばれるコールバック関数
 //
 void  display( void )
 {
 	// 画面をクリア(ピクセルデータとZバッファの両方をクリア)
 	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 	
 	// 変換行列を設定(モデル座標系→カメラ座標系)
 	//(カメラが (0.0, 1.0, 5.0) の位置にあるとする)
 	glMatrixMode( GL_MODELVIEW );
 	glLoadIdentity();
 	glTranslatef( 0.0, -2.0, -12.0 );
 
 	// 地面を描画
 	glBegin( GL_POLYGON );
 		glColor3f( 0.5, 0.8, 0.5 );
 		glNormal3f( 0.0, 1.0, 0.0 );
 		glVertex3f( 5.0, 0.0, 5.0 );
 		glVertex3f( 5.0, 0.0,-5.0 );
 		glVertex3f(-5.0, 0.0,-5.0 );
 		glVertex3f(-5.0, 0.0, 5.0 );
 	glEnd();
 
 	// 下のピラミッドを描画
 	glPushMatrix();
 		glTranslatef( 0.0, 1.0, 0.0 );
 		glRotatef( theta, 0.0f, 1.0f, 0.0f );
 		glColor3f( 1.0, 0.0, 0.0 );
 		renderPyramid1();
 	glPopMatrix();
 
 	// 上の箱を描画
 	glPushMatrix();
 		glTranslatef( 0.0, 4.0, 0.0 );
 		glRotatef( -theta, 0.0f, 1.0f, 0.0f );
 		glScalef(2.0, 3.0, 1.0);
 		glColor3f( 0.0, 0.0, 1.0 );
 		glutSolidCube(1.0);
 	glPopMatrix();
 
 	// 公転する球を描画
 	glPushMatrix();
 		glRotatef( theta/2, 0.0f, 1.0f, 0.0f );
 		glTranslatef( 3.0, 2.0, 0.0 );
 		glScalef(0.5, 0.5, 0.5);
 		glColor3f( 1.0, 1.0, 1.0 );
 		glutSolidSphere(1.0, 20, 20);
 	glPopMatrix();
 
 
 	// バックバッファに描画した画面をフロントバッファに表示
 	glutSwapBuffers();
 }
 
 
 //
 //  ウィンドウサイズ変更時に呼ばれるコールバック関数
 //
 void  reshape( int w, int h )
 {
 	// ウィンドウ内の描画を行う範囲を設定(ここではウィンドウ全体に描画)
 	glViewport(0, 0, w, h);
 	
 	// カメラ座標系→スクリーン座標系への変換行列を設定
 	glMatrixMode( GL_PROJECTION );
 	glLoadIdentity();
 	gluPerspective( 45, (double)w/h, 1, 500 );
 }
 
 
 //
 // マウスクリック時に呼ばれるコールバック関数
 //
 void  mouse( int button, int state, int mx, int my )
 {
 	// 右ボタンがクリックされたら回転方向を正にする
 	if ( ( button == GLUT_LEFT_BUTTON ) && ( state == GLUT_DOWN ) )
 		turn = 1.0;
 	// 左ボタンがクリックされたら回転方向を負にする
 	else if ( ( button == GLUT_RIGHT_BUTTON ) && ( state == GLUT_DOWN ) )
 		turn = -1.0;
 }
 
 
 //
 //  アイドル時に呼ばれるコールバック関数
 //
 void  idle( void )
 {
 	// 物体を回転
 	theta += 0.3 * turn;
 
 	// 再描画の指示を出す(この後で再描画のコールバック関数が呼ばれる)
 	glutPostRedisplay();
 }
 
 
 //
 //  環境初期化関数
 //
 void  initEnvironment( void )
 {
 	// 光源を作成する
 	float  light0_position[] = { 10.0, 10.0, 10.0, 1.0 };
 	float  light0_diffuse[] = { 0.8, 0.8, 0.8, 1.0 };
 	float  light0_specular[] = { 1.0, 1.0, 1.0, 1.0 };
 	float  light0_ambient[] = { 0.1, 0.1, 0.1, 1.0 };
 	glLightfv( GL_LIGHT0, GL_POSITION, light0_position );
 	glLightfv( GL_LIGHT0, GL_DIFFUSE, light0_diffuse );
 	glLightfv( GL_LIGHT0, GL_SPECULAR, light0_specular );
 	glLightfv( GL_LIGHT0, GL_AMBIENT, light0_ambient );
 	glEnable( GL_LIGHT0 );
 
 	// 光源計算を有効にする
 	glEnable( GL_LIGHTING );
 
 	// 物体の色情報を有効にする
 	glEnable( GL_COLOR_MATERIAL );
 
 	// Zテストを有効にする
 	glEnable( GL_DEPTH_TEST );
 
 	// 背面除去を有効にする
 	glCullFace( GL_BACK );
 	glEnable( GL_CULL_FACE );
 
 	// 背景色を設定
 	glClearColor( 0.5, 0.5, 0.8, 0.0 );
 }
 
 
 //
 //  メイン関数(プログラムはここから開始)
 //
 int  main( int argc, char ** argv )
 {
 	// GLUTの初期化
 	glutInit( &argc, argv );
 	glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA );
 	glutInitWindowSize( 320, 320 );
 	glutInitWindowPosition( 0, 0 );
 	glutCreateWindow("GLUT sample program");
 	
 	// コールバック関数の登録
 	glutDisplayFunc( display );
 	glutReshapeFunc( reshape );
 	glutMouseFunc( mouse );
 	glutIdleFunc( idle );
 
 	// 環境初期化
 	initEnvironment();
 
 	// GLUTのメインループに処理を移す
 	glutMainLoop();
 	return 0;
 }



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS