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

質問編集履歴

9

タイトルを文章を修正しました。

2021/02/15 12:21

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- 回転行列が上手く動作しない理由が知りたい。
1
+ 回転行列が上手く動作しない理由が知りたい。 中心を中心回転させたい。
body CHANGED
@@ -1,5 +1,6 @@
1
1
  提示画像ですが移動して左キーを押すと座標はそのままで画像が上に移動してしまうのですがこれは何が原因なのでしょか?画像サイズはこの砲弾の画像の大きさが読み込んでいます。22,28
2
2
  提示コードの/////コメント部の内部の回転行列の行列部が悪いと思うのですが何を間違えてのでしょうか?よく考えましたがどうしてもわかりません。
3
+ 描画原点を中心に回転してしまうのですがどうすれば中心を中心に回転するのでしょうか?
3
4
 
4
5
  ![イメージ説明](f7fe39f105cbaea7da487f34f363a1a4.jpeg)
5
6
  ![イメージ説明](232632d2443ecdc9faa76fec5c521354.jpeg)

8

提示画像を追加

2021/02/15 12:21

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,11 +1,9 @@
1
1
  提示画像ですが移動して左キーを押すと座標はそのままで画像が上に移動してしまうのですがこれは何が原因なのでしょか?画像サイズはこの砲弾の画像の大きさが読み込んでいます。22,28
2
2
  提示コードの/////コメント部の内部の回転行列の行列部が悪いと思うのですが何を間違えてのでしょうか?よく考えましたがどうしてもわかりません。
3
3
 
4
+ ![イメージ説明](f7fe39f105cbaea7da487f34f363a1a4.jpeg)
5
+ ![イメージ説明](232632d2443ecdc9faa76fec5c521354.jpeg)
4
6
 
5
-
6
- ![イメージ説明](f07cf4728e2456086b1864156ebbd36c.jpeg)
7
-
8
-
9
7
  ```cpp
10
8
  #include "../Header/Sprite.hpp"
11
9
  #include "../Header/Shader.hpp"

7

文章を修正しました。

2021/02/15 11:14

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- 角度を変えるとスプライトが上移動してしまう原因が知りたい。回転行列が上手く動作しない理由が知りたい。
1
+ 回転行列が上手く動作しない理由が知りたい。
body CHANGED
File without changes

6

文章を修正しました。

2021/02/15 10:42

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,114 +1,207 @@
1
- 提示画像ですが移動して左キーを押すと座標はそのままで画像が上に移動してしまうのですがこれは何が原因なのでしょか?画像サイズは
1
+ 提示画像ですが移動して左キーを押すと座標はそのままで画像が上に移動してしまうのですがこれは何が原因なのでしょか?画像サイズはこの砲弾の画像の大きさが読み込んでいます。22,28
2
- 砲弾画像大きさ読み込んです。
2
+ 提示コード/////コメント部内部回転行列の行列部と思うのでが何を間違えてのでしょうか?よく考えましたがどうしてもわかりません
3
3
 
4
- 提示コードの/////コメント部内部のコードですがこのコードのどこが悪いのでしょうか?
5
4
 
6
5
 
6
+ ![イメージ説明](f07cf4728e2456086b1864156ebbd36c.jpeg)
7
7
 
8
8
 
9
+ ```cpp
10
+ #include "../Header/Sprite.hpp"
11
+ #include "../Header/Shader.hpp"
12
+ #include "../Header/Entry.hpp"
13
+ #include "../Header/LoadTexture.hpp"
14
+ #include "../Header/VertexData.hpp"
9
15
 
16
+ // 数学ライブラリ
10
- ![イメージ説明](f07cf4728e2456086b1864156ebbd36c.jpeg)
17
+ #include "glm/ext.hpp"
18
+ #include "glm/glm.hpp"
11
19
 
