Modified lines:  6, 12, 13, 20, 126
Added line:  122, 128, 129, 130, 131, 132, 135, 136, 137, 138, 193
Removed line:  None
Generated by diff2html.pl
© Yves Bailly, MandrakeSoft S.A. 2001, Ryohei Morita 2007
diff2html.pl is licensed under the GNU GPL.

  ../106-6/106-6-ShowXYZ.c     107-6-MoveObjectOnly.c
  238 lines
9084 bytes
Last modified : Mon Nov 7 11:49:06 2011

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

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