1
テクスチャマッピングと物体の発光や透過
今回は,以下のプログラムの動作を確認します.
1. 画像の読み込みと表示
Program 1 OpenCV で画像を表示するプログラムの例 (OpenCV Sample001)
1 /*
2 プ ロ ジ ェ ク ト - > プ ロ パ テ ィ - > 構 成 プ ロ パ テ ィ - > VC++ デ ィ レ ク ト リ
3 「 イ ン ク ル ー ド デ ィ レ ク ト リ 」 に 以 下 を 記 述 ( 実 態 に 合 わ せ て 適 宜 変 更 す る ) 4 C :\ opencv \ build \ include
5 「 ラ イ ブ ラ リ デ ィ レ ク ト リ 」 に 以 下 を 記 述 ( 実 態 に 合 わ せ て 適 宜 変 更 す る ) 6 C :\ opencv \ build \ x86 \ vc10 \ lib
7 プ ロ ジ ェ ク ト - > プ ロ パ テ ィ - > 構 成 プ ロ パ テ ィ - > リ ン カ - > 入 力 8 「 追 加 の 依 存 フ ァ イ ル 」 に 以 下 を 記 述(240 は O p e n C V の バ ー ジ ョ ン な の で , 適 宜 変 更 す る ) 9 opencv_core240d . lib 10 opencv_imgproc240d . lib 11 opencv_highgui240d . lib 12 opencv_video240d . lib 13 プ ロ ジ ェ ク ト - > プ ロ パ テ ィ - > 構 成 プ ロ パ テ ィ - > デ バ ッ グ 14 「 環 境 」 に 以 下 を 記 述 ( 実 態 に 合 わ せ て 適 宜 変 更 す る )
15 PATH =C :\ opencv \ build \ x86 \ vc10 \ bin ;C :\ opencv \ build \ common \ tbb \ ia32 \ vc10 ;% PATH % 16 */
17 # include < stdio .h >
18 # include < opencv2 / opencv .hpp > 19
20 int main ( void ) 21 {
22 // カ ラ ー 画 像 を 入 れ る 入 れ 物 i m a g e を 作 る
23 IplImage * image = cvCreateImage ( cvSize (640 ,480) , IPL_DEPTH_8U , 3); 24
25 // p i c t u r e と い う 名 前 の 入 れ 物 に " sample . jpg " と い う 画 像 フ ァ イ ル を 読 み 込 ん で 入 れ る 26 IplImage * picture = cvLoadImage (" sample . jpg " , CV_LOAD_IMAGE_COLOR );
27
28 // p i c t u r e の 中 身 を c I m a g e R e s u l t に 大 き さ を 調 整 し て 入 れ る 29 cvResize ( picture , image , CV_INTER_LINEAR );
30
31 // " My Window " と い う 名 前 の ウ イ ン ド ウ を 作 る 32 cvNamedWindow (" My Window " , CV_WINDOW_AUTOSIZE ); 33
34 cvShowImage (" My Window " , image ); // i m a g e を " My Window " に 表 示 す る 35 36 cvWaitKey (0); // 何 か キ ー が 押 さ れ る ま で 待 つ 37 38 cvDestroyAllWindows (); // 作 っ た ウ イ ン ド ウ を 全 て 閉 じ る 39 40 return 0; 41 }
2. テクスチャマッピング
Program 2 テクスチャマッピングのプログラムの例 (OpenGL Sample012)
1 /*
2 プ ロ ジ ェ ク ト - > プ ロ パ テ ィ - > 構 成 プ ロ パ テ ィ - > VC++ デ ィ レ ク ト リ
3 「 イ ン ク ル ー ド デ ィ レ ク ト リ 」 に 以 下 を 記 述 ( 実 態 に 合 わ せ て 適 宜 変 更 す る ) 4 C :\ opencv \ build \ include
5 「 ラ イ ブ ラ リ デ ィ レ ク ト リ 」 に 以 下 を 記 述 ( 実 態 に 合 わ せ て 適 宜 変 更 す る ) 6 C :\ opencv \ build \ x86 \ vc10 \ lib
7 プ ロ ジ ェ ク ト - > プ ロ パ テ ィ - > 構 成 プ ロ パ テ ィ - > リ ン カ - > 入 力 8 「 追 加 の 依 存 フ ァ イ ル 」 に 以 下 を 記 述(240 は O p e n C V の バ ー ジ ョ ン な の で , 適 宜 変 更 す る ) 9 opencv_core240d . lib 10 opencv_imgproc240d . lib 11 opencv_highgui240d . lib 12 opencv_video240d . lib 13 プ ロ ジ ェ ク ト - > プ ロ パ テ ィ - > 構 成 プ ロ パ テ ィ - > デ バ ッ グ 14 「 環 境 」 に 以 下 を 記 述 ( 実 態 に 合 わ せ て 適 宜 変 更 す る )
15 PATH =C :\ opencv \ build \ x86 \ vc10 \ bin ;C :\ opencv \ build \ common \ tbb \ ia32 \ vc10 ;% PATH % 16 */
17 # include < stdio .h > 18
19 # include < opencv2 / opencv .hpp > 20 21 # include <GL / glut .h > 22 23 # define SQUARE_TEXTURE 1 24 # define SPHERE_TEXTURE 2 25 26 // グ ロ ー バ ル 変 数
27 static int MouseX = 0; // マ ウ ス X 座 標 28 static int MouseY = 0; // マ ウ ス Y 座 標 29 static float SpinX = 0; // X 軸 周 り の 回 転 量 30 static float SpinY = 0; // Y 軸 周 り の 回 転 量 31 static float Scale = 1.0; // 拡 大 量 32
33 static int MouseLB_ON =0; //左マウスボタン押下フラグ 34 static int MouseRB_ON =0; //右マウスボタン押下フラグ 35
36 void mouse ( int button , int state , int x , int y) 37 {
38 if ( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN ){
39 MouseLB_ON = 1; printf (" (%3d ,%3 d) で 左 ボ タ ン が 押 さ れ ま し た \ n" , x , y ); 40 } else if ( button == GLUT_LEFT_BUTTON && state == GLUT_UP ){
41 MouseLB_ON = 0; printf (" (%3d ,%3 d) で 左 ボ タ ン を 離 し ま し た \ n" , x , y ); 42 } else if ( button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN ){
43 MouseRB_ON = 1; printf (" (%3d ,%3 d) で 右 ボ タ ン が 押 さ れ ま し た \ n" , x , y ); 44 } else if ( button == GLUT_RIGHT_BUTTON && state == GLUT_UP ){
45 MouseRB_ON = 0; printf (" (%3d ,%3 d) で 右 ボ タ ン を 離 し ま し た \ n" , x , y ); 46 }
47 } 48
49 void dragMotion ( int x , int y) 50 { 51 if ( MouseLB_ON == 1){ 52 printf (" (%3d ,%3 d) で 左 ド ラ ッ グ 中 . . . \ n" , x , y ); 53 // マ ウ ス の 移 動 量 か ら 回 転 量 を 作 る 54 SpinX += x - MouseX ; 55 SpinY += y - MouseY ; 56 // マ ウ ス 座 標 の 更 新 57 MouseX = x; 58 MouseY = y; 59 glutPostRedisplay (); 60 } 61 else if ( MouseRB_ON == 1){ 62 printf (" (%3d ,%3 d) で 右 ド ラ ッ グ 中 . . . \ n" , x , y ); 63 // マ ウ ス の 移 動 量 か ら 拡 大 量 を 作 る
64 Scale += ( float )( y - MouseY )/100; 65 // マ ウ ス 座 標 の 更 新 66 MouseX = x; 67 MouseY = y; 68 glutPostRedisplay (); 69 } 70 } 71
72 void reshape ( int w , int h) // ウ イ ン ド ウ サ イ ズ 変 更 時 に 呼 び 出 さ れ る 関 数 ( R e s h a p e コ ー ル バ ッ ク 関 数 ) 73 { 74 glViewport (0 , 0, w , h ); 75 76 glMatrixMode ( GL_PROJECTION ); 77 glLoadIdentity (); 78 gluPerspective (30.0 , ( double )w/h , 1.0 , 100.0); // 透 視 投 影 79 80 glMatrixMode ( GL_MODELVIEW ); 81 glLoadIdentity (); 82 gluLookAt (5.0 , 5.0 , 5.0 , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0); // 視 点 の 設 定 83 } 84
85 void display ( void ) // 描 画 時 に 呼 び 出 さ れ る 関 数 ( D i s p l a y コ ー ル バ ッ ク 関 数 ) 86 {
87 glClearColor (0.0 , 0.0 , 0.0 , 1.0); // 画 面 ク リ ア
88 glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // 画 面 バ ッ フ ァ ク リ ア 89 glEnable ( GL_DEPTH_TEST ); // 隠 面 消 去 を 有 効 90 91 //物体の描画 92 glPushMatrix (); 93 glRotatef ( SpinX , 1.0 , 0.0 , 0.0); // X 軸 周 り に S p i n X だ け 回 転 94 glRotatef ( SpinY , 0.0 , 1.0 , 0.0); // Y 軸 周 り に S p i n Y だ け 回 転 95 glScalef ( Scale , Scale , Scale ); // S c a l e だ け 拡 大 縮 小 96 97 glCallList ( SQUARE_TEXTURE ); //物体 A の 描 画 98 // glCallList ( SPHERE_TEXTURE ); // 物 体 B の 描 画 99 glPopMatrix (); 100 101 // 座 標 軸 の 描 画 102 glPushMatrix (); // X 軸 103 GLfloat mat1diff [] = { 0.6 , 0.2 , 0.2 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 104 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat1diff );
105 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 106 glBegin ( GL_LINES ); 107 glVertex3f (0.0 f , 0.0f , 0.0 f ); 108 glVertex3f (2.0 f , 0.0f , 0.0 f ); 109 glEnd (); 110 glPopMatrix (); 111 glPushMatrix (); // Y 軸 112 GLfloat mat2diff [] = { 0.2 , 0.6 , 0.2 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 113 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat2diff );
114 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 115 glBegin ( GL_LINES ); 116 glVertex3f (0.0 f , 0.0f , 0.0 f ); 117 glVertex3f (0.0 f , 2.0f , 0.0 f ); 118 glEnd (); 119 glPopMatrix (); 120 glPushMatrix (); // Z 軸 121 GLfloat mat3diff [] = { 0.2 , 0.2 , 0.6 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 122 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat3diff );
123 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 124 glBegin ( GL_LINES ); 125 glVertex3f (0.0 f , 0.0f , 0.0 f ); 126 glVertex3f (0.0 f , 0.0f , 2.0 f ); 127 glEnd (); 128 glPopMatrix (); 129 130 glutSwapBuffers (); // 描 画 実 行 131 } 132
133 void lightInit ( void ) // 光 源 の 初 期 設 定 ( ま と め て 関 数 に し て い る だ け ) 134 { 135 glEnable ( GL_LIGHTING ); //光源の設定を有効にする 136 glEnable ( GL_LIGHT0 ); // 0 番 目 の 光 源 を 有 効 に す る ( 8 個 ま で 設 定 可 能 ) 137 glEnable ( GL_NORMALIZE ); //法線ベクトルの自動正規化を有効 138 139 GLfloat light0pos [] = { 0.0 , 5.0 , 0.0 , 1.0 };
140 glLightfv ( GL_LIGHT0 , GL_POSITION , light0pos ); //光源0 の 位 置 を 設 定 141
142 GLfloat light0ambi [] = { 0.2 , 0.2 , 0.2 , 1.0 };
143 glLightfv ( GL_LIGHT0 , GL_AMBIENT , light0ambi ); //光源0 の 環 境 光 の 色 を 設 定 144 GLfloat light0diff [] = { 0.8 , 0.8 , 0.8 , 1.0 };
145 glLightfv ( GL_LIGHT0 , GL_DIFFUSE , light0diff ); //光源0 の 拡 散 光 の 色 を 設 定 146 GLfloat light0spec [] = { 0.5 , 0.5 , 0.5 , 1.0 };
147 glLightfv ( GL_LIGHT0 , GL_SPECULAR , light0spec ); //光源0 の 鏡 面 光 の 色 を 設 定 148
149 glShadeModel ( GL_SMOOTH ); //スムーズシェーディングに設定 150 }
151
152 // 物 体 A( ポ リ ゴ ン に 読 み 込 ん だ 画 像 を テ ク ス チ ャ と し て 貼 る ) の 作 成 153 void makeModelA ( unsigned char * image , int size_x , int size_y ) 154 {
155 GLfloat white [] = { 1.0 , 1.0 , 1.0 , 1.0 }; // 材 質 は 白 156
157 GLuint texture ;
158 glGenTextures (1 , & texture ); // テ ク ス チ ャ の 数 を 知 ら せ る 159 glBindTexture ( GL_TEXTURE_2D , texture ); // バ イ ン ド ( 設 定 ) す る 160
161 glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR ); //拡大についての設定( 線 形 補 間 ) 162 glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR ); //縮小についての設定( 線 形 補 間 ) 163 //ミップマップ処理の設定
164 gluBuild2DMipmaps ( GL_TEXTURE_2D , 3, size_x , size_y , GL_RGB , GL_UNSIGNED_BYTE , image ); 165
166 /* モ デ ル 作 成 ( デ ィ ス プ レ イ リ ス ト ) */ 167 glNewList ( SQUARE_TEXTURE , GL_COMPILE ); 168 glPushMatrix ();
169 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , white ); 170 glEnable ( GL_TEXTURE_2D );
171 glBegin ( GL_POLYGON );
173 glTexCoord2f (0.0 , 1.0); glVertex3f ( 1.0 , 0.0 , 1.0); 174 glTexCoord2f (0.0 , 0.0); glVertex3f ( -1.0 , 0.0 , 1.0); 175 glTexCoord2f (1.0 , 0.0); glVertex3f ( -1.0 , 0.0 , -1.0); 176 glTexCoord2f (1.0 , 1.0); glVertex3f ( 1.0 , 0.0 , -1.0); 177 glEnd (); 178 glDisable ( GL_TEXTURE_2D ); 179 glPopMatrix (); 180 glEndList (); 181 182 return ; 183 } 184 185 // 物 体 B ( 球 に 読 み 込 ん だ 画 像 を テ ク ス チ ャ と し て 貼 る ) の 作 成 186 void makeModelB ( unsigned char * image , int size_x , int size_y ) 187 {
188 GLfloat white [] = { 1.0 , 1.0 , 1.0 , 1.0 }; // 材 質 は 白 189
190 GLuint texture ;
191 glGenTextures (1 , & texture ); // テ ク ス チ ャ の 数 を 知 ら せ る 192 glBindTexture ( GL_TEXTURE_2D , texture ); // バ イ ン ド ( 設 定 ) す る 193
194 glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR ); //拡大についての設定( 線 形 補 間 ) 195 glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR ); //縮小についての設定( 線 形 補 間 ) 196 //ミップマップ処理の設定
197 gluBuild2DMipmaps ( GL_TEXTURE_2D , 3, size_x , size_y , GL_RGB , GL_UNSIGNED_BYTE , image ); 198
199 GLUquadricObj * sphere ; 200 sphere = gluNewQuadric ();
201 gluQuadricDrawStyle ( sphere , GLU_FILL ); 202 gluQuadricNormals ( sphere , GLU_SMOOTH ); 203 gluQuadricTexture ( sphere , GL_TRUE ); 204
205 /* モ デ ル 作 成 ( デ ィ ス プ レ イ リ ス ト ) */ 206 glNewList ( SPHERE_TEXTURE , GL_COMPILE ); 207 glPushMatrix ();
208 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , white ); 209 glEnable ( GL_TEXTURE_2D ); 210 gluSphere ( sphere , 1.0 , 32 , 32); 211 glDisable ( GL_TEXTURE_2D ); 212 glPopMatrix (); 213 glEndList (); 214 215 return ; 216 } 217
218 int main ( int argc , char * argv []) 219 {
220 // OpenCV Initialize
221 // テ ク ス チ ャ 画 像 の 読 み 込 み と 配 列 へ の 格 納
222 IplImage * texImage = cvLoadImage (" texture . bmp " ,1); 223 unsigned char image [128][128][3];
224 for ( int x =0;x <128; x ++){ 225 for ( int y =0;y <128; y ++){
226 image [x ][ y ][2]= texImage -> imageData [128* y *3+ x *3+0];/* B */ 227 image [x ][ y ][1]= texImage -> imageData [128* y *3+ x *3+1];/* G */ 228 image [x ][ y ][0]= texImage -> imageData [128* y *3+ x *3+2];/* R */ 229 } }
230
231 // ウ イ ン ド ウ を 開 く
232 cvNamedWindow (" OpenCV Window " , CV_WINDOW_AUTOSIZE ); 233 cvShowImage (" OpenCV Window " , texImage );
234 cvWaitKey (1); 235
236 // OpenGL Initialize
237 glutInit (& argc , argv ); // G L U T 初 期 化
238 glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH ); 239 glutInitWindowSize (640 , 480); // ウ ィ ン ド ウ サ イ ズ の 指 定 240 glutCreateWindow (" window " ); // 表 示 ウ ィ ン ド ウ 作 成 241 glutReshapeFunc ( reshape ); // R e s h a p e コ ー ル バ ッ ク 関 数 の 指 定 242 glutDisplayFunc ( display ); // D i s p l a y コ ー ル バ ッ ク 関 数 の 指 定 243 244 glutMouseFunc ( mouse ); // マ ウ ス ク リ ッ ク コ ー ル バ ッ ク 関 数 の 指 定 245 glutMotionFunc ( dragMotion ); // マ ウ ス ド ラ ッ グ コ ー ル バ ッ ク 関 数 の 指 定 246 247 lightInit (); // 光 源 の 初 期 設 定 ( ま と め て 関 数 に し て い る だ け ) 248
249 makeModelA (( unsigned char *) image , 128 , 128); // C G モ デ ル の 作 成 と デ ィ ス プ レ イ リ ス ト 化 250 makeModelB (( unsigned char *) image , 128 , 128); // C G モ デ ル の 作 成 と デ ィ ス プ レ イ リ ス ト 化 251
252 // メ イ ン ル ー プ ( g l u t の 機 能 に よ り m y I d l e が 繰 り 返 し 呼 ば れ る ) 253 glutMainLoop (); // メ イ ン ル ー プ へ
254
255 // OpenCV Finalize
256 cvDestroyWindow ( " OpenCV Window " ); 257
258 return 0; 259 }
Program 3 複数テクスチャのマッピングプログラムの例 (OpenGL Sample013)
1 /*
2 プ ロ ジ ェ ク ト - > プ ロ パ テ ィ - > 構 成 プ ロ パ テ ィ - > VC++ デ ィ レ ク ト リ
3 「 イ ン ク ル ー ド デ ィ レ ク ト リ 」 に 以 下 を 記 述 ( 実 態 に 合 わ せ て 適 宜 変 更 す る ) 4 C :\ opencv \ build \ include
5 「 ラ イ ブ ラ リ デ ィ レ ク ト リ 」 に 以 下 を 記 述 ( 実 態 に 合 わ せ て 適 宜 変 更 す る ) 6 C :\ opencv \ build \ x86 \ vc10 \ lib
7 プ ロ ジ ェ ク ト - > プ ロ パ テ ィ - > 構 成 プ ロ パ テ ィ - > リ ン カ - > 入 力 8 「 追 加 の 依 存 フ ァ イ ル 」 に 以 下 を 記 述(240 は O p e n C V の バ ー ジ ョ ン な の で , 適 宜 変 更 す る ) 9 opencv_core240d . lib 10 opencv_imgproc240d . lib 11 opencv_highgui240d . lib 12 opencv_video240d . lib 13 プ ロ ジ ェ ク ト - > プ ロ パ テ ィ - > 構 成 プ ロ パ テ ィ - > デ バ ッ グ 14 「 環 境 」 に 以 下 を 記 述 ( 実 態 に 合 わ せ て 適 宜 変 更 す る )
15 PATH =C :\ opencv \ build \ x86 \ vc10 \ bin ;C :\ opencv \ build \ common \ tbb \ ia32 \ vc10 ;% PATH % 16 */
17 # include < stdio .h > 18
19 # include < opencv2 / opencv .hpp > 20 21 # include <GL / glut .h > 22 23 // テ ク ス チ ャ ID 24 # define TEXTURE_STARS 101 25 # define TEXTURE_EARTH 102 26 27 // モ デ ル の デ ィ ス プ レ イ リ ス ト ID 28 # define SQUARE_TEXTURE 1 29 # define SPHERE_TEXTURE 2 30 31 // グ ロ ー バ ル 変 数
32 static int MouseX = 0; // マ ウ ス X 座 標 33 static int MouseY = 0; // マ ウ ス Y 座 標 34 static float SpinX = 0; // X 軸 周 り の 回 転 量 35 static float SpinY = 0; // Y 軸 周 り の 回 転 量 36 static float Scale = 1.0; // 拡 大 量 37
38 static int MouseLB_ON =0; //左マウスボタン押下フラグ 39 static int MouseRB_ON =0; //右マウスボタン押下フラグ 40
41 void mouse ( int button , int state , int x , int y) 42 {
43 if ( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN ){
44 MouseLB_ON = 1; printf (" (%3d ,%3 d) で 左 ボ タ ン が 押 さ れ ま し た \ n" , x , y ); 45 } else if ( button == GLUT_LEFT_BUTTON && state == GLUT_UP ){
46 MouseLB_ON = 0; printf (" (%3d ,%3 d) で 左 ボ タ ン を 離 し ま し た \ n" , x , y ); 47 } else if ( button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN ){
48 MouseRB_ON = 1; printf (" (%3d ,%3 d) で 右 ボ タ ン が 押 さ れ ま し た \ n" , x , y ); 49 } else if ( button == GLUT_RIGHT_BUTTON && state == GLUT_UP ){
50 MouseRB_ON = 0; printf (" (%3d ,%3 d) で 右 ボ タ ン を 離 し ま し た \ n" , x , y ); 51 }
52 } 53
54 void dragMotion ( int x , int y) 55 { 56 if ( MouseLB_ON == 1){ 57 printf (" (%3d ,%3 d) で 左 ド ラ ッ グ 中 . . . \ n" , x , y ); 58 // マ ウ ス の 移 動 量 か ら 回 転 量 を 作 る 59 SpinX += x - MouseX ; 60 SpinY += y - MouseY ; 61 // マ ウ ス 座 標 の 更 新 62 MouseX = x; 63 MouseY = y; 64 glutPostRedisplay (); 65 } 66 else if ( MouseRB_ON == 1){ 67 printf (" (%3d ,%3 d) で 右 ド ラ ッ グ 中 . . . \ n" , x , y ); 68 // マ ウ ス の 移 動 量 か ら 拡 大 量 を 作 る
69 Scale += ( float )( y - MouseY )/100; 70 // マ ウ ス 座 標 の 更 新 71 MouseX = x; 72 MouseY = y; 73 glutPostRedisplay (); 74 } 75 } 76
77 void reshape ( int w , int h) // ウ イ ン ド ウ サ イ ズ 変 更 時 に 呼 び 出 さ れ る 関 数 ( R e s h a p e コ ー ル バ ッ ク 関 数 ) 78 { 79 glViewport (0 , 0, w , h ); 80 glMatrixMode ( GL_PROJECTION ); 81 glLoadIdentity (); 82 gluPerspective (30.0 , ( double )w/h , 1.0 , 100.0); // 透 視 投 影 83 84 glMatrixMode ( GL_MODELVIEW ); 85 glLoadIdentity (); 86 gluLookAt (5.0 , 0.0 , 5.0 , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0); // 視 点 の 設 定 87 }
88
89 void display ( void ) // 描 画 時 に 呼 び 出 さ れ る 関 数 ( D i s p l a y コ ー ル バ ッ ク 関 数 ) 90 {
91 glClearColor (0.0 , 0.0 , 0.0 , 1.0); // 画 面 ク リ ア
92 glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // 画 面 バ ッ フ ァ ク リ ア 93 glEnable ( GL_DEPTH_TEST ); // 隠 面 消 去 を 有 効 94 95 //物体の描画 96 glPushMatrix (); 97 glTranslatef ( -1.0 ,0.0 , -1.0); 98 glRotatef (45.0 , 0.0 , 1.0 , 0.0); // Y 軸 周 り に S p i n Y だ け 回 転 99 glScalef (3.0 , 3.0 , 3.0); // S c a l e だ け 拡 大 縮 小
100 glBindTexture ( GL_TEXTURE_2D , TEXTURE_STARS ); // バ イ ン ド ( 設 定 ) す る 101 glCallList ( SQUARE_TEXTURE ); //物体 A の 描 画 102 glPopMatrix (); 103 104 //物体の描画 105 glPushMatrix (); 106 glRotatef ( SpinX , 1.0 , 0.0 , 0.0); // X 軸 周 り に S p i n X だ け 回 転 107 glRotatef ( SpinY , 0.0 , 1.0 , 0.0); // Y 軸 周 り に S p i n Y だ け 回 転 108 glScalef ( Scale , Scale , Scale ); // S c a l e だ け 拡 大 縮 小
109 glBindTexture ( GL_TEXTURE_2D , TEXTURE_EARTH ); // バ イ ン ド ( 設 定 ) す る 110 glCallList ( SPHERE_TEXTURE ); //物体 B の 描 画 111 glPopMatrix (); 112 113 // 座 標 軸 の 描 画 114 glPushMatrix (); // X 軸 115 GLfloat mat1diff [] = { 0.6 , 0.2 , 0.2 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 116 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat1diff );
117 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 118 glBegin ( GL_LINES ); 119 glVertex3f (0.0 f , 0.0f , 0.0 f ); 120 glVertex3f (2.0 f , 0.0f , 0.0 f ); 121 glEnd (); 122 glPopMatrix (); 123 glPushMatrix (); // Y 軸 124 GLfloat mat2diff [] = { 0.2 , 0.6 , 0.2 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 125 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat2diff );
126 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 127 glBegin ( GL_LINES ); 128 glVertex3f (0.0 f , 0.0f , 0.0 f ); 129 glVertex3f (0.0 f , 2.0f , 0.0 f ); 130 glEnd (); 131 glPopMatrix (); 132 glPushMatrix (); // Z 軸 133 GLfloat mat3diff [] = { 0.2 , 0.2 , 0.6 , 1.0 }; //環境光と拡散光の反射率をまとめて設定 134 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat3diff );
135 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 136 glBegin ( GL_LINES ); 137 glVertex3f (0.0 f , 0.0f , 0.0 f ); 138 glVertex3f (0.0 f , 0.0f , 2.0 f ); 139 glEnd (); 140 glPopMatrix (); 141 142 glutSwapBuffers (); // 描 画 実 行 143 } 144
145 void lightInit ( void ) // 光 源 の 初 期 設 定 ( ま と め て 関 数 に し て い る だ け ) 146 { 147 glEnable ( GL_LIGHTING ); //光源の設定を有効にする 148 glEnable ( GL_LIGHT0 ); // 0 番 目 の 光 源 を 有 効 に す る ( 8 個 ま で 設 定 可 能 ) 149 glEnable ( GL_NORMALIZE ); //法線ベクトルの自動正規化を有効 150 151 GLfloat light0pos [] = { 0.0 , 5.0 , 0.0 , 1.0 };
152 glLightfv ( GL_LIGHT0 , GL_POSITION , light0pos ); //光源0 の 位 置 を 設 定 153
154 GLfloat light0ambi [] = { 0.2 , 0.2 , 0.2 , 1.0 };
155 glLightfv ( GL_LIGHT0 , GL_AMBIENT , light0ambi ); //光源0 の 環 境 光 の 色 を 設 定 156 GLfloat light0diff [] = { 0.8 , 0.8 , 0.8 , 1.0 };
157 glLightfv ( GL_LIGHT0 , GL_DIFFUSE , light0diff ); //光源0 の 拡 散 光 の 色 を 設 定 158 GLfloat light0spec [] = { 0.5 , 0.5 , 0.5 , 1.0 };
159 glLightfv ( GL_LIGHT0 , GL_SPECULAR , light0spec ); //光源0 の 鏡 面 光 の 色 を 設 定 160
161 glShadeModel ( GL_SMOOTH ); //スムーズシェーディングに設定 162 }
163
164 void loadTexture ( void ) 165 {
166 // O p e n C V を 使 っ て 画 像 フ ァ イ ル を 読 み 込 む 167 // 1 つ 目 の テ ク ス チ ャ 画 像 の 読 み 込 み
168 IplImage * _texImage1 = cvLoadImage (" texture1 . jpg " , 1); 169 // テ ク ス チ ャ 画 像 ( ( 2 の n 乗 )*( 2 の n 乗 ) の サ イ ズ に す る と 無 難 )
170 IplImage * texImage1 = cvCreateImage ( cvSize (768 ,512) , IPL_DEPTH_8U ,3); 171 cvResize ( _texImage1 , texImage1 );
172 cvFlip ( texImage1 , texImage1 , 0);//画像の上下反転
173 cvCvtColor ( texImage1 , texImage1 , CV_BGR2RGB ); //画素データ順序を B G R か ら R G B に 変 換 174 cvNamedWindow (" OpenCV Window 1" , CV_WINDOW_AUTOSIZE );
176 // 1 つ 目 の テ ク ス チ ャ の 設 定
177 glBindTexture ( GL_TEXTURE_2D , TEXTURE_STARS ); // こ れ か ら 1 つ 目 の テ ク ス チ ャ の 設 定 を す る 178 glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR ); //拡大についての設定( 線 形 補 間 ) 179 glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR ); //縮小についての設定( 線 形 補 間 ) 180 //ミップマップ処理の設定
181 gluBuild2DMipmaps ( GL_TEXTURE_2D , 3, 768 , 512 , GL_RGB , GL_UNSIGNED_BYTE , texImage1 -> imageData ); 182 // 画 像 メ モ リ の 解 放
183 cvReleaseImage (& texImage1 ); 184
185 // 2 つ 目 の テ ク ス チ ャ 画 像 の 読 み 込 み
186 IplImage * _texImage2 = cvLoadImage (" texture2 . jpg " , 1); 187 // テ ク ス チ ャ 画 像 ( ( 2 の n 乗 )*( 2 の n 乗 ) の サ イ ズ に す る と 無 難 )
188 IplImage * texImage2 = cvCreateImage ( cvSize (1024 ,512) , IPL_DEPTH_8U ,3); 189 cvResize ( _texImage2 , texImage2 );
190 cvFlip ( texImage2 , texImage2 , 0); //画像の上下反転
191 cvCvtColor ( texImage2 , texImage2 , CV_BGR2RGB ); //画素データ順序を B G R か ら R G B に 変 換 192 cvNamedWindow (" OpenCV Window 2" , CV_WINDOW_AUTOSIZE );
193 cvShowImage (" OpenCV Window 2" , _texImage2 ); cvWaitKey (1); 194 // 2 つ 目 の テ ク ス チ ャ の 設 定
195 glBindTexture ( GL_TEXTURE_2D , TEXTURE_EARTH ); // こ れ か ら 1 つ 目 の テ ク ス チ ャ の 設 定 を す る 196 glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR ); //拡大についての設定( 線 形 補 間 ) 197 glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR ); //縮小についての設定( 線 形 補 間 ) 198 //ミップマップ処理の設定
199 gluBuild2DMipmaps ( GL_TEXTURE_2D , 3, 1024 , 512 , GL_RGB , GL_UNSIGNED_BYTE , texImage2 -> imageData ); 200 // 画 像 メ モ リ の 解 放
201 cvReleaseImage (& texImage2 ); 202
203 return ; 204 }
205
206 // 物 体 A( ポ リ ゴ ン に 読 み 込 ん だ 画 像 を テ ク ス チ ャ と し て 貼 る ) の 作 成 207 void makeModelA ( void )
208 {
209 GLfloat white [] = { 1.0 , 1.0 , 1.0 , 1.0 }; // 材 質 は 白 210
211 /* モ デ ル 作 成 ( デ ィ ス プ レ イ リ ス ト ) */ 212 glNewList ( SQUARE_TEXTURE , GL_COMPILE ); 213 glPushMatrix ();
214 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , white ); 215 glEnable ( GL_TEXTURE_2D ); 216 glBegin ( GL_POLYGON ); 217 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 218 glTexCoord2f (1.0 , 1.0); glVertex3f ( 1.0 , 1.0 , 0.0); 219 glTexCoord2f (0.0 , 1.0); glVertex3f ( -1.0 , 1.0 , 0.0); 220 glTexCoord2f (0.0 , 0.0); glVertex3f ( -1.0 , -1.0 ,0.0); 221 glTexCoord2f (1.0 , 0.0); glVertex3f ( 1.0 , -1.0 ,0.0); 222 glEnd (); 223 glDisable ( GL_TEXTURE_2D ); 224 glPopMatrix (); 225 glEndList (); 226 227 return ; 228 } 229 230 // 物 体 B ( 球 に 読 み 込 ん だ 画 像 を テ ク ス チ ャ と し て 貼 る ) の 作 成 231 void makeModelB ( void )
232 {
233 GLfloat white [] = { 1.0 , 1.0 , 1.0 , 1.0 }; // 材 質 は 白 234
235 GLUquadricObj * sphere ; 236 sphere = gluNewQuadric ();
237 gluQuadricDrawStyle ( sphere , GLU_FILL ); 238 gluQuadricNormals ( sphere , GLU_SMOOTH ); 239 gluQuadricTexture ( sphere , GL_TRUE ); 240
241 /* モ デ ル 作 成 ( デ ィ ス プ レ イ リ ス ト ) */ 242 glNewList ( SPHERE_TEXTURE , GL_COMPILE ); 243 glPushMatrix ();
244 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , white ); 245 glEnable ( GL_TEXTURE_2D ); 246 gluSphere ( sphere , 1.0 , 32 , 32); 247 glDisable ( GL_TEXTURE_2D ); 248 glPopMatrix (); 249 glEndList (); 250 251 return ; 252 } 253
254 int main ( int argc , char * argv []) 255 {
256
257 // ************************************************************* 258 // OpenGL Initialize
259 // ************************************************************* 260 glutInit (& argc , argv ); // G L U T 初 期 化
261 glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH ); 262 glutInitWindowSize (640 , 480); // ウ ィ ン ド ウ サ イ ズ の 指 定 263 glutCreateWindow (" window " ); // 表 示 ウ ィ ン ド ウ 作 成
264 glutReshapeFunc ( reshape ); // R e s h a p e コ ー ル バ ッ ク 関 数 の 指 定 265 glutDisplayFunc ( display ); // D i s p l a y コ ー ル バ ッ ク 関 数 の 指 定 266 267 glutMouseFunc ( mouse ); // マ ウ ス ク リ ッ ク コ ー ル バ ッ ク 関 数 の 指 定 268 glutMotionFunc ( dragMotion ); // マ ウ ス ド ラ ッ グ コ ー ル バ ッ ク 関 数 の 指 定 269 270 lightInit (); // 光 源 の 初 期 設 定 ( ま と め て 関 数 に し て い る だ け ) 271 272 loadTexture (); // テ ク ス チ ャ の 読 み 込 み 273 makeModelA (); // C G モ デ ル の 作 成 と デ ィ ス プ レ イ リ ス ト 化 274 makeModelB (); // C G モ デ ル の 作 成 と デ ィ ス プ レ イ リ ス ト 化 275 276 // ************************************************************* 277 // メ イ ン ル ー プ ( g l u t の 機 能 に よ り m y I d l e が 繰 り 返 し 呼 ば れ る ) 278 // ************************************************************* 279 glutMainLoop (); // メ イ ン ル ー プ へ 280 // ---281 282 // ************************************************************* 283 // OpenCV Finalize 284 // ************************************************************* 285 cvDestroyAllWindows (); 286 287 return 0; 288 }
3. 物体の発光や透過
Program 4 物体の発光や透過の例 (OpenGL Sample014)
1 # include < stdio .h > 2 # include <GL / glut .h > 3
4 // グ ロ ー バ ル 変 数
5 static int MouseX = 0; // マ ウ ス X 座 標 6 static int MouseY = 0; // マ ウ ス Y 座 標 7 static float SpinX = 0; // X 軸 周 り の 回 転 量 8 static float SpinY = 0; // Y 軸 周 り の 回 転 量 9 static float MoveX = 0; // X 軸 方 向 の 移 動 量 10 static float MoveZ = 0; // Y 軸 方 向 の 移 動 量 11 static float Scale = 1.0; // 拡 大 量 12
13 void specialKey ( int key , int x , int y) 14 { 15 switch ( key ) { 16 case GLUT_KEY_UP : 17 printf (" (%3d ,%3 d) で [ ↑ ] が 押 さ れ ま し た \ n" , x , y ); 18 MoveZ += 0.1; 19 break ; 20 case GLUT_KEY_DOWN : 21 printf (" (%3d ,%3 d) で [ ↓ ] が 押 さ れ ま し た \ n" , x , y ); 22 MoveZ -= 0.1; 23 break ; 24 case GLUT_KEY_LEFT : 25 printf (" (%3d ,%3 d) で [ ← ] が 押 さ れ ま し た \ n" , x , y ); 26 MoveX -= 0.1; 27 break ; 28 case GLUT_KEY_RIGHT : 29 printf (" (%3d ,%3 d) で [ → ] が 押 さ れ ま し た \ n" , x , y ); 30 MoveX += 0.1; 31 break ; 32 } 33 glutPostRedisplay (); 34 } 35
36 static int MouseLB_ON =0; //左マウスボタン押下フラグ 37 static int MouseRB_ON =0; //右マウスボタン押下フラグ 38
39 void mouse ( int button , int state , int x , int y) 40 {
41 if ( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN ){
42 MouseLB_ON = 1; printf (" (%3d ,%3 d) で 左 ボ タ ン が 押 さ れ ま し た \ n" , x , y ); 43 } else if ( button == GLUT_LEFT_BUTTON && state == GLUT_UP ){
44 MouseLB_ON = 0; printf (" (%3d ,%3 d) で 左 ボ タ ン を 離 し ま し た \ n" , x , y ); 45 } else if ( button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN ){
46 MouseRB_ON = 1; printf (" (%3d ,%3 d) で 右 ボ タ ン が 押 さ れ ま し た \ n" , x , y ); 47 } else if ( button == GLUT_RIGHT_BUTTON && state == GLUT_UP ){
48 MouseRB_ON = 0; printf (" (%3d ,%3 d) で 右 ボ タ ン を 離 し ま し た \ n" , x , y ); 49 }
50 } 51
52 void dragMotion ( int x , int y) 53 { 54 if ( MouseLB_ON == 1){ 55 printf (" (%3d ,%3 d) で 左 ド ラ ッ グ 中 . . . \ n" , x , y ); 56 // マ ウ ス の 移 動 量 か ら 回 転 量 を 作 る 57 SpinX += x - MouseX ; 58 SpinY += y - MouseY ; 59 // マ ウ ス 座 標 の 更 新 60 MouseX = x; 61 MouseY = y; 62 glutPostRedisplay (); 63 } 64 else if ( MouseRB_ON == 1){ 65 printf (" (%3d ,%3 d) で 右 ド ラ ッ グ 中 . . . \ n" , x , y ); 66 // マ ウ ス の 移 動 量 か ら 拡 大 量 を 作 る
67 Scale += ( float )( y - MouseY )/100; 68 // マ ウ ス 座 標 の 更 新 69 MouseX = x; 70 MouseY = y; 71 glutPostRedisplay (); 72 } 73 } 74
75 void reshape ( int w , int h) // ウ イ ン ド ウ サ イ ズ 変 更 時 に 呼 び 出 さ れ る 関 数 ( R e s h a p e コ ー ル バ ッ ク 関 数 ) 76 { 77 glViewport (0 , 0, w , h ); 78 79 glMatrixMode ( GL_PROJECTION ); 80 glLoadIdentity (); 81 gluPerspective (30.0 , ( double )w/h , 1.0 , 100.0); // 透 視 投 影 82 83 glMatrixMode ( GL_MODELVIEW ); 84 glLoadIdentity ();
85 gluLookAt (5.0 , 5.0 , 5.0 , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0); // 視 点 の 設 定 86 }
87
88 void display ( void ) // 描 画 時 に 呼 び 出 さ れ る 関 数 ( D i s p l a y コ ー ル バ ッ ク 関 数 ) 89 {
90 glClearColor (0.0 , 0.0 , 0.0 , 1.0); // 画 面 ク リ ア
91 glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // 画 面 バ ッ フ ァ ク リ ア 92 glEnable ( GL_DEPTH_TEST ); // 隠 面 消 去 を 有 効 93 94 //発光球( シ ル バ ー ) の 描 画 95 glPushMatrix (); 96 GLfloat silver_ambient [] = {0.19225 , 0.19225 , 0.19225 , 1.0}; 97 GLfloat silver_diffuse [] = {0.50754 , 0.50754 , 0.50754 , 1.0}; 98 GLfloat silver_specular [] = {0.508273 , 0.508273 , 0.508273 ,1.0}; 99 GLfloat silver_shininess []= {51.2};
100 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT , silver_ambient ); 101 glMaterialfv ( GL_FRONT_AND_BACK , GL_DIFFUSE , silver_diffuse ); 102 glMaterialfv ( GL_FRONT_AND_BACK , GL_SPECULAR , silver_specular ); 103 glMaterialfv ( GL_FRONT_AND_BACK , GL_SHININESS , silver_shininess );
104 glMaterialfv ( GL_FRONT_AND_BACK , GL_EMISSION , silver_diffuse );// オ ブ ジ ェ ク ト を 発 光 さ せ る 105 glTranslatef (0.0 , 2.0 , 0.0); // Y 軸 方 向 に 2 .0 移 動
106 glutSolidSphere (0.2 , 20.0 , 20.0); //球の描画
107 GLfloat silver_emission_nomal [] = {0.0 , 0.0 , 0.0 , 1.0};
108 glMaterialfv ( GL_FRONT_AND_BACK , GL_EMISSION , silver_emission_nomal ); // 発 光 を も と に 戻 す 109 glPopMatrix ();
110
111 // 座 標 軸 の 描 画 112 glPushMatrix (); // X 軸
113 GLfloat mat1diff [] = { 0.6 , 0.2 , 0.2 , 1.0 };
114 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat1diff ); 115 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 116 glBegin ( GL_LINES ); 117 glVertex3f (0.0 f , 0.0f , 0.0 f ); 118 glVertex3f (2.0 f , 0.0f , 0.0 f ); 119 glEnd (); 120 glPopMatrix (); 121 glPushMatrix (); // Y 軸 122 GLfloat mat2diff [] = { 0.2 , 0.6 , 0.2 , 1.0 };
123 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat2diff ); 124 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 125 glBegin ( GL_LINES ); 126 glVertex3f (0.0 f , 0.0f , 0.0 f ); 127 glVertex3f (0.0 f , 2.0f , 0.0 f ); 128 glEnd (); 129 glPopMatrix (); 130 glPushMatrix (); // Z 軸 131 GLfloat mat3diff [] = { 0.2 , 0.2 , 0.6 , 1.0 };
132 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT_AND_DIFFUSE , mat3diff ); 133 glNormal3f (0.0 , 1.0 , 0.0); //法線方向の設定 134 glBegin ( GL_LINES ); 135 glVertex3f (0.0 f , 0.0f , 0.0 f ); 136 glVertex3f (0.0 f , 0.0f , 2.0 f ); 137 glEnd (); 138 glPopMatrix (); 139 140 // ブ レ ン デ ィ イ ン グ を 有 効 に す る 141 glEnable ( GL_BLEND ); 142 // ア ル フ ァ ブ レ ン デ ィ イ ン グ の 設 定 ( 色 々 な 透 明 感 の 出 し 方 が あ る が 通 常 は こ れ で 良 い ) 143 glBlendFunc ( GL_SRC_ALPHA , GL_ONE );
144 145 //緑( プ ラ ス チ ッ ク ) の 球 の 描 画 146 glPushMatrix (); 147 GLfloat green_plastic_ambient [] = {0.0 , 0.0 , 0.0 , 1.0}; 148 GLfloat green_plastic_diffuse [] = {0.1 , 0.35 , 0.1 , 1.0}; 149 GLfloat green_plastic_specular [] = {0.45 , 0.55 , 0.45 , 1.0}; 150 GLfloat green_plastic_shininess []= {32};
151 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT , green_plastic_ambient ); 152 glMaterialfv ( GL_FRONT_AND_BACK , GL_DIFFUSE , green_plastic_diffuse ); 153 glMaterialfv ( GL_FRONT_AND_BACK , GL_SPECULAR , green_plastic_specular ); 154 glMaterialfv ( GL_FRONT_AND_BACK , GL_SHININESS , green_plastic_shininess ); 155 glTranslatef (0.0 , 0.0 , 1.0); // Z 軸 方 向 に 1 .0 移 動 156 glutSolidSphere (0.5 , 20.0 , 20.0); //球の描画 157 glPopMatrix (); 158 159 //赤( ル ビ ー ) の 球 の 描 画 160 glPushMatrix (); 161 GLfloat ruby_ambient [] = {0.1745 , 0.01175 , 0.01175 , 1.0}; 162 GLfloat ruby_diffuse [] = {0.61424 , 0.04136 , 0.04136 , 1.0}; 163 GLfloat ruby_specular [] = {0.727811 , 0.626959 , 0.626959 , 1.0}; 164 GLfloat ruby_shininess []= {76.8 };
165 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT , ruby_ambient ); 166 glMaterialfv ( GL_FRONT_AND_BACK , GL_DIFFUSE , ruby_diffuse ); 167 glMaterialfv ( GL_FRONT_AND_BACK , GL_SPECULAR , ruby_specular ); 168 glMaterialfv ( GL_FRONT_AND_BACK , GL_SHININESS , ruby_shininess ); 169 glTranslatef (1.0 , 0.0 , 0.0); // X 軸 方 向 に 1 .0 移 動
170 glutSolidSphere (0.5 , 20.0 , 20.0); //球の描画 171 glPopMatrix ();
173 //半透明の立方体( 真 鍮 ) を 描 画 174 glPushMatrix (); 175 GLfloat brass_ambient [] ={0.329412 , 0.223529 , 0.027451 , 0.5};//アルファ値(0.5) が 透 明 度 を 示 す 176 GLfloat brass_diffuse [] ={0.780392 , 0.568627 , 0.113725 , 0.5};//アルファ値(0.5) が 透 明 度 を 示 す 177 GLfloat brass_specular [] ={0.992157 , 0.941176 , 0.807843 , 0.5};//アルファ値(0.5) が 透 明 度 を 示 す 178 GLfloat brass_shininess []={27.89743616};
179 glMaterialfv ( GL_FRONT_AND_BACK , GL_AMBIENT , brass_ambient ); 180 glMaterialfv ( GL_FRONT_AND_BACK , GL_DIFFUSE , brass_diffuse ); 181 glMaterialfv ( GL_FRONT_AND_BACK , GL_SPECULAR , brass_specular ); 182 glMaterialfv ( GL_FRONT_AND_BACK , GL_SHININESS , brass_shininess );
183 glTranslatef ( MoveX , 0.0 , MoveZ ); // X 軸 方 向 に M o v e X , Z 軸 方 向 に M o v e Z だ け 移 動 184 glRotatef ( SpinX , 1.0 , 0.0 , 0.0); // X 軸 周 り に S p i n X だ け 回 転
185 glRotatef ( SpinY , 0.0 , 1.0 , 0.0); // Y 軸 周 り に S p i n Y だ け 回 転 186 glScalef ( Scale , Scale , Scale ); // S c a l e だ け 拡 大 縮 小 187 //半透明の立方体を描画 188 glutSolidCube (2.0); 189 glPopMatrix (); 190 191 glDisable ( GL_BLEND ); // ブ レ ン ド を 無 効 に す る 192 193 glutSwapBuffers (); // 描 画 実 行 194 } 195
196 void lightInit ( void ) // 光 源 の 初 期 設 定 ( ま と め て 関 数 に し て い る だ け ) 197 { 198 glEnable ( GL_LIGHTING ); //光源の設定を有効にする 199 glEnable ( GL_LIGHT0 ); // 0 番 目 の 光 源 を 有 効 に す る ( 8 個 ま で 設 定 可 能 ) 200 glEnable ( GL_NORMALIZE ); //法線ベクトルの自動正規化を有効 201 202 GLfloat light0pos [] = { 0.0 , 2.0 , 0.0 , 1.0 };// Y 軸 方 向 に 2 .0 移 動 ( 発 光 球 と 同 じ 場 所 に ) 203 glLightfv ( GL_LIGHT0 , GL_POSITION , light0pos ); //光源0 の 位 置 を 設 定
204
205 GLfloat light0ambi [] = { 0.2 , 0.2 , 0.2 , 1.0 };
206 glLightfv ( GL_LIGHT0 , GL_AMBIENT , light0ambi ); //光源0 の 環 境 光 の 色 を 設 定 207 GLfloat light0diff [] = { 0.8 , 0.8 , 0.8 , 1.0 };
208 glLightfv ( GL_LIGHT0 , GL_DIFFUSE , light0diff ); //光源0 の 拡 散 光 の 色 を 設 定 209 GLfloat light0spec [] = { 0.5 , 0.5 , 0.5 , 1.0 };
210 glLightfv ( GL_LIGHT0 , GL_SPECULAR , light0spec ); //光源0 の 鏡 面 光 の 色 を 設 定 211
212 glShadeModel ( GL_SMOOTH ); //スムーズシェーディングに設定 213 }
214
215 int main ( int argc , char * argv []) 216 {
217 glutInit (& argc , argv ); // G L U T 初 期 化
218 glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH ); 219 glutInitWindowSize (640 , 480); // ウ ィ ン ド ウ サ イ ズ の 指 定 220 glutCreateWindow (" window " ); // 表 示 ウ ィ ン ド ウ 作 成 221 glutReshapeFunc ( reshape ); // R e s h a p e コ ー ル バ ッ ク 関 数 の 指 定 222 glutDisplayFunc ( display ); // D i s p l a y コ ー ル バ ッ ク 関 数 の 指 定 223 224 glutMouseFunc ( mouse ); // マ ウ ス ク リ ッ ク コ ー ル バ ッ ク 関 数 の 指 定 225 glutMotionFunc ( dragMotion ); // マ ウ ス ド ラ ッ グ コ ー ル バ ッ ク 関 数 の 指 定 226 glutSpecialFunc ( specialKey ); // 特 殊 キ ー コ ー ル バ ッ ク 関 数 の 指 定 ( 押 し た と き ) 227 // glutIgnoreKeyRepeat ( GL_TRUE ); // キ ー リ ピ ー ト 無 効 228 229 lightInit (); // 光 源 の 初 期 設 定 ( ま と め て 関 数 に し て い る だ け ) 230 231 glutMainLoop (); // メ イ ン ル ー プ へ 232 233 return 0; 234 }