Modified lines:  6, 167, 168
Added line:  151, 166, 167, 251, 252, 253
Removed line:  162, 169, 170, 171
Generated by diff2html.pl
© Yves Bailly, MandrakeSoft S.A. 2001, Ryohei Morita 2007
diff2html.pl is licensed under the GNU GPL.

  ../108-2/108-2-Viewpoint.c     108-3-ViewpointCentering.c
  303 lines
11727 bytes
Last modified : Sat Nov 12 18:55:17 2011

    305 lines
11883 bytes
Last modified : Sat Nov 12 18:55:33 2011

1 // Keisanki Joron 2 (Introduction to Computing II)   1 // Keisanki Joron 2 (Introduction to Computing II)
2 // Dept. of Engineering Systems, University of Tsukuba   2 // Dept. of Engineering Systems, University of Tsukuba
3 // [UTF-8 / Unix]   3 // [UTF-8 / Unix]
4   4
5 // 2011/11/07 kameda[at]iit.tsukuba.ac.jp   5 // 2011/11/07 kameda[at]iit.tsukuba.ac.jp
6 // 8.2 ウィンドウサイズ変更による影響の無効化 (Viewpoint変換の無効化)   6 // 8.3 表示のセンタリング
7   7
8 #include <stdio.h>   8 #include <stdio.h>
9 #include <stdlib.h> // exit()   9 #include <stdlib.h> // exit()
10 #include <GL/glut.h>   10 #include <GL/glut.h>
11   11
12 // ***********************************************************************    12 // *********************************************************************** 
13 // global variables ******************************************************   13 // global variables ******************************************************
14   14
15 // +----------------------------------------------------   15 // +----------------------------------------------------
16 // Global Variables   16 // Global Variables
17 // +----------------------------------------------------   17 // +----------------------------------------------------
18   18
19 // Windowサイズ   19 // Windowサイズ
20 int window_w = 400;   20 int window_w = 400;
21 int window_h = 400;   21 int window_h = 400;
22   22
23 // 直交投影時のスケールファクタ [pixel / unit_of_imager]   23 // 直交投影時のスケールファクタ [pixel / unit_of_imager]
24 // ここでは正規化カメラの撮像面での 1.0 単位を 200画素に相当させる   24 // ここでは正規化カメラの撮像面での 1.0 単位を 200画素に相当させる
25 float ortho_unit = 200.0;    25 float ortho_unit = 200.0; 
26   26
27 // WindowのID(描画管理用)   27 // WindowのID(描画管理用)
28 int window_id = -1;   28 int window_id = -1;
29   29
30 // ***********************************************************************    30 // *********************************************************************** 
31 // gl utilitiess *********************************************************   31 // gl utilitiess *********************************************************
32   32
33 // +----------------------------------------------------   33 // +----------------------------------------------------
34 // MODELVIEW Matrix と PROJECTION を表示する   34 // MODELVIEW Matrix と PROJECTION を表示する
35 // +----------------------------------------------------   35 // +----------------------------------------------------
36 void ic2_ShowMATRIX (char *str) {   36 void ic2_ShowMATRIX (char *str) {
37   GLfloat m[16]; // GL_MODELVIEW matrix   37   GLfloat m[16]; // GL_MODELVIEW matrix
38   GLfloat p[16]; // GL_PROJECTION matrix   38   GLfloat p[16]; // GL_PROJECTION matrix
39   39
40   glGetFloatv(GL_MODELVIEW_MATRIX , m);  // MODELVIEWのスタックトップmatrixをmにコピー   40   glGetFloatv(GL_MODELVIEW_MATRIX , m);  // MODELVIEWのスタックトップmatrixをmにコピー
41   glGetFloatv(GL_PROJECTION_MATRIX, p); // PROJECTIONのスタックトップmatrixをpにコピー   41   glGetFloatv(GL_PROJECTION_MATRIX, p); // PROJECTIONのスタックトップmatrixをpにコピー
42   if (str != NULL) printf("<< %s >>\n", str);   42   if (str != NULL) printf("<< %s >>\n", str);
43   printf("MODELVIEW Matrix                        PROJECTION Matrix\n");   43   printf("MODELVIEW Matrix                        PROJECTION Matrix\n");
44   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n",   44   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n",
45           m[ 0], m[ 4], m[ 8], m[12],     p[ 0], p[ 4], p[ 8], p[12]);   45           m[ 0], m[ 4], m[ 8], m[12],     p[ 0], p[ 4], p[ 8], p[12]);
46   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n",    46   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n", 
47           m[ 1], m[ 5], m[ 9], m[13],     p[ 1], p[ 5], p[ 9], p[13]);   47           m[ 1], m[ 5], m[ 9], m[13],     p[ 1], p[ 5], p[ 9], p[13]);
48   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n",    48   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n", 
49           m[ 2], m[ 6], m[10], m[14],     p[ 2], p[ 6], p[10], p[14]);   49           m[ 2], m[ 6], m[10], m[14],     p[ 2], p[ 6], p[10], p[14]);
50   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n",    50   printf("%7.3f  %7.3f  %7.3f  %7.3f      %7.3f  %7.3f  %7.3f  %7.3f\n", 
51           m[ 3], m[ 7], m[11], m[15],     p[ 3], p[ 7], p[11], p[15]);   51           m[ 3], m[ 7], m[11], m[15],     p[ 3], p[ 7], p[11], p[15]);
52 }   52 }
53   53
54 // ***********************************************************************    54 // *********************************************************************** 
55 // objects_embeded *******************************************************   55 // objects_embeded *******************************************************
56   56
57 // +----------------------------------------------------   57 // +----------------------------------------------------
58 // 正方形を描く   58 // 正方形を描く
59 // +----------------------------------------------------   59 // +----------------------------------------------------
60 void ic2_FigSquare (float s) {   60 void ic2_FigSquare (float s) {
61   glDisable(GL_LIGHTING);   // 光源によるシェーディングを一旦切る   61   glDisable(GL_LIGHTING);   // 光源によるシェーディングを一旦切る
62   62
63   // 正方形(Z=0の平面内、+/- 0.9)   63   // 正方形(Z=0の平面内、+/- 0.9)
64   glBegin(GL_LINE_LOOP); {   64   glBegin(GL_LINE_LOOP); {
65     glColor3f(1.0, 1.0, 1.0);   65     glColor3f(1.0, 1.0, 1.0);
66     glVertex3f(s * -1, s * -1, 0.0);   66     glVertex3f(s * -1, s * -1, 0.0);
67     glVertex3f(s * +1, s * -1, 0.0);   67     glVertex3f(s * +1, s * -1, 0.0);
68     glVertex3f(s * +1, s * +1, 0.0);   68     glVertex3f(s * +1, s * +1, 0.0);
69     glVertex3f(s * -1, s * +1, 0.0);   69     glVertex3f(s * -1, s * +1, 0.0);
70   } glEnd();   70   } glEnd();
71   71
72   // 3軸   72   // 3軸
73   glBegin(GL_LINES); {   73   glBegin(GL_LINES); {
74     glColor3f(1.0, 0.5, 0.5); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.85, 0.0,  0.0); // X (red)   74     glColor3f(1.0, 0.5, 0.5); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.85, 0.0,  0.0); // X (red)
75     glColor3f(0.5, 1.0, 0.5); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0,  0.70, 0.0); // Y (green)   75     glColor3f(0.5, 1.0, 0.5); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0,  0.70, 0.0); // Y (green)
76     glColor3f(0.5, 0.5, 1.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0,  0.0,  1.0); // Z (blue)   76     glColor3f(0.5, 0.5, 1.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0,  0.0,  1.0); // Z (blue)
77   } glEnd();   77   } glEnd();
78   78
79   glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する   79   glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する
80 }   80 }
81   81
82 // +----------------------------------------------------   82 // +----------------------------------------------------
83 // ティーポットを描く (glutの作り付け関数の1つ)   83 // ティーポットを描く (glutの作り付け関数の1つ)
84 // +----------------------------------------------------   84 // +----------------------------------------------------
85 void ic2_FigSolidTeapot (float s) {   85 void ic2_FigSolidTeapot (float s) {
86   GLfloat obj_ref[] = {1.0, 1.0, 0.3, 1.0}; // teapotの色情報 (DIFFUSE用)   86   GLfloat obj_ref[] = {1.0, 1.0, 0.3, 1.0}; // teapotの色情報 (DIFFUSE用)
87   GLfloat obj_shn[] = {10.0};               // teapotの色情報 (SHININESS用)   87   GLfloat obj_shn[] = {10.0};               // teapotの色情報 (SHININESS用)
88   88
89   // 色の設定   89   // 色の設定
90   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, obj_ref);   90   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, obj_ref);
91   glMaterialfv(GL_FRONT, GL_SHININESS, obj_shn);   91   glMaterialfv(GL_FRONT, GL_SHININESS, obj_shn);
92   92
93   glutSolidTeapot(s);   93   glutSolidTeapot(s);
94 }   94 }
95   95
96 // ***********************************************************************    96 // *********************************************************************** 
97 // lighting **************************************************************    97 // lighting ************************************************************** 
98   98
99 // +----------------------------------------------------   99 // +----------------------------------------------------
100 // 光源を用意   100 // 光源を用意
101 // +----------------------------------------------------   101 // +----------------------------------------------------
102 //  X     Y     Z     Diff(R,G,B)   Spec(R,G,B)   102 //  X     Y     Z     Diff(R,G,B)   Spec(R,G,B)
103 //  1.0   2.0   3.0   0.2 0.2 0.2   0.4 0.4 0.4   103 //  1.0   2.0   3.0   0.2 0.2 0.2   0.4 0.4 0.4
104 // -1.0   2.0   3.0   0.4 0.4 0.4   0.4 0.4 0.4   104 // -1.0   2.0   3.0   0.4 0.4 0.4   0.4 0.4 0.4
105 //  0.0   4.0   0.0   1.0 1.0 1.0   1.0 1.0 1.0   105 //  0.0   4.0   0.0   1.0 1.0 1.0   1.0 1.0 1.0
106 void ic2_LightSetA (void) {   106 void ic2_LightSetA (void) {
107   static int initflag = 0;   107   static int initflag = 0;
108   108
109   if (initflag == 0) {   109   if (initflag == 0) {
110     glEnable(GL_DEPTH_TEST); // デプスバッファによる描画を行う   110     glEnable(GL_DEPTH_TEST); // デプスバッファによる描画を行う
111     glEnable(GL_NORMALIZE);  // 法線ベクトルを常に正規化して解釈させる   111     glEnable(GL_NORMALIZE);  // 法線ベクトルを常に正規化して解釈させる
112     glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する   112     glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する
113     glEnable(GL_LIGHT0);     // LIGHT0 を利用   113     glEnable(GL_LIGHT0);     // LIGHT0 を利用
114     glEnable(GL_LIGHT1);     // LIGHT1 を利用   114     glEnable(GL_LIGHT1);     // LIGHT1 を利用
115     glEnable(GL_LIGHT2);     // LIGHT2 を利用   115     glEnable(GL_LIGHT2);     // LIGHT2 を利用
116     initflag = 1;   116     initflag = 1;
117   }   117   }
118      118   
119   GLfloat val[4];   119   GLfloat val[4];
120   120
121   val[0] =  1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_POSITION, val);   121   val[0] =  1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_POSITION, val);
122   val[0] =  0.2; val[1] =  0.2; val[2] =  0.2; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_DIFFUSE,  val);   122   val[0] =  0.2; val[1] =  0.2; val[2] =  0.2; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_DIFFUSE,  val);
123   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_SPECULAR, val);   123   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_SPECULAR, val);
124   124
125   val[0] = -1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_POSITION, val);   125   val[0] = -1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_POSITION, val);
126   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_DIFFUSE,  val);   126   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_DIFFUSE,  val);
127   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_SPECULAR, val);   127   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_SPECULAR, val);
128   128
129   val[0] =  0.0; val[1] =  4.0; val[2] =  0.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_POSITION, val);   129   val[0] =  0.0; val[1] =  4.0; val[2] =  0.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_POSITION, val);
130   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_DIFFUSE,  val);   130   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_DIFFUSE,  val);
131   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_SPECULAR, val);   131   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_SPECULAR, val);
132 }   132 }
133   133
134 // ***********************************************************************    134 // *********************************************************************** 
135 // camera work ***********************************************************   135 // camera work ***********************************************************
136   136
137 // +----------------------------------------------------   137 // +----------------------------------------------------
138 // カメラの投影行列を設定   138 // カメラの投影行列を設定
139 // +----------------------------------------------------   139 // +----------------------------------------------------
140 // 利用する大域変数: window_w, window_h   140 // 利用する大域変数: window_w, window_h
141 // window_w/window_hの変化に対して、物体の見かけの大きさが変わらないように描画   141 // window_w/window_hの変化に対して、物体の見かけの大きさが変わらないように描画
142 // → ortho_unit が重要!   142 // → ortho_unit が重要!
143 //   143 //
144 void ic2_SetUpCamera_Ortho (void) {   144 void ic2_SetUpCamera_Ortho (void) {
145   float wlimit, hlimit;   145   float wlimit, hlimit;
146   wlimit = (window_w/2) / ortho_unit;    146   wlimit = (window_w/2) / ortho_unit; 
147   hlimit = (window_h/2) / ortho_unit;    147   hlimit = (window_h/2) / ortho_unit; 
148   148
149   // glOrtho(左端, 右端, 下端, 上端, 近接側クリッピング面,  遠方側クリッピング面)   149   // glOrtho(左端, 右端, 下端, 上端, 近接側クリッピング面,  遠方側クリッピング面)
150   glMatrixMode(GL_PROJECTION);   150   glMatrixMode(GL_PROJECTION);
      151   glLoadIdentity(); // 毎フレーム再設定するのでPROJECTION行列スタックトップの初期化が必要に
151   glOrtho(-wlimit, wlimit, -hlimit, hlimit, -1.0, 1.0);   152   glOrtho(-wlimit, wlimit, -hlimit, hlimit, -1.0, 1.0);
152   glMatrixMode(GL_MODELVIEW);   153   glMatrixMode(GL_MODELVIEW);
153 }   154 }
154   155
155 // ***********************************************************************    156 // *********************************************************************** 
156 // rendering *************************************************************   157 // rendering *************************************************************
157   158
158 // +----------------------------------------------------   159 // +----------------------------------------------------
159 // スクリーンに描画する   160 // スクリーンに描画する
160 // +----------------------------------------------------   161 // +----------------------------------------------------
161 void ic2_DrawFrame (void) {   162 void ic2_DrawFrame (void) {
162   static int initflag = 0;      
163   163
164   // (前処理) 以前にglClearColor()で指定した色で塗り潰す   164   // (前処理) 以前にglClearColor()で指定した色で塗り潰す
165   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    165   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
      166   // (前処理) 今回CGを描画する範囲
      167   glViewport(0, 0, window_w, window_h);
166   168
167   // (1) カメラの設置 [初回のみ]   169   // (1) カメラの設置
168   if (initflag == 0) {   170   ic2_SetUpCamera_Ortho();
169     ic2_SetUpCamera_Ortho();      
170     initflag = 1;      
171   }      
172   171
173   // (2) 光源の設置   172   // (2) 光源の設置
174   ic2_LightSetA();   173   ic2_LightSetA();
175   174
176   // (3) 物体の設置   175   // (3) 物体の設置
177   // 物体描画:正方形   176   // 物体描画:正方形
178   ic2_FigSquare(0.9);   177   ic2_FigSquare(0.9);
179   // 物体描画:ティーポット   178   // 物体描画:ティーポット
180   ic2_FigSolidTeapot(0.5);   179   ic2_FigSolidTeapot(0.5);
181   180
182   // (後処理) スクリーンの切り替え   181   // (後処理) スクリーンの切り替え
183   glutSwapBuffers();   182   glutSwapBuffers();
184   183
185 }   184 }
186   185
187 // ***********************************************************************    186 // *********************************************************************** 
188 // callbacks *************************************************************    187 // callbacks ************************************************************* 
189   188
190 // +----------------------------------------------------   189 // +----------------------------------------------------
191 // キーが何か押されたときの対策用関数    190 // キーが何か押されたときの対策用関数 
192 // +----------------------------------------------------   191 // +----------------------------------------------------
193 // glutKeyboardFunc()にて登録予定   192 // glutKeyboardFunc()にて登録予定
194 // 引数 : key ... 入力文字    193 // 引数 : key ... 入力文字 
195 // 引数 : x   ... 文字が押されたときのマウスカーソルのX位置    194 // 引数 : x   ... 文字が押されたときのマウスカーソルのX位置 
196 // 引数 : y   ... 文字が押されたときのマウスカーソルのY位置    195 // 引数 : y   ... 文字が押されたときのマウスカーソルのY位置 
197 void ic2_NormalKeyInput (unsigned char key, int x, int y) {   196 void ic2_NormalKeyInput (unsigned char key, int x, int y) {
198   float delta_t = 0.1; // [unit]   197   float delta_t = 0.1; // [unit]
199   float delta_r = 1.0; // [degree]   198   float delta_r = 1.0; // [degree]
200   199
201   switch (key) {   200   switch (key) {
202   case 'q' :   201   case 'q' :
203   case 'Q' :   202   case 'Q' :
204   case 27 : // ESCキーのこと   203   case 27 : // ESCキーのこと
205     exit (0);   204     exit (0);
206     break;   205     break;
207   206
208   // Translation -_+ : [X]h_l [Y]n_u [Z]j_k   207   // Translation -_+ : [X]h_l [Y]n_u [Z]j_k
209   case 'h': glTranslatef(delta_t * -1, 0, 0); break;   208   case 'h': glTranslatef(delta_t * -1, 0, 0); break;
210   case 'l': glTranslatef(delta_t * +1, 0, 0); break;   209   case 'l': glTranslatef(delta_t * +1, 0, 0); break;
211   case 'n': glTranslatef(0, delta_t * -1, 0); break;   210   case 'n': glTranslatef(0, delta_t * -1, 0); break;
212   case 'u': glTranslatef(0, delta_t * +1, 0); break;   211   case 'u': glTranslatef(0, delta_t * +1, 0); break;
213   case 'j': glTranslatef(0, 0, delta_t * -1); break;   212   case 'j': glTranslatef(0, 0, delta_t * -1); break;
214   case 'k': glTranslatef(0, 0, delta_t * +1); break;   213   case 'k': glTranslatef(0, 0, delta_t * +1); break;
215   214
216   // Rotation -_+ : [Y]a_f [Z]s_d [X]x_w   215   // Rotation -_+ : [Y]a_f [Z]s_d [X]x_w
217   case 'x': glRotatef(delta_r * -1, 1, 0, 0); break;   216   case 'x': glRotatef(delta_r * -1, 1, 0, 0); break;
218   case 'w': glRotatef(delta_r * +1, 1, 0, 0); break;   217   case 'w': glRotatef(delta_r * +1, 1, 0, 0); break;
219   case 'a': glRotatef(delta_r * -1, 0, 1, 0); break;   218   case 'a': glRotatef(delta_r * -1, 0, 1, 0); break;
220   case 'f': glRotatef(delta_r * +1, 0, 1, 0); break;   219   case 'f': glRotatef(delta_r * +1, 0, 1, 0); break;
221   case 's': glRotatef(delta_r * -1, 0, 0, 1); break;   220   case 's': glRotatef(delta_r * -1, 0, 0, 1); break;
222   case 'd': glRotatef(delta_r * +1, 0, 0, 1); break;   221   case 'd': glRotatef(delta_r * +1, 0, 0, 1); break;
223   222
224   // [Scale] v_b   223   // [Scale] v_b
225   case 'v': glScalef(0.95, 0.95, 0.95); break;   224   case 'v': glScalef(0.95, 0.95, 0.95); break;
226   case 'b': glScalef(1.05, 1.05, 1.05); break;   225   case 'b': glScalef(1.05, 1.05, 1.05); break;
227   226
228   // [Reset]    227   // [Reset] 
229   case 'R':    228   case 'R': 
230     glMatrixMode(GL_MODELVIEW);   229     glMatrixMode(GL_MODELVIEW);
231     glPopMatrix(); // 保護されてた第1階層に降りる   230     glPopMatrix(); // 保護されてた第1階層に降りる
232     glPushMatrix(); // 保護されてた第1階層からコピーしてスタックトップを1つ上げる   231     glPushMatrix(); // 保護されてた第1階層からコピーしてスタックトップを1つ上げる
233     break;   232     break;
234   233
235   // [Show Stacktop MODELVIEW Matrix]   234   // [Show Stacktop MODELVIEW Matrix]
236   case 'p':   235   case 'p':
237     ic2_ShowMATRIX("Current status");   236     ic2_ShowMATRIX("Current status");
238     break;   237     break;
239   238
240   }   239   }
241   240
242   // 次のメインループ(glutMainLoop)での繰り返し時に描画を要求   241   // 次のメインループ(glutMainLoop)での繰り返し時に描画を要求
243   glutPostWindowRedisplay(window_id);   242   glutPostWindowRedisplay(window_id);
244 }   243 }
245   244
246 // +----------------------------------------------------   245 // +----------------------------------------------------
247 // ウィンドウサイズの変更が生じたときの対策用関数   246 // ウィンドウサイズの変更が生じたときの対策用関数
248 // +----------------------------------------------------   247 // +----------------------------------------------------
249 // glutReshapeFunc()にて登録   248 // glutReshapeFunc()にて登録
250 void ic2_ReshapeWindow (int w, int h) {   249 void ic2_ReshapeWindow (int w, int h) {
251   250
      251   // 新しいウィンドウサイズを大域変数にセット
      252   window_w = w; window_h = h;
      253
252   // 次のメインループ(glutMainLoop)での繰り返し時に描画を要求   254   // 次のメインループ(glutMainLoop)での繰り返し時に描画を要求
253   glutPostWindowRedisplay(window_id);   255   glutPostWindowRedisplay(window_id);
254 }   256 }
255   257
256 // +----------------------------------------------------   258 // +----------------------------------------------------
257 // OpenGLとしてのWindowの初期化   259 // OpenGLとしてのWindowの初期化
258 // +----------------------------------------------------   260 // +----------------------------------------------------
259 void ic2_BootWindow (char winname[]) {   261 void ic2_BootWindow (char winname[]) {
260   262
261   // ダブルバッファ,RGB表色モード,デプスバッファ を利用   263   // ダブルバッファ,RGB表色モード,デプスバッファ を利用
262   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);    264   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
263   265
264   // ウィンドウの大きさ   266   // ウィンドウの大きさ
265   glutInitWindowSize(window_w, window_h);   267   glutInitWindowSize(window_w, window_h);
266   268
267   // ウィンドウを開く   269   // ウィンドウを開く
268   window_id = glutCreateWindow(winname);   270   window_id = glutCreateWindow(winname);
269   271
270   // レンダリングにはSmooth Shadingを採用   272   // レンダリングにはSmooth Shadingを採用
271   glShadeModel(GL_SMOOTH);   273   glShadeModel(GL_SMOOTH);
272   274
273   // ウィンドウ全体を書き直すときの色(ここでは黒)   275   // ウィンドウ全体を書き直すときの色(ここでは黒)
274   glClearColor(0.0, 0.0, 0.0, 0.0);   276   glClearColor(0.0, 0.0, 0.0, 0.0);
275   277
276   // 初期MODELVIEW matrixの保護   278   // 初期MODELVIEW matrixの保護
277   glMatrixMode(GL_MODELVIEW);    279   glMatrixMode(GL_MODELVIEW); 
278   glPushMatrix(); // 以後本プログラムでは GL_MODELVIEW スタックの2層目以上で作業   280   glPushMatrix(); // 以後本プログラムでは GL_MODELVIEW スタックの2層目以上で作業
279   281
280   // Callback関数を設定 (イベント処理)   282   // Callback関数を設定 (イベント処理)
281   glutIdleFunc(ic2_DrawFrame); // 暇だったらフレームを描く(よい実装ではない)   283   glutIdleFunc(ic2_DrawFrame); // 暇だったらフレームを描く(よい実装ではない)
282   glutKeyboardFunc(ic2_NormalKeyInput); // キーが押されたときの対策   284   glutKeyboardFunc(ic2_NormalKeyInput); // キーが押されたときの対策
283   glutReshapeFunc(ic2_ReshapeWindow); // ウィンドウサイズ変更が検知されたときの対策   285   glutReshapeFunc(ic2_ReshapeWindow); // ウィンドウサイズ変更が検知されたときの対策
284 }   286 }
285   287
286 // ***********************************************************************    288 // *********************************************************************** 
287 // main  *****************************************************************   289 // main  *****************************************************************
288 // +----------------------------------------------------   290 // +----------------------------------------------------
289 // Main Function   291 // Main Function
290 // +----------------------------------------------------   292 // +----------------------------------------------------
291 int main (int argc, char *argv[]) {   293 int main (int argc, char *argv[]) {
292   294
293   // glutライブラリによる引数の解釈   295   // glutライブラリによる引数の解釈
294   glutInit(&argc, argv);   296   glutInit(&argc, argv);
295   297
296   // OpenGL Window の初期化   298   // OpenGL Window の初期化
297   ic2_BootWindow(argv[0]);   299   ic2_BootWindow(argv[0]);
298   300
299   // 無限ループの開始   301   // 無限ループの開始
300   glutMainLoop();   302   glutMainLoop();
301      303   
302   return 0;   304   return 0;
303 }   305 }

Generated by kameda[at]iit.tsukuba.ac.jp