質問編集履歴

1

プログラムは規定内に入らなかったので途中を切り取りました。

2022/12/05 12:07

投稿

sterengers
sterengers

スコア5

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 display()
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.y = eDist*sin(eDegX*M_PI/180.0);
159
+ eDegY = eDegY+(mX-x)*0.5; //マウス横方向→水平角
160
+ eDegX = eDegX+(y-mY)*0.5; //マウス縦方向→垂直角
161
+ if (eDegX>89.0) eDegX = 89.0;
163
- e.z = eDist*cos(eDegX*M_PI/180.0)*cos(eDegY*M_PI/180.0);
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
- for
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
+