Modified lines:  6, 12, 252
Added line:  27, 28, 29, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 283
Removed line:  None
Generated by diff2html.pl
© Yves Bailly, MandrakeSoft S.A. 2001, Ryohei Morita 2007
diff2html.pl is licensed under the GNU GPL.

  ../108-1/108-1-Ortho.c     108-2-Viewpoint.c
  286 lines
10979 bytes
Last modified : Sat Nov 12 18:54:57 2011

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

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