Modified lines:  6, 7
Added line:  9, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 125, 126, 127, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 187, 188, 189, 190
Removed line:  None
Generated by diff2html.pl
© Yves Bailly, MandrakeSoft S.A. 2001, Ryohei Morita 2007
diff2html.pl is licensed under the GNU GPL.

  34-GoodTeaPod.c     35-MoveTheWorld.c
  157 lines
5661 bytes
Last modified : Mon Oct 24 12:24:40 2011

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

Generated by diff2html.pl on Mon Oct 24 12:33:33 2011
Command-line:
/home/ubuntu/scripts/diff2html.pl 34-GoodTeaPod.c 35-MoveTheWorld.c