12
- ```cpp
13
- #include "../../Header/Game/Player.hpp"
20
+ #include <vector>
14
21
 
22
+ // OpenCV
23
+ #include <opencv2/core.hpp>
24
+
25
+ /*################################################################################################################
26
+ * 画像 描画クラス
27
+ ################################################################################################################*/
28
+
15
29
  //コンストラクタ
30
+ /*
31
+ * Entry クラス
32
+ * テクスチャ パス
33
+ * 描画する画像の寸法
34
+ */
16
- Player::Player(Entry* e) : Actor_2D()
35
+ Sprite::Sprite(class Entry* g, std::shared_ptr<TextureData> sp ) : Transform_2D(g)
17
36
  {
37
+ shader = std::make_shared<class Shader>(g,"Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
18
38
 
39
+ Owner = g;//Entryクラス
40
+
19
- mPosition = glm::ivec2(100, -100); //座標
41
+ Transform_2D::setTransfrom(glm::vec2(1,1),0,glm::vec2(0,0)); //トランスフォームを初期化
20
- mVector = VECTOR_UP; //方向
21
42
 
43
+ //テクスチャを設定
22
- InputKey = std::make_shared<Input>(e); //キー入力
44
+ glGenTextures(1, &TextureID);
23
- text = std::make_shared<Text>(e); //テキスト表示
45
+ glBindTexture(GL_TEXTURE_2D, TextureID);
24
46
 
25
- //スプライト
47
+ //画像の大きさ
26
- Data = LoadTexture("Assets/Bullet.png");
27
- mSprite = std::make_shared<Sprite>(e, Data);
48
+ mPicSize.x = (float)sp->mSize.x;
28
- UV =TextureUV{ glm::ivec2(0,0), glm::ivec2(Data->mSize.x,Data->mSize.y) };
49
+ mPicSize.y = (float)sp->mSize.y;
29
- }
30
50
 
51
+
52
+ // printf("%d\n",sp->mData->size());
53
+
31
54
 
55
+ if (sp->mData->data() != NULL)
56
+ {
57
+ if (sp->channels == 3)
58
+ {
59
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGB, GL_UNSIGNED_BYTE, sp->mData->data());
60
+ }
61
+ else if (sp->channels == 4)
62
+ {
63
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, sp->mData->data());
64
+ }
65
+ }
66
+ else {
67
+ std::cerr << "Unable to load texture: " <<std::endl;
68
+ }
32
69
 
70
+
71
+ //ミニマップを設定
72
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
73
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
74
+ glGenerateMipmap(GL_TEXTURE_2D);
75
+
76
+ //異方性フィルタリングを設定
77
+ GLfloat largest;
78
+ glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest);
79
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest);
80
+
81
+
82
+
83
+
84
+ //VAO
85
+ glGenVertexArrays(1, &VAO);
33
- void Player::Update()
86
+ glBindVertexArray(VAO);
87
+
88
+ //VBO
89
+ glGenBuffers(1, &VBO);
90
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
91
+ glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
92
+
93
+
94
+
95
+ }
96
+
97
+ //描画
98
+ void Sprite::DrawGraph(glm::ivec2 pos, glm::vec2 start, glm::vec2 end)
34
99
  {
35
- //移動
36
- mSpeed = 10;
37
- if (InputKey->KeyDownHold(GLFW_KEY_LEFT) == true)
38
- {
39
- mVector = VECTOR_LEFT;
40
100
 
41
- mCol.setEnable(true);
101
+ glm::vec2 mSize;
42
- mCol.setSize(glm::ivec2(Data->mSize.y, Data->mSize.x));
43
102
 
44
- }else if (InputKey->KeyDownHold(GLFW_KEY_RIGHT) == true)
103
+ mSize = end - start; //描画範囲を取得
45
- {
46
- mVector = VECTOR_RIGHT;
47
104
 
48
- mCol.setEnable(true);
49
- mCol.setSize(glm::ivec2(Data->mSize.y, Data->mSize.x));
105
+ if (mSize.x > mPicSize.x)
50
- }
51
- else if (InputKey->KeyDownHold(GLFW_KEY_DOWN) == true)
52
106
  {
53
- mVector = VECTOR_DOWN;
107
+ mSize.x = mPicSize.x;
54
-
55
- mCol.setEnable(true);
56
- mCol.setSize(glm::ivec2(Data->mSize.x, Data->mSize.y));
57
108
  }
58
- else if (InputKey->KeyDownHold(GLFW_KEY_UP) == true)
59
- {
60
- mVector = VECTOR_UP;
61
109
 
62
- mCol.setEnable(true);
63
- mCol.setSize(glm::ivec2(Data->mSize.x, Data->mSize.y));
110
+ if (mSize.y > mPicSize.y)
64
- }
65
- else
66
111
  {
67
- mSpeed = 0;
112
+ mSize.y = mPicSize.y;
68
113
  }
114
+
115
+ //左上が原点になるように修正
116
+ //pos.x = (-SCREEN_WIDTH / 2) + (pos.x);
117
+ //pos.y = (SCREEN_HEIGHT / 2) + (pos.y);
118
+
69
119
 
70
- mPosition += mVector * mSpeed; //速度
120
+ shader->Enable(); //シェーダーを有効にする
121
+ shader->SetFloatUniform_3m("uViewMatrix", getViewMatrix());
122
+ shader->SetFloatUniform_3m("uWorldMatrix", getWorldMatrix());
123
+
71
- mCol.setMove(mVector * mSpeed); //移動座標
124
+ Transform_2D::setTransform_Move(pos); //移動
125
+
126
+ /* // 描画座標の中心に画像を描画
127
+ vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y };
128
+ vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f, start.x / mPicSize.x ,end.y / mPicSize.y };
129
+ vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y };
130
+ vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y };
131
+ vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y };
132
+ vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f, end.x / mPicSize.x ,start.y / mPicSize.y };
133
+ */
134
+
135
+ //左上が原点
136
+ vertex[0] = VertexAttribute_2D{ 0,0, start.x / mPicSize.x ,start.y / mPicSize.y };
137
+ vertex[1] = VertexAttribute_2D{ 0,-mSize.y, start.x / mPicSize.x ,end.y / mPicSize.y };
138
+ vertex[2] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y };
139
+
140
+
141
+ vertex[3] = VertexAttribute_2D{ 0 ,0, start.x / mPicSize.x ,start.y / mPicSize.y };
142
+ vertex[4] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y };
143
+ vertex[5] = VertexAttribute_2D{ mSize.x, 0, end.x / mPicSize.x ,start.y / mPicSize.y };
144
+
145
+
146
+
147
+
148
+ //VAO
149
+ glBindVertexArray(VAO);
150
+
151
+ //VBO
152
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
153
+ glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
154
+
155
+ //頂点座標
156
+ glEnableVertexAttribArray(0);
157
+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL);
158
+
159
+ //UV座標
160
+ glEnableVertexAttribArray(1);
161
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2));
162
+
163
+ glBindVertexArray(VAO);
72
- mCol.setPosition(mPosition); //当たり判定の移動
164
+ glBindTexture(GL_TEXTURE_2D, TextureID);
165
+ glDrawArrays(GL_TRIANGLES, 0, (GLsizei)std::size(vertex));
166
+
73
167
  }
74
168
 
75
169
 
170
+
171
+ // 画像サイズを取得
76
- void Player::Draw()
172
+ glm::vec2 Sprite::getSize()
77
173
  {
78
- //スプライトの角度を変更
79
- if (mVector == VECTOR_LEFT)
174
+ return mPicSize;
80
- {
81
- mSprite->setTransform_Rotate(PI / 2);
82
- mSprite->DrawGraph(mPosition, UV.start, UV.end);
83
- }
175
+ }
84
- else if (mVector == VECTOR_RIGHT)
85
- {
86
- mSprite->setTransform_Rotate(-PI / 2);
87
- mSprite->DrawGraph(mPosition, UV.start, UV.end);
88
- }
89
- else if (mVector == VECTOR_DOWN)
90
- {
91
- mSprite->setTransform_Rotate(PI);
92
- mSprite->DrawGraph(mPosition, UV.start, UV.end);
93
- }
94
- else if (mVector == VECTOR_UP)
95
- {
96
- mSprite->setTransform_Rotate(PI * 2);
97
- mSprite->DrawGraph(mPosition, UV.start, UV.end);
98
- }
99
176
 
100
177
 
178
+ //コンストラクタ
179
+ Sprite::Sprite(const Sprite & sp) : Transform_2D(sp.Owner)
180
+ {
101
- text->RenderText(0,0,1.0,glm::vec3(0,1,0),"Position: %d , %d",mPosition.x, mPosition.y);
181
+ shader = std::make_shared<Shader>(sp.Owner, "Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
182
+ Owner = sp.Owner; //Entryクラス
183
+ mPicSize.x = sp.mPicSize.x;
184
+ mPicSize.y = sp.mPicSize.y;
102
185
 
103
186
  }
104
187
 
105
188
 
189
+ // デストラクタ
106
- Player::~Player()
190
+ Sprite::~Sprite()
107
191
  {
192
+ // バッファを解放
193
+ glDeleteBuffers(1, &VAO);
194
+ glDeleteVertexArrays(1, &VAO);
108
195
 
196
+ glBindVertexArray(0);
197
+ glBindTexture(GL_TEXTURE_2D, 0);
198
+
199
+ glDeleteTextures(1,&TextureID);
200
+
109
201
  }
110
202
 
111
203
  ```
