Modified lines:  6, 14, 22, 46, 47, 211
Added line:  47, 53, 54, 55, 56, 57, 58, 59, 60
Removed line:  7, 8
Generated by diff2html.pl
© Yves Bailly, MandrakeSoft S.A. 2001, Ryohei Morita 2007
diff2html.pl is licensed under the GNU GPL.

  ../106-5/106-5-MoveTheWorld.c     106-6-ShowXYZ.c
  231 lines
8857 bytes
Last modified : Mon Nov 7 11:49:16 2011

    238 lines
9084 bytes
Last modified : Mon Nov 7 11:49:06 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/10/31 kameda[at]iit.tsukuba.ac.jp   5 // 2011/10/31 kameda[at]iit.tsukuba.ac.jp
6 // 6.5 (old-3.5). Move "the world" in which objects are placed   6 // 6.6 X,Y,Z軸を線オブジェクトとして表示
7 //      カメラは固定のままであることに注意      
8 //      6.5に節番号変えた際に、コードのコメント部修正      
9   7
10 #include <stdio.h>   8 #include <stdio.h>
11 #include <stdlib.h> // exit()   9 #include <stdlib.h> // exit()
12 #include <GL/glut.h>   10 #include <GL/glut.h>
13   11
14 // ***********************************************************************    12 // ***********************************************************************
15 // global variables ******************************************************   13 // global variables ******************************************************
16   14
17 // +----------------------------------------------------   15 // +----------------------------------------------------
18 // Global Variables   16 // Global Variables
19 // +----------------------------------------------------   17 // +----------------------------------------------------
20   18
21 // ***********************************************************************    19 // *********************************************************************** 
22 // glutilitiess **********************************************************   20 // gl utilitiess *********************************************************
23   21
24 // +----------------------------------------------------   22 // +----------------------------------------------------
25 // MODELVIEW Matrix を表示する   23 // MODELVIEW Matrix を表示する
26 // +----------------------------------------------------   24 // +----------------------------------------------------
27 void ic2_ShowMODELVIEW (void) {   25 void ic2_ShowMODELVIEW (void) {
28   GLfloat mvm[16];   26   GLfloat mvm[16];
29   27
30   glGetFloatv(GL_MODELVIEW_MATRIX, mvm); // MODELVIEWのスタックトップmatrixをmvmにコピー   28   glGetFloatv(GL_MODELVIEW_MATRIX, mvm); // MODELVIEWのスタックトップmatrixをmvmにコピー
31   printf("MODELVIEW Matrix\n");   29   printf("MODELVIEW Matrix\n");
32   printf("%7.3f  %7.3f  %7.3f  %7.3f\n", mvm[ 0], mvm[ 4], mvm[ 8], mvm[12]);   30   printf("%7.3f  %7.3f  %7.3f  %7.3f\n", mvm[ 0], mvm[ 4], mvm[ 8], mvm[12]);
33   printf("%7.3f  %7.3f  %7.3f  %7.3f\n", mvm[ 1], mvm[ 5], mvm[ 9], mvm[13]);   31   printf("%7.3f  %7.3f  %7.3f  %7.3f\n", mvm[ 1], mvm[ 5], mvm[ 9], mvm[13]);
34   printf("%7.3f  %7.3f  %7.3f  %7.3f\n", mvm[ 2], mvm[ 6], mvm[10], mvm[14]);   32   printf("%7.3f  %7.3f  %7.3f  %7.3f\n", mvm[ 2], mvm[ 6], mvm[10], mvm[14]);
35   printf("%7.3f  %7.3f  %7.3f  %7.3f\n", mvm[ 3], mvm[ 7], mvm[11], mvm[15]);   33   printf("%7.3f  %7.3f  %7.3f  %7.3f\n", mvm[ 3], mvm[ 7], mvm[11], mvm[15]);
36 }   34 }
37   35
38 // ***********************************************************************    36 // *********************************************************************** 
39 // objects_embeded *******************************************************   37 // objects_embeded *******************************************************
40   38
41 // +----------------------------------------------------   39 // +----------------------------------------------------
42 // 正方形を描く   40 // 正方形を描く
43 // +----------------------------------------------------   41 // +----------------------------------------------------
44 void ic2_FigSquare (float s) {   42 void ic2_FigSquare (float s) {
45   glDisable(GL_LIGHTING);   // 光源によるシェーディングを一旦切る   43   glDisable(GL_LIGHTING);   // 光源によるシェーディングを一旦切る
46   glColor3f(1.0, 1.0, 1.0);   44
47   glLineWidth(1.0);   45   // 正方形(Z=0の平面内、+/- 0.9)
48   glBegin(GL_LINE_LOOP); {   46   glBegin(GL_LINE_LOOP); {
      47     glColor3f(1.0, 1.0, 1.0);
49     glVertex3f(s * -1, s * -1, 0.0);   48     glVertex3f(s * -1, s * -1, 0.0);
50     glVertex3f(s * +1, s * -1, 0.0);   49     glVertex3f(s * +1, s * -1, 0.0);
51     glVertex3f(s * +1, s * +1, 0.0);   50     glVertex3f(s * +1, s * +1, 0.0);
52     glVertex3f(s * -1, s * +1, 0.0);   51     glVertex3f(s * -1, s * +1, 0.0);
53   } glEnd();   52   } glEnd();
      53
      54   // 3軸
      55   glBegin(GL_LINES); {
      56     glColor3f(1.0, 0.5, 0.5); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.85, 0.0,  0.0); // X (red)
      57     glColor3f(0.5, 1.0, 0.5); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0,  0.70, 0.0); // Y (green)
      58     glColor3f(0.5, 0.5, 1.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0,  0.0,  1.0); // Z (blue)
      59   } glEnd();
      60
