teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

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

2022/12/05 12:07

投稿

sterengers
sterengers

スコア5

title CHANGED
File without changes
body 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,49 +150,21 @@
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
- //視点座標の計算
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);
163
- e.z = eDist*cos(eDegX*M_PI/180.0)*cos(eDegY*M_PI/180.0);
164
-
165
- //モデルビュー変換の設定
158
+ //マウスの移動量を角度化量に変
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; //ハイライト係数
159
+ eDegY = eDegY+(mX-x)*0.5; //マウス横方向→水平角
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
- //描画
191
- glBegin(GL_QUADS);//4つの頂点を1セットにして一つの四角形面を形成
192
- // glNormal3d(0.0, 1.0, 0.0); //法線ベクトル
160
+ eDegX = eDegX+(y-mY)*0.5; //マウス縦方向→垂直角
193
-
194
- for (int j=0; j<TILE-1; j++) {
161
+ if (eDegX>89.0) eDegX = 89.0;
195
- for
162
+ if (eDegX<-89.0) eDegX = -89.0;
196
163
 
164
+ //マウス座標をグローバル変数に保存
165
+ mX = x; mY = y;
166
+ }
167
+
197
168
  //キーボードコールバック関数(key:キーの種類,x,y:座標)
198
169
  void keyboard(unsigned char key, int x, int y)
199
170
  {
@@ -221,3 +192,43 @@
221
192
  break;
222
193
  }
223
194
  }
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
+