204
+
112
205
  ```cpp
113
206
  #include "../Header/Transform_2D.hpp"
114
207
  #include "../Header/Entry.hpp"
@@ -154,7 +247,7 @@
154
247
  setTransform_Move(m);
155
248
  }
156
249
 
157
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
250
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
158
251
  //回転行列
159
252
  void Transform_2D::setTransform_Rotate(float r)
160
253
  {
@@ -176,7 +269,7 @@
176
269
 
177
270
  mRadian = r;
178
271
  }
179
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
272
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
180
273
  //拡大縮小
181
274
  void Transform_2D::setTransform_Scale(glm::vec2 p)
182
275
  {
@@ -289,179 +382,4 @@
289
382
 
290
383
 
291
384
 
292
- ```
293
-
294
- ```cpp
295
- #include "../Header/Sprite.hpp"
296
- #include "../Header/Shader.hpp"
297
- #include "../Header/Entry.hpp"
298
- #include "../Header/LoadTexture.hpp"
299
- #include "../Header/VertexData.hpp"
300
-
301
- // 数学ライブラリ
302
- #include "glm/ext.hpp"
303
- #include "glm/glm.hpp"
304
-
305
- #include <vector>
306
-
307
- // OpenCV
308
- #include <opencv2/core.hpp>
309
-
310
- /*################################################################################################################
311
- * 画像 描画クラス
312
- ################################################################################################################*/
313
-
314
- //コンストラクタ
315
- /*
316
- * Entry クラス
317
- * テクスチャ パス
318
- * 描画する画像の寸法
319
- */
320
- Sprite::Sprite(class Entry* g, std::shared_ptr<TextureData> sp ) : Transform_2D(g)
321
- {
322
- //shader = new Shader(g, "Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
323
- shader = std::make_shared<class Shader>(g,"Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
324
-
325
- Owner = g;//Entryクラス
326
-
327
- Transform_2D::setTransfrom(glm::vec2(1,1),0,glm::vec2(0,0)); //トランスフォームを初期化
328
-
329
- //テクスチャを設定
330
- glGenTextures(1, &TextureID);
331
- glBindTexture(GL_TEXTURE_2D, TextureID);
332
-
333
- //画像の大きさ
334
- mPicSize.x = (float)sp->mSize.x;
335
- mPicSize.y = (float)sp->mSize.y;
336
-
337
-
338
- // printf("%d\n",sp->mData->size());
339
-
340
-
341
- if (sp->mData->data() != NULL)
342
- {
343
- if (sp->channels == 3)
344
- {
345
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGB, GL_UNSIGNED_BYTE, sp->mData->data());
346
- }
347
- else if (sp->channels == 4)
348
- {
349
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, sp->mData->data());
350
- }
351
- }
352
- else {
353
- std::cerr << "Unable to load texture: " <<std::endl;
354
- }
355
-
356
-
357
- //ミニマップを設定
358
-
359
- //異方性フィルタリングを設定
360
-
361
-
362
-
363
- //VAO
364
-
365
- //VBO
366
-
367
-
368
-
369
- }
370
-
371
- //描画
372
- void Sprite::DrawGraph(glm::ivec2 pos, glm::vec2 start, glm::vec2 end)
373
- {
374
-
375
- glm::vec2 mSize;
376
-
377
- mSize = end - start; //描画範囲を取得
378
-
379
- if (mSize.x > mPicSize.x)
380
- {
381
- mSize.x = mPicSize.x;
382
- }
383
-
384
- if (mSize.y > mPicSize.y)
385
- {
386
- mSize.y = mPicSize.y;
387
- }
388
-
389
- //左上が原点になるように修正
390
- pos.x = (-SCREEN_WIDTH / 2) + (pos.x);
391
- pos.y = (SCREEN_HEIGHT / 2) + (pos.y);
392
-
393
- Transform_2D::UpdateTransform(); //トランスフォームを更新
394
- Transform_2D::setTransform_Move(pos); //移動
395
-
396
- shader->Enable(); //シェーダーを有効にする
397
- shader->SetFloatUniform_3m("uViewMatrix", getViewMatrix());
398
- shader->SetFloatUniform_3m("uWorldMatrix", getWorldMatrix());
399
-
400
-
401
- /* // 描画座標の中心に画像を描画
402
- vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y };
403
- vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f, start.x / mPicSize.x ,end.y / mPicSize.y };
404
- vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y };
405
- vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y };
406
- vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y };
407
- vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f, end.x / mPicSize.x ,start.y / mPicSize.y };
408
- */
409
-
410
- //左上が原点
411
- vertex[0] = VertexAttribute_2D{ 0,0, start.x / mPicSize.x ,start.y / mPicSize.y };
412
- vertex[1] = VertexAttribute_2D{ 0,-mSize.y, start.x / mPicSize.x ,end.y / mPicSize.y };
413
- vertex[2] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y };
414
-
415
- vertex[3] = VertexAttribute_2D{ 0 ,0, start.x / mPicSize.x ,start.y / mPicSize.y };
416
- vertex[4] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y };
417
- vertex[5] = VertexAttribute_2D{ mSize.x, 0, end.x / mPicSize.x ,start.y / mPicSize.y };
418
-
419
-
420
-
421
-
422
- //VAO
423
- glBindVertexArray(VAO);
424
-
425
- //VBO
426
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
427
- glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
428
-
429
- //頂点座標
430
- glEnableVertexAttribArray(0);
431
- glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL);
432
-
433
- //UV座標
434
- glEnableVertexAttribArray(1);
435
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2));
436
-
437
- glBindVertexArray(VAO);
438
- glBindTexture(GL_TEXTURE_2D, TextureID);
439
- glDrawArrays(GL_TRIANGLES, 0, (GLsizei)std::size(vertex));
440
-
441
- }
442
-
443
-
444
-
445
- // 画像サイズを取得
446
- glm::vec2 Sprite::getSize()
447
- {
448
- return mPicSize;
449
- }
450
-
451
-
452
-
453
- // デストラクタ
454
- Sprite::Sprite(const Sprite & sp) : Transform_2D(sp.Owner)
455
- {
456
- //文字数の関係で省略
457
-
458
- }
459
-
460
-
461
- // デストラクタ
462
- Sprite::~Sprite()
463
- {
464
- //文字数の関係で省略
465
- }
466
-
467
385
  ```

