|
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 | } |