質問編集履歴
1
プログラムは規定内に入らなかったので途中を切り取りました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -42,7 +42,6 @@
|
|
42
42
|
### 該当のソースコード
|
43
43
|
|
44
44
|
```
|
45
|
-
//g++ -O3 main07.cpp -framework OpenGL -framework GLUT -Wno-deprecated
|
46
45
|
#include <stdio.h>
|
47
46
|
#include <stdio.h>
|
48
47
|
#include <stdlib.h>
|
@@ -151,48 +150,20 @@
|
|
151
150
|
boxPos.z=0.0;
|
152
151
|
}
|
153
152
|
|
153
|
+
、、、
|
154
|
+
|
154
|
-
//
|
155
|
+
//マウスドラッグコールバック関数
|
155
|
-
void
|
156
|
+
void motion(int x, int y)
|
156
|
-
{
|
157
|
+
{
|
157
|
-
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //画面消去
|
158
|
-
|
159
|
-
//
|
158
|
+
//マウスの移動量を角度変化量に変換
|
160
|
-
Vec_3D e;
|
161
|
-
e.x = eDist*cos(eDegX*M_PI/180.0)*sin(eDegY*M_PI/180.0);
|
162
|
-
e
|
159
|
+
eDegY = eDegY+(mX-x)*0.5; //マウス横方向→水平角
|
160
|
+
eDegX = eDegX+(y-mY)*0.5; //マウス縦方向→垂直角
|
161
|
+
if (eDegX>89.0) eDegX = 89.0;
|
163
|
-
|
162
|
+
if (eDegX<-89.0) eDegX = -89.0;
|
164
|
-
|
163
|
+
|
165
|
-
//
|
164
|
+
//マウス座標をグローバル変数に保存
|
166
|
-
glMatrixMode(GL_MODELVIEW); //変換行列の指定(設定対象はモデルビュー変換行列)
|
167
|
-
glLoadIdentity(); //行列初期化
|
168
|
-
gluLookAt(e.x, e.y, e.z, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //視点視線設定(視野変換行列を乗算)
|
169
|
-
|
170
|
-
//光源0の配置
|
171
|
-
GLfloat lightPos0[] = {0.0, 5.0, 0.0, 1.0}; //平行光源
|
172
|
-
glLightfv(GL_LIGHT0, GL_POSITION, lightPos0); //光源座標
|
173
|
-
//光源1の配置
|
174
|
-
GLfloat lightPos1[] = {1.0, 5.0, 4.0, 1.0}; //点光源
|
175
|
-
glLightfv(GL_LIGHT1, GL_POSITION, lightPos1); //光源座標
|
176
|
-
|
177
|
-
//描画準備
|
178
|
-
GLfloat col[4], spe[4], shi[1]; //材質設定用配列
|
179
|
-
Vec_3D v1, v2, nv; //辺ベクトル,法線ベクトル
|
180
|
-
|
181
|
-
//床の表示
|
182
|
-
//色の設定
|
183
|
-
col[0] = 0.0; col[1] = 0.0; col[2] = 1.0; col[3] = 1.0; //拡散反射係数
|
184
|
-
spe[0] = 1.0; spe[1] = 1.0; spe[2] = 1.0; spe[3] = 1.0; //鏡面反射係数
|
185
|
-
shi[0] = 100.0; //ハイライト係数
|
186
|
-
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col); //拡散反射
|
187
|
-
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, col); //環境光
|
188
|
-
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spe); //鏡面反射
|
189
|
-
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shi); //ハイライト
|
190
|
-
|
165
|
+
mX = x; mY = y;
|
191
|
-
glBegin(GL_QUADS);//4つの頂点を1セットにして一つの四角形面を形成
|
192
|
-
// glNormal3d(0.0, 1.0, 0.0); //法線ベクトル
|
193
|
-
|
194
|
-
for (int j=0; j<TILE-1; j++) {
|
195
|
-
|
166
|
+
}
|
196
167
|
|
197
168
|
//キーボードコールバック関数(key:キーの種類,x,y:座標)
|
198
169
|
void keyboard(unsigned char key, int x, int y)
|
@@ -222,3 +193,43 @@
|
|
222
193
|
}
|
223
194
|
}
|
224
195
|
|
196
|
+
//タイマーコールバック関数
|
197
|
+
void timer(int value)
|
198
|
+
{
|
199
|
+
glutPostRedisplay(); //ディスプレイイベント強制発生
|
200
|
+
glutTimerFunc(33, timer, 0); //タイマー再設定
|
201
|
+
}
|
202
|
+
|
203
|
+
//v1とv2の外積計算
|
204
|
+
Vec_3D normcrossprod(Vec_3D v1, Vec_3D v2)
|
205
|
+
{
|
206
|
+
Vec_3D out; //戻り値用
|
207
|
+
|
208
|
+
//外積各成分の計算
|
209
|
+
out.x = v1.y*v2.z-v1.z*v2.y;
|
210
|
+
out.y = v1.z*v2.x-v1.x*v2.z;
|
211
|
+
out.z = v1.x*v2.y-v1.y*v2.x;
|
212
|
+
//正規化
|
213
|
+
vectorNormalize(&out);
|
214
|
+
//戻り値
|
215
|
+
return out;
|
216
|
+
}
|
217
|
+
|
218
|
+
//ベクトル正規化
|
219
|
+
double vectorNormalize(Vec_3D* vec)
|
220
|
+
{
|
221
|
+
double len;
|
222
|
+
|
223
|
+
//ベクトル長
|
224
|
+
len = sqrt(pow(vec->x,2)+pow(vec->y,2)+pow(vec->z,2));
|
225
|
+
//各成分をベクトル長で割る
|
226
|
+
if (len>0) {
|
227
|
+
vec->x /= len;
|
228
|
+
vec->y /= len;
|
229
|
+
vec->z /= len;
|
230
|
+
}
|
231
|
+
//戻り値
|
232
|
+
return len;
|
233
|
+
}
|
234
|
+
|
235
|
+
|