| 
 | Generated by diff2html.pl © Yves Bailly, MandrakeSoft S.A. 2001, Ryohei Morita 2007 diff2html.pl is licensed under the GNU GPL. | 
| 33-BadTeaPod.c | 34-GoodTeaPod.c | |||
|---|---|---|---|---|
| 156 lines 5549 bytes Last modified : Mon Oct 24 12:24:47 2011 | 157 lines 5661 bytes Last modified : Mon Oct 24 12:24:40 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.3. Teapod! | 6 | // 3.4. Teapod! | |
| 7 | // でも少しおかしい。特に注ぎ口。 | 7 | // Depth Mapを設定。 | |
| 8 | 8 | |||
| 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 | // +---------------------------------------------------- | 16 | // +---------------------------------------------------- | |
| 17 | // 正方形を描く (白色の線幅 1.0) | 17 | // 正方形を描く (白色の線幅 1.0) | |
| 18 | // +---------------------------------------------------- | 18 | // +---------------------------------------------------- | |
| 19 | void ic2_FigSquare (float s) { | 19 | void ic2_FigSquare (float s) { | |
| 20 | glDisable(GL_LIGHTING); // 光源によるシェーディングを一旦切る | 20 | glDisable(GL_LIGHTING); // 光源によるシェーディングを一旦切る | |
| 21 | glColor3f(1.0, 1.0, 1.0); | 21 | glColor3f(1.0, 1.0, 1.0); | |
| 22 | glLineWidth(1.0); | 22 | glLineWidth(1.0); | |
| 23 | glBegin(GL_LINE_LOOP); { | 23 | glBegin(GL_LINE_LOOP); { | |
| 24 | glVertex3f(s * -1, s * -1, 0.0); | 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 | } glEnd(); | 28 | } glEnd(); | |
| 29 | glEnable(GL_LIGHTING); // 光源によるシェーディングを開始する | 29 | glEnable(GL_LIGHTING); // 光源によるシェーディングを開始する | |
| 30 | } | 30 | } | |
| 31 | 31 | |||
| 32 | // +---------------------------------------------------- | 32 | // +---------------------------------------------------- | |
| 33 | // ティーポットを描く (glutの作り付け関数の1つ) | 33 | // ティーポットを描く (glutの作り付け関数の1つ) | |
| 34 | // +---------------------------------------------------- | 34 | // +---------------------------------------------------- | |
| 35 | void ic2_FigSolidTeapot (float s) { | 35 | void ic2_FigSolidTeapot (float s) { | |
| 36 | GLfloat obj_ref[] = {1.0, 1.0, 0.3, 1.0}; // teapotの色情報 (DIFFUSE用) | 36 | GLfloat obj_ref[] = {1.0, 1.0, 0.3, 1.0}; // teapotの色情報 (DIFFUSE用) | |
| 37 | GLfloat obj_shn[] = {10.0}; // teapotの色情報 (SHININESS用) | 37 | GLfloat obj_shn[] = {10.0}; // teapotの色情報 (SHININESS用) | |
| 38 | 38 | |||
| 39 | // 色の設定 | 39 | // 色の設定 | |
| 40 | glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, obj_ref); | 40 | glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, obj_ref); | |
| 41 | glMaterialfv(GL_FRONT, GL_SHININESS, obj_shn); | 41 | glMaterialfv(GL_FRONT, GL_SHININESS, obj_shn); | |
| 42 | 42 | |||
| 43 | glutSolidTeapot(s); | 43 | glutSolidTeapot(s); | |
| 44 | } | 44 | } | |
| 45 | 45 | |||
| 46 | // +---------------------------------------------------- | 46 | // +---------------------------------------------------- | |
| 47 | // 光源を用意 | 47 | // 光源を用意 | |
| 48 | // +---------------------------------------------------- | 48 | // +---------------------------------------------------- | |
| 49 | // X Y Z Diff(R,G,B) Spec(R,G,B) | 49 | // 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 | 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.4 0.4 0.4 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 | // 0.0 4.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 | 52 | // 0.0 4.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 | |
| 53 | void ic2_LightSetA (void) { | 53 | void ic2_LightSetA (void) { | |
| 54 | static int initflag = 0; | 54 | static int initflag = 0; | |
| 55 | 55 | |||
| 56 | if (initflag == 0) { | 56 | if (initflag == 0) { | |
| 57 | glEnable(GL_DEPTH_TEST); // デプスバッファによる描画を行う | |||
| 57 | glEnable(GL_NORMALIZE); // 法線ベクトルを常に正規化して解釈させる | 58 | glEnable(GL_NORMALIZE); // 法線ベクトルを常に正規化して解釈させる | |
| 58 | glEnable(GL_LIGHTING); // 光源によるシェーディングを開始する | 59 | glEnable(GL_LIGHTING); // 光源によるシェーディングを開始する | |
| 59 | glEnable(GL_LIGHT0); // LIGHT0 を利用 | 60 | glEnable(GL_LIGHT0); // LIGHT0 を利用 | |
| 60 | glEnable(GL_LIGHT1); // LIGHT1 を利用 | 61 | glEnable(GL_LIGHT1); // LIGHT1 を利用 | |
| 61 | glEnable(GL_LIGHT2); // LIGHT2 を利用 | 62 | glEnable(GL_LIGHT2); // LIGHT2 を利用 | |
| 62 | initflag = 1; | 63 | initflag = 1; | |
| 63 | } | 64 | } | |
| 64 | 65 | |||
| 65 | GLfloat val[4]; | 66 | GLfloat val[4]; | |
| 66 | 67 | |||
| 67 | val[0] = 1.0; val[1] = 2.0; val[2] = 3.0; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_POSITION, val); | 68 | val[0] = 1.0; val[1] = 2.0; val[2] = 3.0; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_POSITION, val); | |
| 68 | val[0] = 0.2; val[1] = 0.2; val[2] = 0.2; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_DIFFUSE, val); | 69 | val[0] = 0.2; val[1] = 0.2; val[2] = 0.2; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_DIFFUSE, val); | |
| 69 | val[0] = 0.4; val[1] = 0.4; val[2] = 0.4; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_SPECULAR, val); | 70 | val[0] = 0.4; val[1] = 0.4; val[2] = 0.4; val[3] = 1.0; glLightfv(GL_LIGHT0, GL_SPECULAR, val); | |
| 70 | 71 | |||
| 71 | val[0] = -1.0; val[1] = 2.0; val[2] = 3.0; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_POSITION, val); | 72 | val[0] = -1.0; val[1] = 2.0; val[2] = 3.0; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_POSITION, val); | |
| 72 | val[0] = 0.4; val[1] = 0.4; val[2] = 0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_DIFFUSE, val); | 73 | val[0] = 0.4; val[1] = 0.4; val[2] = 0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_DIFFUSE, val); | |
| 73 | val[0] = 0.4; val[1] = 0.4; val[2] = 0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_SPECULAR, val); | 74 | val[0] = 0.4; val[1] = 0.4; val[2] = 0.4; val[3] = 1.0; glLightfv(GL_LIGHT1, GL_SPECULAR, val); | |
| 74 | 75 | |||
| 75 | val[0] = 0.0; val[1] = 4.0; val[2] = 0.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_POSITION, val); | 76 | val[0] = 0.0; val[1] = 4.0; val[2] = 0.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_POSITION, val); | |
| 76 | val[0] = 1.0; val[1] = 1.0; val[2] = 1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_DIFFUSE, val); | 77 | val[0] = 1.0; val[1] = 1.0; val[2] = 1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_DIFFUSE, val); | |
| 77 | val[0] = 1.0; val[1] = 1.0; val[2] = 1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_SPECULAR, val); | 78 | val[0] = 1.0; val[1] = 1.0; val[2] = 1.0; val[3] = 1.0; glLightfv(GL_LIGHT2, GL_SPECULAR, val); | |
| 78 | } | 79 | } | |
| 79 | 80 | |||
| 80 | // +---------------------------------------------------- | 81 | // +---------------------------------------------------- | |
| 81 | // スクリーンに描画する | 82 | // スクリーンに描画する | |
| 82 | // +---------------------------------------------------- | 83 | // +---------------------------------------------------- | |
| 83 | void ic2_DrawFrame (void) { | 84 | void ic2_DrawFrame (void) { | |
| 84 | 85 | |||
| 85 | // 以前にglClearColor()で指定した色で塗り潰す | 86 | // 以前にglClearColor()で指定した色で塗り潰す | |
| 86 | glClear(GL_COLOR_BUFFER_BIT); | 87 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
| 87 | 88 | |||
| 88 | // ある設定の光源の用意 | 89 | // ある設定の光源の用意 | |
| 89 | ic2_LightSetA(); | 90 | ic2_LightSetA(); | |
| 90 | 91 | |||
| 91 | // 物体描画:正方形 | 92 | // 物体描画:正方形 | |
| 92 | ic2_FigSquare(0.9); | 93 | ic2_FigSquare(0.9); | |
| 93 | // 物体描画:ティーポット | 94 | // 物体描画:ティーポット | |
| 94 | ic2_FigSolidTeapot(0.5); | 95 | ic2_FigSolidTeapot(0.5); | |
| 95 | 96 | |||
| 96 | // スクリーンの切り替え | 97 | // スクリーンの切り替え | |
| 97 | glutSwapBuffers(); | 98 | glutSwapBuffers(); | |
| 98 | 99 | |||
| 99 | } | 100 | } | |
| 100 | 101 | |||
| 101 | // +---------------------------------------------------- | 102 | // +---------------------------------------------------- | |
| 102 | // キーが何か押されたときの対策用関数 | 103 | // キーが何か押されたときの対策用関数 | |
| 103 | // +---------------------------------------------------- | 104 | // +---------------------------------------------------- | |
| 104 | // glutKeyboardFunc()にて登録予定 | 105 | // glutKeyboardFunc()にて登録予定 | |
| 105 | // 引数 : key ... 入力文字 | 106 | // 引数 : key ... 入力文字 | |
| 106 | // 引数 : x ... 文字が押されたときのマウスカーソルのX位置 | 107 | // 引数 : x ... 文字が押されたときのマウスカーソルのX位置 | |
| 107 | // 引数 : y ... 文字が押されたときのマウスカーソルのY位置 | 108 | // 引数 : y ... 文字が押されたときのマウスカーソルのY位置 | |
| 108 | void ic2_NormalKeyInput (unsigned char key, int x, int y) { | 109 | void ic2_NormalKeyInput (unsigned char key, int x, int y) { | |
| 109 | switch (key) { | 110 | switch (key) { | |
| 110 | case 'q' : | 111 | case 'q' : | |
| 111 | case 'Q' : | 112 | case 'Q' : | |
| 112 | case 27 : // ESCキーのこと | 113 | case 27 : // ESCキーのこと | |
| 113 | exit (0); | 114 | exit (0); | |
| 114 | break; | 115 | break; | |
| 115 | } | 116 | } | |
| 116 | } | 117 | } | |
| 117 | 118 | |||
| 118 | // +---------------------------------------------------- | 119 | // +---------------------------------------------------- | |
| 119 | // OpenGLとしてのWindowの初期化 | 120 | // OpenGLとしてのWindowの初期化 | |
| 120 | // +---------------------------------------------------- | 121 | // +---------------------------------------------------- | |
| 121 | void ic2_BootWindow (char winname[]) { | 122 | void ic2_BootWindow (char winname[]) { | |
| 122 | 123 | |||
| 123 | // ダブルバッファ,RGB表色モード を利用 | 124 | // ダブルバッファ,RGB表色モード,デプスバッファ を利用 | |
| 124 | glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); | 125 | glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); | |
| 125 | 126 | |||
| 126 | // ウィンドウを開く | 127 | // ウィンドウを開く | |
| 127 | glutCreateWindow(winname); | 128 | glutCreateWindow(winname); | |
| 128 | 129 | |||
| 129 | // レンダリングにはSmooth Shadingを採用 | 130 | // レンダリングにはSmooth Shadingを採用 | |
| 130 | glShadeModel(GL_SMOOTH); | 131 | glShadeModel(GL_SMOOTH); | |
| 131 | 132 | |||
| 132 | // ウィンドウ全体を書き直すときの色(ここでは黒) | 133 | // ウィンドウ全体を書き直すときの色(ここでは黒) | |
| 133 | glClearColor(0.0, 0.0, 0.0, 0.0); | 134 | glClearColor(0.0, 0.0, 0.0, 0.0); | |
| 134 | 135 | |||
| 135 | // Callback関数を設定 (イベント処理) | 136 | // Callback関数を設定 (イベント処理) | |
| 136 | glutIdleFunc(ic2_DrawFrame); // 暇だったらフレームを描く(よい実装ではない) | 137 | glutIdleFunc(ic2_DrawFrame); // 暇だったらフレームを描く(よい実装ではない) | |
| 137 | glutKeyboardFunc(ic2_NormalKeyInput); // キーが押されたときの準備 | 138 | glutKeyboardFunc(ic2_NormalKeyInput); // キーが押されたときの準備 | |
| 138 | } | 139 | } | |
| 139 | 140 | |||
| 140 | //d main.c ********************************************************************** | 141 | //d main.c ********************************************************************** | |
| 141 | // +---------------------------------------------------- | 142 | // +---------------------------------------------------- | |
| 142 | // Main Function | 143 | // Main Function | |
| 143 | // +---------------------------------------------------- | 144 | // +---------------------------------------------------- | |
| 144 | int main (int argc, char *argv[]) { | 145 | int main (int argc, char *argv[]) { | |
| 145 | 146 | |||
| 146 | // glutライブラリによる引数の解釈 | 147 | // glutライブラリによる引数の解釈 | |
| 147 | glutInit(&argc, argv); | 148 | glutInit(&argc, argv); | |
| 148 | 149 | |||
| 149 | // OpenGL Window の初期化 | 150 | // OpenGL Window の初期化 | |
| 150 | ic2_BootWindow(argv[0]); | 151 | ic2_BootWindow(argv[0]); | |
| 151 | 152 | |||
| 152 | // 無限ループの開始 | 153 | // 無限ループの開始 | |
| 153 | glutMainLoop(); | 154 | glutMainLoop(); | |
| 154 | 155 | |||
| 155 | return 0; | 156 | return 0; | |
| 156 | } | 157 | } |