54   glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する   61   glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する
55 }   62 }
56   63
57 // +----------------------------------------------------   64 // +----------------------------------------------------
58 // ティーポットを描く (glutの作り付け関数の1つ)   65 // ティーポットを描く (glutの作り付け関数の1つ)
59 // +----------------------------------------------------   66 // +----------------------------------------------------
60 void ic2_FigSolidTeapot (float s) {   67 void ic2_FigSolidTeapot (float s) {
61   GLfloat obj_ref[] = {1.0, 1.0, 0.3, 1.0}; // teapotの色情報 (DIFFUSE用)   68   GLfloat obj_ref[] = {1.0, 1.0, 0.3, 1.0}; // teapotの色情報 (DIFFUSE用)
62   GLfloat obj_shn[] = {10.0};               // teapotの色情報 (SHININESS用)   69   GLfloat obj_shn[] = {10.0};               // teapotの色情報 (SHININESS用)
63   70
64   // 色の設定   71   // 色の設定
65   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, obj_ref);   72   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, obj_ref);
66   glMaterialfv(GL_FRONT, GL_SHININESS, obj_shn);   73   glMaterialfv(GL_FRONT, GL_SHININESS, obj_shn);
67   74
68   glutSolidTeapot(s);   75   glutSolidTeapot(s);
69 }   76 }
70   77
71 // ***********************************************************************    78 // *********************************************************************** 
72 // lighting **************************************************************    79 // lighting ************************************************************** 
73   80
74 // +----------------------------------------------------   81 // +----------------------------------------------------
75 // 光源を用意   82 // 光源を用意
76 // +----------------------------------------------------   83 // +----------------------------------------------------
77 //  X     Y     Z     Diff(R,G,B)   Spec(R,G,B)   84 //  X     Y     Z     Diff(R,G,B)   Spec(R,G,B)
78 //  1.0   2.0   3.0   0.2 0.2 0.2   0.4 0.4 0.4   85 //  1.0   2.0   3.0   0.2 0.2 0.2   0.4 0.4 0.4
79 // -1.0   2.0   3.0   0.4 0.4 0.4   0.4 0.4 0.4   86 // -1.0   2.0   3.0   0.4 0.4 0.4   0.4 0.4 0.4
80 //  0.0   4.0   0.0   1.0 1.0 1.0   1.0 1.0 1.0   87 //  0.0   4.0   0.0   1.0 1.0 1.0   1.0 1.0 1.0
81 void ic2_LightSetA (void) {   88 void ic2_LightSetA (void) {
82   static int initflag = 0;   89   static int initflag = 0;
83   90
84   if (initflag == 0) {   91   if (initflag == 0) {
85     glEnable(GL_DEPTH_TEST); // デプスバッファによる描画を行う   92     glEnable(GL_DEPTH_TEST); // デプスバッファによる描画を行う
86     glEnable(GL_NORMALIZE);  // 法線ベクトルを常に正規化して解釈させる   93     glEnable(GL_NORMALIZE);  // 法線ベクトルを常に正規化して解釈させる
87     glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する   94     glEnable(GL_LIGHTING);   // 光源によるシェーディングを開始する
88     glEnable(GL_LIGHT0);     // LIGHT0 を利用   95     glEnable(GL_LIGHT0);     // LIGHT0 を利用
89     glEnable(GL_LIGHT1);     // LIGHT1 を利用   96     glEnable(GL_LIGHT1);     // LIGHT1 を利用
90     glEnable(GL_LIGHT2);     // LIGHT2 を利用   97     glEnable(GL_LIGHT2);     // LIGHT2 を利用
91     initflag = 1;   98     initflag = 1;
92   }   99   }
93      100   
94   GLfloat val[4];   101   GLfloat val[4];
95   102
96   val[0] =  1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_POSITION, val);   103   val[0] =  1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_POSITION, val);
97   val[0] =  0.2; val[1] =  0.2; val[2] =  0.2; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_DIFFUSE,  val);   104   val[0] =  0.2; val[1] =  0.2; val[2] =  0.2; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_DIFFUSE,  val);
98   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_SPECULAR, val);   105   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_SPECULAR, val);
99   106
100   val[0] = -1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_POSITION, val);   107   val[0] = -1.0; val[1] =  2.0; val[2] =  3.0; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_POSITION, val);
101   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_DIFFUSE,  val);   108   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_DIFFUSE,  val);
102   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_SPECULAR, val);   109   val[0] =  0.4; val[1] =  0.4; val[2] =  0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_SPECULAR, val);
103   110
104   val[0] =  0.0; val[1] =  4.0; val[2] =  0.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_POSITION, val);   111   val[0] =  0.0; val[1] =  4.0; val[2] =  0.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_POSITION, val);
105   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_DIFFUSE,  val);   112   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_DIFFUSE,  val);
106   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_SPECULAR, val);   113   val[0] =  1.0; val[1] =  1.0; val[2] =  1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_SPECULAR, val);
107 }   114 }
108 // ***********************************************************************    115 // *********************************************************************** 
109 // rendering *************************************************************   116 // rendering *************************************************************
110   117
111 // +----------------------------------------------------   118 // +----------------------------------------------------
112 // スクリーンに描画する   119 // スクリーンに描画する
113 // +----------------------------------------------------   120 // +----------------------------------------------------
114 void ic2_DrawFrame (void) {   121 void ic2_DrawFrame (void) {
115   122
116   // 以前にglClearColor()で指定した色で塗り潰す   123   // 以前にglClearColor()で指定した色で塗り潰す
117   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    124   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
118   125
119   // ある設定の光源の用意   126   // ある設定の光源の用意
120   ic2_LightSetA();   127   ic2_LightSetA();
121   128
122   // 物体描画:正方形   129   // 物体描画:正方形
123   ic2_FigSquare(0.9);   130   ic2_FigSquare(0.9);
124   // 物体描画:ティーポット   131   // 物体描画:ティーポット
125   ic2_FigSolidTeapot(0.5);   132   ic2_FigSolidTeapot(0.5);
126   133
127   // スクリーンの切り替え   134   // スクリーンの切り替え
128   glutSwapBuffers();   135   glutSwapBuffers();
129   136
130 }   137 }
131   138
132 // ***********************************************************************    139 // *********************************************************************** 
133 // callbacks *************************************************************    140 // callbacks ************************************************************* 
134   141
135 // +----------------------------------------------------   142 // +----------------------------------------------------
136 // キーが何か押されたときの対策用関数    143 // キーが何か押されたときの対策用関数 
137 // +----------------------------------------------------   144 // +----------------------------------------------------
138 // glutKeyboardFunc()にて登録予定   145 // glutKeyboardFunc()にて登録予定
139 // 引数 : key ... 入力文字    146 // 引数 : key ... 入力文字 
140 // 引数 : x   ... 文字が押されたときのマウスカーソルのX位置    147 // 引数 : x   ... 文字が押されたときのマウスカーソルのX位置 
141 // 引数 : y   ... 文字が押されたときのマウスカーソルのY位置    148 // 引数 : y   ... 文字が押されたときのマウスカーソルのY位置 
142 void ic2_NormalKeyInput (unsigned char key, int x, int y) {   149 void ic2_NormalKeyInput (unsigned char key, int x, int y) {
143   float delta_t = 0.1; // [unit]   150   float delta_t = 0.1; // [unit]
144   float delta_r = 1.0; // [degree]   151   float delta_r = 1.0; // [degree]
145   152
146   switch (key) {   153   switch (key) {
147   case 'q' :   154   case 'q' :
148   case 'Q' :   155   case 'Q' :
149   case 27 : // ESCキーのこと   156   case 27 : // ESCキーのこと
150     exit (0);   157     exit (0);
151     break;   158     break;
152   159
153   // Translation -_+ : [X]h_l [Y]n_u [Z]j_k   160   // Translation -_+ : [X]h_l [Y]n_u [Z]j_k
154   case 'h': glTranslatef(delta_t * -1, 0, 0); break;   161   case 'h': glTranslatef(delta_t * -1, 0, 0); break;
155   case 'l': glTranslatef(delta_t * +1, 0, 0); break;   162   case 'l': glTranslatef(delta_t * +1, 0, 0); break;
156   case 'n': glTranslatef(0, delta_t * -1, 0); break;   163   case 'n': glTranslatef(0, delta_t * -1, 0); break;
157   case 'u': glTranslatef(0, delta_t * +1, 0); break;   164   case 'u': glTranslatef(0, delta_t * +1, 0); break;
158   case 'j': glTranslatef(0, 0, delta_t * -1); break;   165   case 'j': glTranslatef(0, 0, delta_t * -1); break;
159   case 'k': glTranslatef(0, 0, delta_t * +1); break;   166   case 'k': glTranslatef(0, 0, delta_t * +1); break;
160   167
161   // Rotation -_+ : [Y]a_f [Z]s_d [X]x_w   168   // Rotation -_+ : [Y]a_f [Z]s_d [X]x_w
162   case 'x': glRotatef(delta_r * -1, 1, 0, 0); break;   169   case 'x': glRotatef(delta_r * -1, 1, 0, 0); break;
163   case 'w': glRotatef(delta_r * +1, 1, 0, 0); break;   170   case 'w': glRotatef(delta_r * +1, 1, 0, 0); break;
164   case 'a': glRotatef(delta_r * -1, 0, 1, 0); break;   171   case 'a': glRotatef(delta_r * -1, 0, 1, 0); break;
165   case 'f': glRotatef(delta_r * +1, 0, 1, 0); break;   172   case 'f': glRotatef(delta_r * +1, 0, 1, 0); break;
166   case 's': glRotatef(delta_r * -1, 0, 0, 1); break;   173   case 's': glRotatef(delta_r * -1, 0, 0, 1); break;
167   case 'd': glRotatef(delta_r * +1, 0, 0, 1); break;   174   case 'd': glRotatef(delta_r * +1, 0, 0, 1); break;
168   175
169   // [Scale] v_b   176   // [Scale] v_b
170   case 'v': glScalef(0.95, 0.95, 0.95); break;   177   case 'v': glScalef(0.95, 0.95, 0.95); break;
171   case 'b': glScalef(1.05, 1.05, 1.05); break;   178   case 'b': glScalef(1.05, 1.05, 1.05); break;
172   179
173   // [Reset]    180   // [Reset] 
174   case 'R':    181   case 'R': 
175     glMatrixMode(GL_MODELVIEW);   182     glMatrixMode(GL_MODELVIEW);
176     glPopMatrix(); // 保護されてた第1階層に降りる   183     glPopMatrix(); // 保護されてた第1階層に降りる
177     glPushMatrix(); // 保護されてた第1階層からコピーしてスタックトップを1つ上げる   184     glPushMatrix(); // 保護されてた第1階層からコピーしてスタックトップを1つ上げる
178     break;   185     break;
179   186
180   // [Show Stacktop MODELVIEW Matrix]   187   // [Show Stacktop MODELVIEW Matrix]
181   case 'p':   188   case 'p':
182     ic2_ShowMODELVIEW();   189     ic2_ShowMODELVIEW();
183     break;   190     break;
184   191
185   }   192   }
186 }   193 }
187   194
188 // +----------------------------------------------------   195 // +----------------------------------------------------
189 // OpenGLとしてのWindowの初期化   196 // OpenGLとしてのWindowの初期化
190 // +----------------------------------------------------   197 // +----------------------------------------------------
191 void ic2_BootWindow (char winname[]) {   198 void ic2_BootWindow (char winname[]) {
192   199
193   // ダブルバッファ,RGB表色モード,デプスバッファ を利用   200   // ダブルバッファ,RGB表色モード,デプスバッファ を利用
194   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);    201   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
195   202
196   // ウィンドウを開く   203   // ウィンドウを開く
197   glutCreateWindow(winname);   204   glutCreateWindow(winname);
198   205
199   // レンダリングにはSmooth Shadingを採用   206   // レンダリングにはSmooth Shadingを採用
200   glShadeModel(GL_SMOOTH);   207   glShadeModel(GL_SMOOTH);
201   208
202   // ウィンドウ全体を書き直すときの色(ここでは黒)   209   // ウィンドウ全体を書き直すときの色(ここでは黒)
203   glClearColor(0.0, 0.0, 0.0, 0.0);   210   glClearColor(0.0, 0.0, 0.0, 0.0);
204   211
205   // 初期MODELVIEW matrixの保護   212   // 初期MODELVIEW matrixの保護
206   glMatrixMode(GL_MODELVIEW);    213   glMatrixMode(GL_MODELVIEW); 
207   glPushMatrix(); // 以後本プログラムでは GL_MODELVIEW スタックの2層目以上で作業   214   glPushMatrix(); // 以後本プログラムでは GL_MODELVIEW スタックの2層目以上で作業
208   215
209   // Callback関数を設定 (イベント処理)   216   // Callback関数を設定 (イベント処理)
210   glutIdleFunc(ic2_DrawFrame); // 暇だったらフレームを描く(よい実装ではない)   217   glutIdleFunc(ic2_DrawFrame); // 暇だったらフレームを描く(よい実装ではない)
211   glutKeyboardFunc(ic2_NormalKeyInput); // キーが押されたときの対策   218   glutKeyboardFunc(ic2_NormalKeyInput); // キーが押されたときの準備
212 }   219 }
213   220
214 // ***********************************************************************    221 // *********************************************************************** 
215 // main  *****************************************************************   222 // main  *****************************************************************
216 // +----------------------------------------------------   223 // +----------------------------------------------------
217 // Main Function   224 // Main Function
218 // +----------------------------------------------------   225 // +----------------------------------------------------
219 int main (int argc, char *argv[]) {   226 int main (int argc, char *argv[]) {
220   227
221   // glutライブラリによる引数の解釈   228   // glutライブラリによる引数の解釈
222   glutInit(&argc, argv);   229   glutInit(&argc, argv);
223   230
224   // OpenGL Window の初期化   231   // OpenGL Window の初期化
225   ic2_BootWindow(argv[0]);   232   ic2_BootWindow(argv[0]);
226   233
227   // 無限ループの開始   234   // 無限ループの開始
228   glutMainLoop();   235   glutMainLoop();
229      236   
230   return 0;   237   return 0;
231 }   238 }

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