質問編集履歴
1
ソースコードは今回の問題とは関係なかったためみやすさUPすべく削除
test
CHANGED
File without changes
|
test
CHANGED
@@ -8,8 +8,6 @@
|
|
8
8
|
|
9
9
|
OS Windows7
|
10
10
|
|
11
|
-
Editter TeraPad //Editterはある程度代用がきくと考えているが念のため記載
|
12
|
-
|
13
11
|
C compiler Borland C++ Compiler 5.5
|
14
12
|
|
15
13
|
3D CG API OpenGL
|
@@ -18,7 +16,7 @@
|
|
18
16
|
|
19
17
|
|
20
18
|
|
21
|
-
上記環境(
|
19
|
+
上記環境(OSは都合によりWindows10で代用)ないしは上記環境と同等のことが行える環境の構築をしたい。
|
22
20
|
|
23
21
|
|
24
22
|
|
@@ -50,7 +48,7 @@
|
|
50
48
|
|
51
49
|
```
|
52
50
|
|
53
|
-
|
51
|
+
exp.obj: file not recognized: ファイル形式が認識できません
|
54
52
|
|
55
53
|
collect2: error: ld returned 1 exit status
|
56
54
|
|
@@ -60,393 +58,9 @@
|
|
60
58
|
|
61
59
|
課題の特性上ファイルの読み込み方法を変えるなどは致しかねますので非常に困りました。
|
62
60
|
|
63
|
-
また
|
61
|
+
またexp.objは大学側が用意してくださったファイルですので破損している等は考えにくいです。
|
64
62
|
|
65
|
-
### 該当のソースコード
|
66
63
|
|
67
|
-
問題のp9.cのソースコードは以下の通りです。
|
68
|
-
|
69
|
-
```C
|
70
|
-
|
71
|
-
/* プログラムp9 テクスチャマッピング */
|
72
|
-
|
73
|
-
#include <stdio.h>
|
74
|
-
|
75
|
-
#include <stdlib.h>
|
76
|
-
|
77
|
-
#include <GL/glut.h>
|
78
|
-
|
79
|
-
#include <GL/gl.h>
|
80
|
-
|
81
|
-
#define SX 600 /*ウインドウの横サイズの初期値*/
|
82
|
-
|
83
|
-
#define SY 450 /*ウインドウの縦サイズの初期値*/
|
84
|
-
|
85
|
-
#define ESC 27 /* Escキーの文字コード */
|
86
|
-
|
87
|
-
#define BMPFILE "kotori.bmp" /*テクスチャとして使用するBMPファイル名*/
|
88
|
-
|
89
|
-
#define TEXNUM 2 /*使用するテクスチャの最大数*/
|
90
|
-
|
91
|
-
/****** グローバル変数 ******/
|
92
|
-
|
93
|
-
float hoikaku = 0.0; /* 方位角 */
|
94
|
-
|
95
|
-
float gyokaku = 0.0; /* 仰角 */
|
96
|
-
|
97
|
-
float kyori = 0.0; /* 距離 */
|
98
|
-
|
99
|
-
int mousebutton; /* クリックされたボタン */
|
100
|
-
|
101
|
-
float xpos,ypos; /* マウスカーソルの座標 */
|
102
|
-
|
103
|
-
float kaiten = 0.0; /* 回転角 */
|
104
|
-
|
105
|
-
float kakudo = 12.0; /* 増加角 */
|
106
|
-
|
107
|
-
int interval = 33; /* フレーム表示間隔 33m秒*/
|
108
|
-
|
109
|
-
GLuint texture[TEXNUM]; /*使用可能なテクスチャ番号を保存する配列*/
|
110
|
-
|
111
|
-
/***************************/
|
112
|
-
|
113
|
-
int ReadBmp24_3(char *, int *, int *, unsigned char **); /*ReadBmp24_3のプロトタイプ宣言*/
|
114
|
-
|
115
|
-
void init_texture(void){
|
116
|
-
|
117
|
-
unsigned char *image;
|
118
|
-
|
119
|
-
int sizex,sizey,code;
|
120
|
-
|
121
|
-
unsigned char ichimatsu[4][3]={{255,255,255},{ 0, 0, 0},
|
122
|
-
|
123
|
-
{ 0, 0, 0},{255,255,255}}; /*市松模様*/
|
124
|
-
|
125
|
-
glGenTextures(TEXNUM, texture); /*使用可能なテクスチャ番号の取得*/
|
126
|
-
|
127
|
-
glPixelStorei(GL_UNPACK_ALIGNMENT,1); /*1byteずつのアクセス*/
|
128
|
-
|
129
|
-
/*画像ファイルからテクスチャを生成*/
|
130
|
-
|
131
|
-
code=ReadBmp24_3(BMPFILE,&sizex,&sizey,&image); /*テクスチャ用画像の入力*/
|
132
|
-
|
133
|
-
if(code!=0) {
|
134
|
-
|
135
|
-
switch(code) {
|
136
|
-
|
137
|
-
case 1: printf("%sが見つからない\n",BMPFILE);
|
138
|
-
|
139
|
-
break;
|
140
|
-
|
141
|
-
case 2: printf("%sはBMPファイルではない\n",BMPFILE);
|
142
|
-
|
143
|
-
break;
|
144
|
-
|
145
|
-
case 3: printf("メモリ不足のため画像ファイルを%s入力できなかった\n",BMPFILE);
|
146
|
-
|
147
|
-
break;
|
148
|
-
|
149
|
-
case 4: printf("%sは24bitカラーではない\n",BMPFILE);
|
150
|
-
|
151
|
-
break;
|
152
|
-
|
153
|
-
}
|
154
|
-
|
155
|
-
exit(1); /*プログラムの強制終了*/
|
156
|
-
|
157
|
-
}
|
158
|
-
|
159
|
-
glBindTexture(GL_TEXTURE_2D, texture[0]); /*テクスチャ番号0の設定*/
|
160
|
-
|
161
|
-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
162
|
-
|
163
|
-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
164
|
-
|
165
|
-
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, sizex, sizey,0, GL_RGB, GL_UNSIGNED_BYTE, image);
|
166
|
-
|
167
|
-
free(image); /*画像データ領域の解放*/
|
168
|
-
|
169
|
-
/*配列に定義したパターンからテクスチャを生成*/
|
170
|
-
|
171
|
-
glBindTexture(GL_TEXTURE_2D, texture[1]); /*テクスチャ番号1の設定*/
|
172
|
-
|
173
|
-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
174
|
-
|
175
|
-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
176
|
-
|
177
|
-
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, ichimatsu);
|
178
|
-
|
179
|
-
}
|
180
|
-
|
181
|
-
void timer(int val){ /*タイマーコールバック関数*/
|
182
|
-
|
183
|
-
if(val==0){ /*0番のタイマー*/
|
184
|
-
|
185
|
-
glutTimerFunc(interval, timer, 0); /*タイマーコールバック関数の再登録*/
|
186
|
-
|
187
|
-
kaiten += kakudo; /* 回転角を増加させる */
|
188
|
-
|
189
|
-
glutPostRedisplay(); /*ディスプレイコールバック関数を実行させる */
|
190
|
-
|
191
|
-
}
|
192
|
-
|
193
|
-
}
|
194
|
-
|
195
|
-
void polarview(void){
|
196
|
-
|
197
|
-
glTranslatef(0.0, 0.0, -kyori); /*距離*/
|
198
|
-
|
199
|
-
glRotatef(-gyokaku, 1.0, 0.0, 0.0); /*仰角*/
|
200
|
-
|
201
|
-
glRotatef(-hoikaku, 0.0, 1.0, 0.0); /*方位角*/
|
202
|
-
|
203
|
-
}
|
204
|
-
|
205
|
-
void mouseclick(int button, int state, int x, int y){
|
206
|
-
|
207
|
-
if(state==GLUT_DOWN) {
|
208
|
-
|
209
|
-
mousebutton=button; /*押されたボタンを記憶する*/
|
210
|
-
|
211
|
-
xpos=x; /*クリック時のマウスカーソルのx座標*/
|
212
|
-
|
213
|
-
ypos=y; /*クリック時のマウスカーソルのy座標*/
|
214
|
-
|
215
|
-
}
|
216
|
-
|
217
|
-
}
|
218
|
-
|
219
|
-
void mousedrag(int x, int y){
|
220
|
-
|
221
|
-
float dx=x-xpos,dy=y-ypos;
|
222
|
-
|
223
|
-
switch(mousebutton) {
|
224
|
-
|
225
|
-
case GLUT_LEFT_BUTTON: /*左ボタンがクリックされている*/
|
226
|
-
|
227
|
-
hoikaku+=(float)dx/2.0; /*方位角の更新*/
|
228
|
-
|
229
|
-
gyokaku+=(float)dy/2.0; /*仰角の更新*/
|
230
|
-
|
231
|
-
break;
|
232
|
-
|
233
|
-
case GLUT_RIGHT_BUTTON: /*右ボタンがクリックされている*/
|
234
|
-
|
235
|
-
kyori+=(float)dy/40.0; /*距離の更新*/
|
236
|
-
|
237
|
-
break;
|
238
|
-
|
239
|
-
}
|
240
|
-
|
241
|
-
xpos=x; /*マウスカーソルのx座標の更新*/
|
242
|
-
|
243
|
-
ypos=y; /*マウスカーソルのy座標の更新*/
|
244
|
-
|
245
|
-
glutPostRedisplay(); /*ディスプレイコールバック関数を実行させる */
|
246
|
-
|
247
|
-
}
|
248
|
-
|
249
|
-
void keyboard(unsigned char code, int x, int y){
|
250
|
-
|
251
|
-
if(code==ESC) exit(0); /* Escキー押下でプログラム終了 */
|
252
|
-
|
253
|
-
if(code==' '){
|
254
|
-
|
255
|
-
if(kakudo==0.0) kakudo = 12.0; /*回転*/
|
256
|
-
|
257
|
-
else kakudo = 0.0; /*静止*/
|
258
|
-
|
259
|
-
}
|
260
|
-
|
261
|
-
}
|
262
|
-
|
263
|
-
void attribute(float kdr,float kdg,float kdb, float ksr,float ksg,float ksb, float phong){
|
264
|
-
|
265
|
-
float kd[4],ks[4],ka[4];
|
266
|
-
|
267
|
-
kd[0]=kdr; kd[1]=kdg; kd[2]=kdb; kd[3]=1.0; /* kdの設定 */
|
268
|
-
|
269
|
-
ks[0]=ksr; ks[1]=ksg; ks[2]=ksb; ks[3]=1.0; /* ksの設定 */
|
270
|
-
|
271
|
-
ka[0]=kdr*0.2; ka[1]=kdg*0.2; ka[2]=kdb*0.2; ka[3]=1.0; /* kaの設定 */
|
272
|
-
|
273
|
-
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE, kd); /* 拡散反射係数 */
|
274
|
-
|
275
|
-
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR, ks); /* 鏡面反射係数 */
|
276
|
-
|
277
|
-
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT, ka); /* 環境光反射係数 */
|
278
|
-
|
279
|
-
glMaterialf (GL_FRONT_AND_BACK,GL_SHININESS,phong); /* フォンのモデルの係数 */
|
280
|
-
|
281
|
-
}
|
282
|
-
|
283
|
-
void face(void) /*マッピングされた面の表示*/{
|
284
|
-
|
285
|
-
glNormal3f(0,0,1); /*法線ベクトル*/
|
286
|
-
|
287
|
-
glBegin(GL_POLYGON);
|
288
|
-
|
289
|
-
glTexCoord2f(0.0,0.0); glVertex3f(-1.0,-1.0,1.0);
|
290
|
-
|
291
|
-
glTexCoord2f(1.0,0.0); glVertex3f( 1.0,-1.0,1.0);
|
292
|
-
|
293
|
-
glTexCoord2f(1.0,1.0); glVertex3f( 1.0, 1.0,1.0);
|
294
|
-
|
295
|
-
glTexCoord2f(0.0,1.0); glVertex3f(-1.0, 1.0,1.0);
|
296
|
-
|
297
|
-
glEnd();
|
298
|
-
|
299
|
-
}
|
300
|
-
|
301
|
-
void display( void ){
|
302
|
-
|
303
|
-
float light[4] ={0.5, 2.0, 1.0, 0.0}; /* 平行光線の指定 */
|
304
|
-
|
305
|
-
float intensity[4]={1.0, 1.0, 1.0, 1.0}; /* 光源光の強さ */
|
306
|
-
|
307
|
-
float amb[4] ={0.5, 0.5, 0.5, 0.0}; /* 環境光の強さ */
|
308
|
-
|
309
|
-
int i;
|
310
|
-
|
311
|
-
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /*フレームバッファとZバッファのクリア*/
|
312
|
-
|
313
|
-
glLightfv(GL_LIGHT0,GL_DIFFUSE, intensity); /* 0番の光源に拡散反射の強さを設定 */
|
314
|
-
|
315
|
-
glLightfv(GL_LIGHT0,GL_SPECULAR,intensity); /* 0番の光源に鏡面反射の強さを設定 */
|
316
|
-
|
317
|
-
glLightfv(GL_LIGHT0,GL_AMBIENT, amb); /* 0番の光源に環境光の強さを設定 */
|
318
|
-
|
319
|
-
glLightfv(GL_LIGHT0,GL_POSITION, light); /* 0番の光源に平行光線を設定*/
|
320
|
-
|
321
|
-
glEnable(GL_LIGHT0); /* 0番の光源を有効にする */
|
322
|
-
|
323
|
-
glEnable(GL_LIGHTING); /* 陰影付けの有効化 */
|
324
|
-
|
325
|
-
glEnable(GL_NORMALIZE);/* 法線ベクトルの正規化を有効にする */
|
326
|
-
|
327
|
-
glEnable(GL_DEPTH_TEST); /* Zバッファの有効化 */
|
328
|
-
|
329
|
-
glPushMatrix();
|
330
|
-
|
331
|
-
gluLookAt(0,0.5,15, 0,0.5,0, 0,1,0); /* 視点位置(0,0.5,15),目標点(0,0.5,0)*/
|
332
|
-
|
333
|
-
polarview(); /*ビューイング変換*/
|
334
|
-
|
335
|
-
attribute(1,1,1, 1,1,1, 64);
|
336
|
-
|
337
|
-
glEnable(GL_TEXTURE_2D); /*テクスチャマッピングの有効化*/
|
338
|
-
|
339
|
-
glBindTexture(GL_TEXTURE_2D, texture[0]); /*テクスチャ0の指定*/
|
340
|
-
|
341
|
-
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
342
|
-
|
343
|
-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);/*s方向のラップ*/
|
344
|
-
|
345
|
-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);/*t方向のラップ*/
|
346
|
-
|
347
|
-
glRotatef(kaiten, 0,1,0); /*; 物体の回転(アニメーション用)*/
|
348
|
-
|
349
|
-
for(i=0; i<4; i++){ /*側面*/
|
350
|
-
|
351
|
-
glPushMatrix();
|
352
|
-
|
353
|
-
glRotatef(90.0*i,0,1,0);
|
354
|
-
|
355
|
-
face();
|
356
|
-
|
357
|
-
glPopMatrix();
|
358
|
-
|
359
|
-
}
|
360
|
-
|
361
|
-
glBindTexture(GL_TEXTURE_2D, texture[1]); /*テクスチャ1の指定*/
|
362
|
-
|
363
|
-
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
364
|
-
|
365
|
-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);/**/
|
366
|
-
|
367
|
-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);/**/
|
368
|
-
|
369
|
-
glPushMatrix(); /*下面*/
|
370
|
-
|
371
|
-
glRotatef( 90.0,1,0,0);
|
372
|
-
|
373
|
-
face();
|
374
|
-
|
375
|
-
glPopMatrix();
|
376
|
-
|
377
|
-
glDisable(GL_TEXTURE_2D); /*テクスチャマッピングの無効化*/
|
378
|
-
|
379
|
-
glPushMatrix(); /*上面*/
|
380
|
-
|
381
|
-
glRotatef(-90.0,1,0,0);
|
382
|
-
|
383
|
-
face();
|
384
|
-
|
385
|
-
glPopMatrix();
|
386
|
-
|
387
|
-
glPopMatrix();
|
388
|
-
|
389
|
-
glDisable(GL_NORMALIZE);
|
390
|
-
|
391
|
-
glDisable(GL_LIGHT0);
|
392
|
-
|
393
|
-
glDisable(GL_LIGHTING);
|
394
|
-
|
395
|
-
glDisable(GL_DEPTH_TEST);
|
396
|
-
|
397
|
-
glutSwapBuffers();
|
398
|
-
|
399
|
-
}
|
400
|
-
|
401
|
-
void reshape(int sx, int sy) /*リシェープコルバック関数*/
|
402
|
-
|
403
|
-
float aspect = (float)sx/(float)sy; /*アスペクト比*/
|
404
|
-
|
405
|
-
glViewport(0,0,sx,sy); /*ビューポートの再設定*/
|
406
|
-
|
407
|
-
glMatrixMode(GL_PROJECTION); /*投影法計算の準備*/
|
408
|
-
|
409
|
-
glLoadIdentity(); /*投影法計算の初期設定*/
|
410
|
-
|
411
|
-
gluPerspective(22.5,aspect,1.0,100.0); /*透視投影の設定*/
|
412
|
-
|
413
|
-
glMatrixMode(GL_MODELVIEW); /*計算モードを幾何変換に切り替え*/
|
414
|
-
|
415
|
-
}
|
416
|
-
|
417
|
-
void main(int argc, char* argv[]){
|
418
|
-
|
419
|
-
glutInit(&argc,argv); /* ①glutの初期化 */
|
420
|
-
|
421
|
-
glutInitWindowPosition(0,0); /* ①ウインドウの位置 */
|
422
|
-
|
423
|
-
glutInitWindowSize(SX,SY); /* ①ウインドウサイズ */
|
424
|
-
|
425
|
-
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); /*①表示モード*/
|
426
|
-
|
427
|
-
glutCreateWindow( "実験Ⅲ-4-CG" );/* ①ウインドウの生成 */
|
428
|
-
|
429
|
-
init_texture(); /*テクスチャの準備*/
|
430
|
-
|
431
|
-
glClearColor (0.0,0.5,1.0,1.0 ); /* ①ウインドウの塗りつぶしの色 */
|
432
|
-
|
433
|
-
glutReshapeFunc(reshape); /* リシェープコールバック関数の登録 */
|
434
|
-
|
435
|
-
glutKeyboardFunc(keyboard); /* ②キーボード入力コールバック関数の登録 */
|
436
|
-
|
437
|
-
glutMouseFunc(mouseclick); /* マウスボタンコールバック関数の登録 */
|
438
|
-
|
439
|
-
glutMotionFunc(mousedrag); /* マウス移動コールバック関数の登録 */
|
440
|
-
|
441
|
-
glutTimerFunc(1, timer, 0); /*タイマーコールバック関数の登録*/
|
442
|
-
|
443
|
-
glutDisplayFunc(display); /* ②ディスプレイコールバック関数の登録 */
|
444
|
-
|
445
|
-
glutMainLoop(); /* ③ */
|
446
|
-
|
447
|
-
}
|
448
|
-
|
449
|
-
```
|
450
64
|
|
451
65
|
### 試したこと
|
452
66
|
|