質問編集履歴

3

文章とタイトルを修正

2021/10/31 07:18

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- [OpenGL] カメラの視点回転で回転姿勢を扱いたい。
1
+ [OpenGL] カメラの視点回転が正しのか知りたい。
test CHANGED
@@ -1,12 +1,6 @@
1
- 提示コードですがMain.cppのコメント部のようにカメラを上下左右に回転させたいのですがそれには回転姿勢を扱う必要があるのですがそれどうった行列計算が必要なのでしょうか?
1
+ 提示コードですがCamera.cppのコメント部内部コードなのですがsetLook()関数Main.cppで使っているのですがcos.sinの使い方と視線の動かし方正しいのでしょうか?
2
-
3
-
4
-
5
-
6
-
7
- 参考サイト:[ https://blog.natade.net/2017/05/27/directx-opengl-d3dxmatrixrotation-glrotate/
2
+
8
-
9
- ](https://blog.natade.net/2017/05/27/directx-opengl-d3dxmatrixrotation-glrotate/)
3
+
10
4
 
11
5
 
12
6
 
@@ -14,9 +8,173 @@
14
8
 
15
9
 
16
10
 
11
+ ##### Camera.cpp
12
+
13
+ ```
14
+
15
+ #include "../header/Camera.hpp"
16
+
17
+
18
+
19
+ #include <glm/glm.hpp>
20
+
17
- ![イメージ説明](08d28edb4f3b830f74d57229b6b5d9fb.png)
21
+ #include <glm/gtx/transform.hpp>
22
+
18
-
23
+ #include <glm/gtc/matrix_transform.hpp>
24
+
19
-
25
+ #include "../header/Window.hpp"
26
+
27
+ #include "../header/Init.hpp"
28
+
29
+
30
+
31
+ std::shared_ptr<std::vector<FrameWork::D2::VertexAttribute>> FrameWork::Camera::vertex = std::make_shared<std::vector<FrameWork::D2::VertexAttribute>>(0); //頂点配列
32
+
33
+
34
+
35
+ glm::mat4 FrameWork::Camera::scale = glm::mat4(); //拡大縮小
36
+
37
+ glm::mat4 FrameWork::Camera::rotate = glm::mat4(); //回転
38
+
39
+ glm::mat4 FrameWork::Camera::translate = glm::mat4(); //平行移動
40
+
41
+
42
+
43
+ //描画行列
44
+
45
+ glm::vec3 FrameWork::Camera::position = glm::vec3(0,0,0); //座標
46
+
47
+ glm::vec3 FrameWork::Camera::vecLook = glm::vec3(0,0,-1); //向き(視線)
48
+
49
+ glm::mat4 FrameWork::Camera::view = glm::lookAt(glm::vec3(position.x, position.y, position.z), vecLook, glm::vec3(0, 1, 0)); //ビュー行列
50
+
51
+ glm::mat4 FrameWork::Camera::projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.00001f, 10000.0f); //透視射形行列
52
+
53
+
54
+
55
+ // ##################################### 初期化 #####################################
56
+
57
+ void FrameWork::Camera::Init()
58
+
59
+ {
60
+
61
+ vertex->resize(6); //頂点配列を初期化
62
+
63
+ }
64
+
65
+
66
+
67
+
68
+
69
+ // ##################################### 頂点属性を取得 #####################################
70
+
71
+ std::shared_ptr<std::vector<FrameWork::D2::VertexAttribute>> FrameWork::Camera::getVertexAttribute()
72
+
73
+ {
74
+
75
+ return vertex;
76
+
77
+ }
78
+
79
+
80
+
81
+ // ##################################### 座標を設定 #####################################
82
+
83
+ void FrameWork::Camera::setPosition(glm::vec3 p)
84
+
85
+ {
86
+
87
+ position = p; //座標
88
+
89
+ }
90
+
91
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////
92
+
93
+ // ##################################### 視線を設定 #####################################
94
+
95
+ void FrameWork::Camera::setLook(glm::vec3 l)
96
+
97
+ {
98
+
99
+ vecLook = l; //向き
100
+
101
+
102
+
103
+ glm::vec3 up = glm::vec3(0, 1, 0);
104
+
105
+ glm::vec3 cameraDirection = glm::normalize(position - vecLook);
106
+
107
+ glm::vec3 cameraRight = glm::normalize(glm::cross(up, cameraDirection));
108
+
109
+ glm::vec3 cameraUp = glm::cross(vecLook, cameraRight);
110
+
111
+
112
+
113
+ view = glm::lookAt(glm::vec3(position.x, position.y, position.z), position + vecLook,up);
114
+
115
+ }
116
+
117
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////
118
+
119
+ // ##################################### 座標を取得 #####################################
120
+
121
+ glm::vec3 FrameWork::Camera::getPosition()
122
+
123
+ {
124
+
125
+ return position;
126
+
127
+ }
128
+
129
+
130
+
131
+ // ##################################### 視線を取得 #####################################
132
+
133
+ glm::vec3 FrameWork::Camera::getLook()
134
+
135
+ {
136
+
137
+ return vecLook;
138
+
139
+ }
140
+
141
+
142
+
143
+ // ##################################### 3D ビュー行列を取得 透視射形行列 #####################################
144
+
145
+ glm::mat4 FrameWork::Camera::getViewProjection()
146
+
147
+ {
148
+
149
+ return projection * view;
150
+
151
+ }
152
+
153
+
154
+
155
+ // ##################################### 2D ビュー行列を取得 正射形 #####################################
156
+
157
+ glm::mat4 FrameWork::Camera::getProjection_2D()
158
+
159
+ {
160
+
161
+ return glm::ortho(0.0f, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0.0f, -1.0f, 1.0f);
162
+
163
+ }
164
+
165
+
166
+
167
+ // ###################### デストラクタ ######################
168
+
169
+ FrameWork::Camera::~Camera()
170
+
171
+ {
172
+
173
+
174
+
175
+ }
176
+
177
+ ```
20
178
 
21
179
 
22
180
 
@@ -24,468 +182,70 @@
24
182
 
25
183
  ##### Main.cpp
26
184
 
185
+ ```cpp
186
+
187
+
188
+
189
+ //関数の外に宣言 初期値↓
190
+
191
+ float cameraLookSpeed = PI / 100; //視点移動速度
192
+
193
+ glm::vec3 cameraLook = glm::vec3(PI /2,PI,0);
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+ if (FrameWork::windowContext->getKeyInput(GLFW_KEY_LEFT_CONTROL) > 0)
204
+
205
+ {
206
+
207
+ if (FrameWork::windowContext->getKeyInput(GLFW_KEY_LEFT) > (short)0)
208
+
209
+ {
210
+
211
+ cameraLook.x += -cameraLookSpeed;
212
+
213
+ }
214
+
215
+ else if (FrameWork::windowContext->getKeyInput(GLFW_KEY_RIGHT) > (short)0)
216
+
217
+ {
218
+
219
+ cameraLook.x += cameraLookSpeed;
220
+
221
+ }
222
+
223
+
224
+
225
+ if (FrameWork::windowContext->getKeyInput(GLFW_KEY_UP) > (short)0)
226
+
227
+ {
228
+
229
+ cameraLook.y += cameraLookSpeed;
230
+
231
+ }
232
+
233
+ else if (FrameWork::windowContext->getKeyInput(GLFW_KEY_DOWN) > (short)0)
234
+
235
+ {
236
+
237
+ cameraLook.y += -cameraLookSpeed;
238
+
239
+ }
240
+
241
+ }
242
+
243
+
244
+
245
+ FrameWork::Camera::setLook(glm::vec3(cos(cameraLook.x) * cos(cameraLook.y), sin(cameraLook.y), sin(cameraLook.x) * cos(cameraLook.y)));
246
+
247
+ FrameWork::Camera::setPosition(cameraPos);
248
+
249
+
250
+
27
251
  ```
28
-
29
- include "../header/FrameWork.hpp"
30
-
31
- #include "../header/Resource.hpp"
32
-
33
-
34
-
35
- #include <iostream>
36
-
37
- #include "../header/Camera.hpp"
38
-
39
-
40
-
41
-
42
-
43
- int main()
44
-
45
- {
46
-
47
- FrameWork::Init(glm::ivec2(800, 600), glm::ivec2(4,2), "FrameWork"); // 初期化
48
-
49
- FrameWork::Camera::Init(); //カメラ初期化
50
-
51
-
52
-
53
-
54
-
55
- FrameWork::ObjFile cubeFile;
56
-
57
- FrameWork::D3::LoadObj("Model/Cube.obj",cubeFile);
58
-
59
- FrameWork::D3::Object cube(cubeFile);
60
-
61
-
62
-
63
- FrameWork::ObjFile groundFile;
64
-
65
- FrameWork::D3::LoadObj("Model/ground.obj",groundFile);
66
-
67
- FrameWork::D3::Object ground(groundFile);
68
-
69
-
70
-
71
-
72
-
73
- float y = 0;
74
-
75
- float x = 0;
76
-
77
-
78
-
79
- float angleY = 0;
80
-
81
- float angleX = 0;
82
-
83
-
84
-
85
- float vecSpeed = PI / 100;
86
-
87
- while (*FrameWork::windowContext)
88
-
89
- {
90
-
91
- FrameWork::windowContext->FrameUpdate(glm::vec4(0,0,0,255));
92
-
93
-
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
- if(FrameWork::windowContext->getKeyInput(GLFW_KEY_A) > (short)0)
102
-
103
- {
104
-
105
- angleY = 0.001;
106
-
107
-
108
-
109
- cube.setRotate(glm::vec3(0,1,0),angleY);
110
-
111
- }
112
-
113
- else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_D) > (short)0)
114
-
115
- {
116
-
117
- angleY = -0.001;
118
-
119
- cube.setRotate(glm::vec3(0,1,0),angleY);
120
-
121
-
122
-
123
- }
124
-
125
- else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_W) > (short)0)
126
-
127
- {
128
-
129
- angleY = 0.001;
130
-
131
- cube.setRotate(glm::vec3(1,0,0),angleY);
132
-
133
-
134
-
135
- }
136
-
137
- else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_S) > (short)0)
138
-
139
- {
140
-
141
- angleY = -0.001;
142
-
143
- cube.setRotate(glm::vec3(1,0,0),angleY);
144
-
145
- }
146
-
147
-
148
-
149
-
150
-
151
- if(FrameWork::windowContext->getKeyInput(GLFW_KEY_LEFT) > (short)0)
152
-
153
- {
154
-
155
- x += -vecSpeed;
156
-
157
-
158
-
159
- // printf("left\n");
160
-
161
- // printf("%f , %f \n",x,y);
162
-
163
-
164
-
165
- }
166
-
167
- else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_RIGHT) > (short)0)
168
-
169
- {
170
-
171
- x += vecSpeed;
172
-
173
- // printf("right\n");
174
-
175
- // printf("%f , %f \n",x,y);
176
-
177
-
178
-
179
- }
180
-
181
-
182
-
183
- if(FrameWork::windowContext->getKeyInput(GLFW_KEY_UP) > (short)0)
184
-
185
- {
186
-
187
- y += vecSpeed;
188
-
189
- // printf("up\n");
190
-
191
- // printf("%f , %f \n",x,y);
192
-
193
-
194
-
195
-
196
-
197
- }
198
-
199
- else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_DOWN) > (short)0)
200
-
201
- {
202
-
203
- y += -vecSpeed;
204
-
205
- // printf("down\n");
206
-
207
- // printf("%f , %f \n",x,y);
208
-
209
-
210
-
211
- }
212
-
213
-
214
-
215
-
216
-
217
-
218
-
219
- /////////////////////////////////////////////////////////////////////////////////////////////////////
220
-
221
- FrameWork::Camera::setLook(glm::vec3(cos(x) + 0,sin(y) + 100,sin(x) + 300));
222
-
223
- FrameWork::Camera::setPosition(glm::vec3(0,100,300));
224
-
225
- //////////////////////////////////////////////////////////////////////////////////////////////////////////
226
-
227
-
228
-
229
- //Cube
230
-
231
- cube.shader->setEnable();
232
-
233
- cube.setPosition(glm::vec3(0,70,30));
234
-
235
- cube.setScale(glm::vec3(30,30,30));
236
-
237
- // cube.shader->setUniform4f("uFragment",FrameWork::GetGlColor(glm::vec4(0,0,100,255)));
238
-
239
- cube.shader->setUniform3f("objectColor", glm::vec3(1.0f, 0.5f, 0.31f));
240
-
241
- cube.shader->setUniform3f("lightColor", glm::vec3(1.0f, 1.0f, 1.0f));
242
-
243
- cube.shader->setUniform3f("lightPos", glm::vec3(0,0,0.0f));
244
-
245
- cube.shader->setUniform3f("viewPos",FrameWork::Camera::getPosition());
246
-
247
- cube.Renderer();
248
-
249
- cube.shader->setDisable();
250
-
251
-
252
-
253
-
254
-
255
-
256
-
257
-
258
-
259
-
260
-
261
- //Ground
262
-
263
- ground.shader->setEnable();
264
-
265
- ground.setPosition(glm::vec3(0,0,0));
266
-
267
- ground.setScale(glm::vec3(1,1,1));
268
-
269
- ground.shader->setUniform3f("objectColor", glm::vec3(1.0f, 0.5f, 0.31f));
270
-
271
- ground.shader->setUniform3f("lightColor", glm::vec3(1.0f, 1.0f, 1.0f));
272
-
273
- ground.shader->setUniform3f("lightPos", glm::vec3(0,0,0));
274
-
275
- ground.shader->setUniform3f("viewPos", FrameWork::Camera::getPosition());
276
-
277
- //ground.shader->setUniform4f("uFragment",FrameWork::GetGlColor(glm::vec4(0,100,0,255)));
278
-
279
- ground.Renderer();
280
-
281
- ground.shader->setDisable();
282
-
283
-
284
-
285
-
286
-
287
-
288
-
289
-
290
-
291
-
292
-
293
-
294
-
295
- FrameWork::windowContext->Wait();
296
-
297
- FrameWork::windowContext->SwapBuffers();
298
-
299
- }
300
-
301
-
302
-
303
-
304
-
305
-
306
-
307
-
308
-
309
-
310
-
311
- return 0;
312
-
313
- }
314
-
315
-
316
-
317
- ```
318
-
319
-
320
-
321
-
322
-
323
-
324
-
325
- ##### Camera.cpp
326
-
327
- ```
328
-
329
- #include "../header/Camera.hpp"
330
-
331
-
332
-
333
- #include <glm/glm.hpp>
334
-
335
- #include <glm/gtx/transform.hpp>
336
-
337
- #include <glm/gtc/matrix_transform.hpp>
338
-
339
- #include "../header/Window.hpp"
340
-
341
- #include "../header/Init.hpp"
342
-
343
-
344
-
345
- std::shared_ptr<std::vector<FrameWork::D2::VertexAttribute>> FrameWork::Camera::vertex = std::make_shared<std::vector<FrameWork::D2::VertexAttribute>>(0); //頂点配列
346
-
347
-
348
-
349
- glm::mat4 FrameWork::Camera::scale = glm::mat4(); //拡大縮小
350
-
351
- glm::mat4 FrameWork::Camera::rotate = glm::mat4(); //回転
352
-
353
- glm::mat4 FrameWork::Camera::translate = glm::mat4(); //平行移動
354
-
355
-
356
-
357
- //描画行列
358
-
359
- glm::vec3 FrameWork::Camera::position = glm::vec3(0,0,0); //座標
360
-
361
- glm::vec3 FrameWork::Camera::vecLook = glm::vec3(0,0,-1); //向き(視線)
362
-
363
- glm::mat4 FrameWork::Camera::view = glm::lookAt(glm::vec3(position.x, position.y, position.z), vecLook, glm::vec3(0, 1, 0)); //ビュー行列
364
-
365
- glm::mat4 FrameWork::Camera::projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.00001f, 10000.0f); //透視射形行列
366
-
367
-
368
-
369
- // ##################################### 初期化 #####################################
370
-
371
- void FrameWork::Camera::Init()
372
-
373
- {
374
-
375
- vertex->resize(6); //頂点配列を初期化
376
-
377
- }
378
-
379
-
380
-
381
-
382
-
383
- // ##################################### 頂点属性を取得 #####################################
384
-
385
- std::shared_ptr<std::vector<FrameWork::D2::VertexAttribute>> FrameWork::Camera::getVertexAttribute()
386
-
387
- {
388
-
389
- return vertex;
390
-
391
- }
392
-
393
-
394
-
395
- // ##################################### 座標を設定 #####################################
396
-
397
- void FrameWork::Camera::setPosition(glm::vec3 p)
398
-
399
- {
400
-
401
- position = p; //座標
402
-
403
- }
404
-
405
-
406
-
407
- // ##################################### 視線を設定 #####################################
408
-
409
- void FrameWork::Camera::setLook(glm::vec3 l)
410
-
411
- {
412
-
413
- vecLook = l; //向き
414
-
415
- glm::vec3 up = glm::vec3(0, 1, 0);
416
-
417
-
418
-
419
- glm::vec3 cameraDirection = glm::normalize(position - vecLook);
420
-
421
- glm::vec3 cameraRight = glm::normalize(glm::cross(up, cameraDirection));
422
-
423
- glm::vec3 cameraUp = glm::cross(vecLook, cameraRight);
424
-
425
-
426
-
427
- view = glm::lookAt(glm::vec3(position.x, position.y, position.z), position + vecLook,glm::vec3(0, 1, 0));
428
-
429
- }
430
-
431
-
432
-
433
- // ##################################### 座標を取得 #####################################
434
-
435
- glm::vec3 FrameWork::Camera::getPosition()
436
-
437
- {
438
-
439
- return position;
440
-
441
- }
442
-
443
-
444
-
445
- // ##################################### 視線を取得 #####################################
446
-
447
- glm::vec3 FrameWork::Camera::getLook()
448
-
449
- {
450
-
451
- return vecLook;
452
-
453
- }
454
-
455
-
456
-
457
- // ##################################### 3D ビュー行列を取得 透視射形行列 #####################################
458
-
459
- glm::mat4 FrameWork::Camera::getViewProjection()
460
-
461
- {
462
-
463
- return projection * view;
464
-
465
- }
466
-
467
-
468
-
469
- // ##################################### 2D ビュー行列を取得 正射形 #####################################
470
-
471
- glm::mat4 FrameWork::Camera::getProjection_2D()
472
-
473
- {
474
-
475
- return glm::ortho(0.0f, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0.0f, -1.0f, 1.0f);
476
-
477
- }
478
-
479
-
480
-
481
- // ###################### デストラクタ ######################
482
-
483
- FrameWork::Camera::~Camera()
484
-
485
- {
486
-
487
-
488
-
489
- }
490
-
491
- ```

2

文章を修正

2021/10/31 07:18

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -10,6 +10,10 @@
10
10
 
11
11
 
12
12
 
13
+ 参考サイト: [https://learnopengl.com/Getting-started/Camera](https://learnopengl.com/Getting-started/Camera)
14
+
15
+
16
+
13
17
  ![イメージ説明](08d28edb4f3b830f74d57229b6b5d9fb.png)
14
18
 
15
19
 
@@ -408,7 +412,19 @@
408
412
 
409
413
  vecLook = l; //向き
410
414
 
415
+ glm::vec3 up = glm::vec3(0, 1, 0);
416
+
417
+
418
+
419
+ glm::vec3 cameraDirection = glm::normalize(position - vecLook);
420
+
421
+ glm::vec3 cameraRight = glm::normalize(glm::cross(up, cameraDirection));
422
+
423
+ glm::vec3 cameraUp = glm::cross(vecLook, cameraRight);
424
+
425
+
426
+
411
- view = glm::lookAt(glm::vec3(position.x, position.y, position.z), vecLook, glm::vec3(0, 1, 0));
427
+ view = glm::lookAt(glm::vec3(position.x, position.y, position.z), position + vecLook,glm::vec3(0, 1, 0));
412
428
 
413
429
  }
414
430
 

1

文章を修正

2021/10/28 08:26

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- 提示コードですがMain.cppのようにカメラを上下左右に回転させたいのですがそれをするには回転姿勢を扱う必要があるのですがそれはどういった行列の計算が必要なのでしょうか?
1
+ 提示コードですがMain.cppのコメント部のようにカメラを上下左右に回転させたいのですがそれをするには回転姿勢を扱う必要があるのですがそれはどういった行列の計算が必要なのでしょうか?
2
2
 
3
3
 
4
4
 
@@ -212,13 +212,13 @@
212
212
 
213
213
 
214
214
 
215
-
215
+ /////////////////////////////////////////////////////////////////////////////////////////////////////
216
216
 
217
217
  FrameWork::Camera::setLook(glm::vec3(cos(x) + 0,sin(y) + 100,sin(x) + 300));
218
218
 
219
219
  FrameWork::Camera::setPosition(glm::vec3(0,100,300));
220
220
 
221
-
221
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////
222
222
 
223
223
 
224
224