5

文章を修正しました。

2021/02/14 06:07

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- 角度を変えるとスプライトが上移動してしまう原因が知りたい。
1
+ 角度を変えるとスプライトが上移動してしまう原因が知りたい。回転行列が上手く動作しない理由が知りたい。
body CHANGED
@@ -1,7 +1,12 @@
1
1
  提示画像ですが移動して左キーを押すと座標はそのままで画像が上に移動してしまうのですがこれは何が原因なのでしょか?画像サイズは
2
- この砲弾の画像の大きさが読み込んでいます。提示コードは原因ではないと思うのですがその場合どういったことが原因と考えられるのでしょうか?
2
+ この砲弾の画像の大きさが読み込んでいます。
3
3
 
4
+ 提示コードの/////コメント部内部のコードですがこのコードのどこが悪いのでしょうか?
4
5
 
6
+
7
+
8
+
9
+
5
10
  ![イメージ説明](f07cf4728e2456086b1864156ebbd36c.jpeg)
6
11
 
7
12
  ```cpp
@@ -149,7 +154,7 @@
149
154
  setTransform_Move(m);
150
155
  }
151
156
 
152
-
157
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
153
158
  //回転行列
154
159
  void Transform_2D::setTransform_Rotate(float r)
155
160
  {
@@ -171,7 +176,7 @@
171
176
 
172
177
  mRadian = r;
173
178
  }
174
-
179
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
175
180
  //拡大縮小
176
181
  void Transform_2D::setTransform_Scale(glm::vec2 p)
177
182
  {

4

文章を修正しました。

2021/02/14 04:55

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -284,4 +284,179 @@
284
284
 
285
285
 
286
286
 
287
+ ```
288
+
289
+ ```cpp
290
+ #include "../Header/Sprite.hpp"
291
+ #include "../Header/Shader.hpp"
292
+ #include "../Header/Entry.hpp"
293
+ #include "../Header/LoadTexture.hpp"
294
+ #include "../Header/VertexData.hpp"
295
+
296
+ // 数学ライブラリ
297
+ #include "glm/ext.hpp"
298
+ #include "glm/glm.hpp"
299
+
300
+ #include <vector>
301
+
302
+ // OpenCV
303
+ #include <opencv2/core.hpp>
304
+
305
+ /*################################################################################################################
306
+ * 画像 描画クラス
307
+ ################################################################################################################*/
308
+
309
+ //コンストラクタ
310
+ /*
311
+ * Entry クラス
312
+ * テクスチャ パス
313
+ * 描画する画像の寸法
314
+ */
315
+ Sprite::Sprite(class Entry* g, std::shared_ptr<TextureData> sp ) : Transform_2D(g)
316
+ {
317
+ //shader = new Shader(g, "Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
318
+ shader = std::make_shared<class Shader>(g,"Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
319
+
320
+ Owner = g;//Entryクラス
321
+
322
+ Transform_2D::setTransfrom(glm::vec2(1,1),0,glm::vec2(0,0)); //トランスフォームを初期化
323
+
324
+ //テクスチャを設定
325
+ glGenTextures(1, &TextureID);
326
+ glBindTexture(GL_TEXTURE_2D, TextureID);
327
+
328
+ //画像の大きさ
329
+ mPicSize.x = (float)sp->mSize.x;
330
+ mPicSize.y = (float)sp->mSize.y;
331
+
332
+
333
+ // printf("%d\n",sp->mData->size());
334
+
335
+
336
+ if (sp->mData->data() != NULL)
337
+ {
338
+ if (sp->channels == 3)
339
+ {
340
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGB, GL_UNSIGNED_BYTE, sp->mData->data());
341
+ }
342
+ else if (sp->channels == 4)
343
+ {
344
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, sp->mData->data());
345
+ }
346
+ }
347
+ else {
348
+ std::cerr << "Unable to load texture: " <<std::endl;
349
+ }
350
+
351
+
352
+ //ミニマップを設定
353
+
354
+ //異方性フィルタリングを設定
355
+
356
+
357
+
358
+ //VAO
359
+
360
+ //VBO
361
+
362
+
363
+
364
+ }
365
+
366
+ //描画
367
+ void Sprite::DrawGraph(glm::ivec2 pos, glm::vec2 start, glm::vec2 end)
368
+ {
369
+
370
+ glm::vec2 mSize;
371
+
372
+ mSize = end - start; //描画範囲を取得
373
+
374
+ if (mSize.x > mPicSize.x)
375
+ {
376
+ mSize.x = mPicSize.x;
377
+ }
378
+
379
+ if (mSize.y > mPicSize.y)
380
+ {
381
+ mSize.y = mPicSize.y;
382
+ }
383
+
384
+ //左上が原点になるように修正
385
+ pos.x = (-SCREEN_WIDTH / 2) + (pos.x);
386
+ pos.y = (SCREEN_HEIGHT / 2) + (pos.y);
387
+
388
+ Transform_2D::UpdateTransform(); //トランスフォームを更新
389
+ Transform_2D::setTransform_Move(pos); //移動
390
+
391
+ shader->Enable(); //シェーダーを有効にする
392
+ shader->SetFloatUniform_3m("uViewMatrix", getViewMatrix());
393
+ shader->SetFloatUniform_3m("uWorldMatrix", getWorldMatrix());
394
+
395
+
396
+ /* // 描画座標の中心に画像を描画
397
+ vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y };
398
+ vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f, start.x / mPicSize.x ,end.y / mPicSize.y };
399
+ vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y };
400
+ vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y };
401
+ vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y };
402
+ vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f, end.x / mPicSize.x ,start.y / mPicSize.y };
403
+ */
404
+
405
+ //左上が原点
406
+ vertex[0] = VertexAttribute_2D{ 0,0, start.x / mPicSize.x ,start.y / mPicSize.y };
407
+ vertex[1] = VertexAttribute_2D{ 0,-mSize.y, start.x / mPicSize.x ,end.y / mPicSize.y };
408
+ vertex[2] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y };
409
+
410
+ vertex[3] = VertexAttribute_2D{ 0 ,0, start.x / mPicSize.x ,start.y / mPicSize.y };
411
+ vertex[4] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y };
412
+ vertex[5] = VertexAttribute_2D{ mSize.x, 0, end.x / mPicSize.x ,start.y / mPicSize.y };
413
+
414
+
415
+
416
+
417
+ //VAO
418
+ glBindVertexArray(VAO);
419
+
420
+ //VBO
421
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
422
+ glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
423
+
424
+ //頂点座標
425
+ glEnableVertexAttribArray(0);
426
+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL);
427
+
428
+ //UV座標
429
+ glEnableVertexAttribArray(1);
430
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2));
431
+
432
+ glBindVertexArray(VAO);
433
+ glBindTexture(GL_TEXTURE_2D, TextureID);
434
+ glDrawArrays(GL_TRIANGLES, 0, (GLsizei)std::size(vertex));
435
+
436
+ }
437
+
438
+
439
+
440
+ // 画像サイズを取得
441
+ glm::vec2 Sprite::getSize()
442
+ {
443
+ return mPicSize;
444
+ }
445
+
446
+
447
+
448
+ // デストラクタ
449
+ Sprite::Sprite(const Sprite & sp) : Transform_2D(sp.Owner)
450
+ {
451
+ //文字数の関係で省略
452
+
453
+ }
454
+
455
+
456
+ // デストラクタ
457
+ Sprite::~Sprite()
458
+ {
459
+ //文字数の関係で省略
460
+ }
461
+
287
462
  ```

3

文章を修正しました。

2021/02/14 04:35

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -103,4 +103,185 @@
103
103
 
104
104
  }
105
105
 
106
+ ```
107
+ ```cpp
108
+ #include "../Header/Transform_2D.hpp"
109
+ #include "../Header/Entry.hpp"
110
+
111
+ //コンストラクタ
112
+ Transform_2D::Transform_2D(class Entry* g)
113
+ {
114
+ Owner = g; //Entryクラス
115
+
116
+ //回転行列を初期化
117
+ mRotate_matrix = glm::mat3(0);
118
+ mRadian = 0;
119
+
120
+ //拡大縮小行列を初期化
121
+ mScale_matrix = glm::mat3(0);
122
+
123
+ //平行移動行列を初期化
124
+ mMove_matrix = glm::mat3(0);
125
+
126
+
127
+ mScale = glm::vec2(1,1); //スケール
128
+ mRadian = 0; //回転
129
+ mMove = glm::vec2(0, 0); //平行移動
130
+
131
+ //初期化
132
+ setTransform_Scale(mScale);
133
+ setTransform_Rotate(mRadian);
134
+ setTransform_Move(mMove);
135
+ }
136
+
137
+ void Transform_2D::UpdateTransform()
138
+ {
139
+ setTransform_Scale(mScale);
140
+ setTransform_Rotate(mRadian);
141
+ setTransform_Move(mMove);
142
+ }
143
+
144
+ // 同時に初期化
145
+ void Transform_2D::setTransfrom(glm::vec2 s, float r, glm::vec2 m)
146
+ {
147
+ setTransform_Scale(s);
148
+ setTransform_Rotate(r);
149
+ setTransform_Move(m);
150
+ }
151
+
152
+
153
+ //回転行列
154
+ void Transform_2D::setTransform_Rotate(float r)
155
+ {
156
+ float sc[9];
157
+ sc[0] = cos(r);
158
+ sc[1] = -sin(r);
159
+ sc[2] = 0;
160
+
161
+ sc[3] = sin(r);
162
+ sc[4] = cos(r);
163
+ sc[5] = 0;
164
+
165
+ sc[6] = 0;
166
+ sc[7] = 0;
167
+ sc[8] = 1;
168
+
169
+ glm::mat3 t = glm::make_mat3(sc);
170
+ mRotate_matrix = t;
171
+
172
+ mRadian = r;
173
+ }
174
+
175
+ //拡大縮小
176
+ void Transform_2D::setTransform_Scale(glm::vec2 p)
177
+ {
178
+ float sc[9];
179
+ sc[0] = p.x;
180
+ sc[1] = 0;
181
+ sc[2] = 0;
182
+
183
+ sc[3] = 0;
184
+ sc[4] = p.y;
185
+ sc[5] = 0;
186
+
187
+ sc[6] = 0;
188
+ sc[7] = 0;
189
+ sc[8] = 1;
190
+
191
+ glm::mat3 t = glm::make_mat3(sc);
192
+ mScale_matrix = t;
193
+ }
194
+
195
+ //平行移動
196
+ void Transform_2D::setTransform_Move(glm::vec2 p)
197
+ {
198
+ float m[9];
199
+
200
+ m[0] = 1;
201
+ m[1] = 0;
202
+ m[2] = p.x;
203
+
204
+ m[3] = 0;
205
+ m[4] = 1;
206
+ m[5] = p.y;
207
+
208
+ m[6] = 0;
209
+ m[7] = 0;
210
+ m[8] = 1;
211
+
212
+
213
+ glm::mat3 tt = glm::make_mat3(m);
214
+ mMove_matrix = tt;
215
+
216
+ mMove = p;
217
+
218
+ }
219
+
220
+ //回転
221
+ glm::mat3 Transform_2D::getRotate()
222
+ {
223
+ return mRotate_matrix;
224
+ }
225
+
226
+ //平行移動
227
+ glm::mat3 Transform_2D::getMove()
228
+ {
229
+ return mMove_matrix;
230
+ }
231
+ //拡大縮小
232
+ glm::mat3 Transform_2D::getScale()
233
+ {
234
+ return mScale_matrix;
235
+ }
236
+
237
+
238
+ float Transform_2D::getTransform_getRotate()
239
+ {
240
+ return mRadian;
241
+ }
242
+
243
+ glm::vec2 Transform_2D::getTransform_Scale()
244
+ {
245
+ return mScale;
246
+ }
247
+
248
+ glm::vec2 Transform_2D::getTransform_Move()
249
+ {
250
+ return mMove;
251
+ }
252
+
253
+
254
+
255
+ //ワールド行列
256
+ glm::mat3 Transform_2D::getWorldMatrix()
257
+ {
258
+ glm::mat3 r = mScale_matrix * mRotate_matrix * mMove_matrix;
259
+
260
+ return r;
261
+ }
262
+
263
+ //ビュー行列
264
+ glm::mat3 Transform_2D::getViewMatrix()
265
+ {
266
+ //ビュー行列
267
+ float sv[9];
268
+ sv[0] = (2.0f / SCREEN_WIDTH);
269
+ sv[1] = 0.0f;
270
+ sv[2] = 0.0f;
271
+
272
+ sv[3] = 0.0f;
273
+ sv[4] = (2.0f / SCREEN_HEIGHT);
274
+ sv[5] = 0.0f;
275
+
276
+ sv[6] = 0.0f;
277
+ sv[7] = 0.0f;
278
+ sv[8] = 1.0f;
279
+
280
+ ViewMatrix = glm::make_mat3(sv);
281
+
282
+ return ViewMatrix;
283
+ }
284
+
285
+
286
+
106
287
  ```

2

文章を修正しました。

2021/02/14 04:25

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,5 @@
1
1
  提示画像ですが移動して左キーを押すと座標はそのままで画像が上に移動してしまうのですがこれは何が原因なのでしょか?画像サイズは
2
- この砲弾の画像の大きさが読み込んで居るため透明な部分だけ実は多わけではありせん。提示コードは原因ではないと思うのですがその場合どういったことが原因と考えられるのでしょうか?
2
+ この砲弾の画像の大きさが読み込んでいま。提示コードは原因ではないと思うのですがその場合どういったことが原因と考えられるのでしょうか?
3
3
 
4
4
 
5
5
  ![イメージ説明](f07cf4728e2456086b1864156ebbd36c.jpeg)

1

文章を修正しました。

2021/02/14 03:52

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,5 @@
1
1
  提示画像ですが移動して左キーを押すと座標はそのままで画像が上に移動してしまうのですがこれは何が原因なのでしょか?画像サイズは
2
- この砲弾の画像の大きさが読み込んで居るため透明な部分だけ実は多いわけではありません。
2
+ この砲弾の画像の大きさが読み込んで居るため透明な部分だけ実は多いわけではありません。提示コードは原因ではないと思うのですがその場合どういったことが原因と考えられるのでしょうか?
3
3
 
4
4
 
5
5
  ![イメージ説明](f07cf4728e2456086b1864156ebbd36c.jpeg)