質問編集履歴

9

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

2021/02/15 12:21

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 回転行列が上手く動作しない理由が知りたい。
1
+ 回転行列が上手く動作しない理由が知りたい。 中心を中心回転させたい。
test CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  提示コードの/////コメント部の内部の回転行列の行列部が悪いと思うのですが何を間違えてのでしょうか?よく考えましたがどうしてもわかりません。
4
4
 
5
+ 描画原点を中心に回転してしまうのですがどうすれば中心を中心に回転するのでしょうか?
6
+
5
7
 
6
8
 
7
9
  ![イメージ説明](f7fe39f105cbaea7da487f34f363a1a4.jpeg)

8

提示画像を追加

2021/02/15 12:21

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -4,13 +4,9 @@
4
4
 
5
5
 
6
6
 
7
-
8
-
9
-
10
-
11
- ![イメージ説明](f07cf4728e2456086b1864156ebbd36c.jpeg)
7
+ ![イメージ説明](f7fe39f105cbaea7da487f34f363a1a4.jpeg)
8
+
12
-
9
+ ![イメージ説明](232632d2443ecdc9faa76fec5c521354.jpeg)
13
-
14
10
 
15
11
 
16
12
 

7

文章を修正しました。

2021/02/15 11:14

投稿

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

6

文章を修正しました。

2021/02/15 10:42

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,14 +1,6 @@
1
- 提示画像ですが移動して左キーを押すと座標はそのままで画像が上に移動してしまうのですがこれは何が原因なのでしょか?画像サイズは
1
+ 提示画像ですが移動して左キーを押すと座標はそのままで画像が上に移動してしまうのですがこれは何が原因なのでしょか?画像サイズはこの砲弾の画像の大きさが読み込んでいます。22,28
2
-
3
- この砲弾の画像の大きさが読み込んでいます。
2
+
4
-
5
-
6
-
7
- 提示コードの/////コメント部内部のコードですがこコードのどこが悪いのでしょうか?
3
+ 提示コードの/////コメント部内部の回転行列行列部が悪いと思うのですが何を間違えてのでしょうか?よく考えましたがどうしてもわかりません。
8
-
9
-
10
-
11
-
12
4
 
13
5
 
14
6
 
@@ -20,197 +12,389 @@
20
12
 
21
13
 
22
14
 
15
+
16
+
23
17
  ```cpp
24
18
 
19
+ #include "../Header/Sprite.hpp"
20
+
25
- #include "../../Header/Game/Player.hpp"
21
+ #include "../Header/Shader.hpp"
22
+
23
+ #include "../Header/Entry.hpp"
24
+
25
+ #include "../Header/LoadTexture.hpp"
26
+
27
+ #include "../Header/VertexData.hpp"
28
+
29
+
30
+
31
+ // 数学ライブラリ
32
+
33
+ #include "glm/ext.hpp"
34
+
35
+ #include "glm/glm.hpp"
36
+
37
+
38
+
39
+ #include <vector>
40
+
41
+
42
+
43
+ // OpenCV
44
+
45
+ #include <opencv2/core.hpp>
46
+
47
+
48
+
49
+ /*################################################################################################################
50
+
51
+ * 画像 描画クラス
52
+
53
+ ################################################################################################################*/
26
54
 
27
55
 
28
56
 
29
57
  //コンストラクタ
30
58
 
59
+ /*
60
+
61
+ * Entry クラス
62
+
63
+ * テクスチャ パス
64
+
65
+ * 描画する画像の寸法
66
+
67
+ */
68
+
31
- Player::Player(Entry* e) : Actor_2D()
69
+ Sprite::Sprite(class Entry* g, std::shared_ptr<TextureData> sp ) : Transform_2D(g)
32
-
70
+
33
- {
71
+ {
72
+
34
-
73
+ shader = std::make_shared<class Shader>(g,"Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
74
+
75
+
76
+
35
-
77
+ Owner = g;//Entryクラス
36
-
78
+
79
+
80
+
37
- mPosition = glm::ivec2(100, -100); //座標
81
+ Transform_2D::setTransfrom(glm::vec2(1,1),0,glm::vec2(0,0)); //トランスフォームを初期化
82
+
83
+
84
+
38
-
85
+ //テクスチャを設定
86
+
87
+ glGenTextures(1, &TextureID);
88
+
39
- mVector = VECTOR_UP; //方向
89
+ glBindTexture(GL_TEXTURE_2D, TextureID);
40
-
41
-
42
-
43
- InputKey = std::make_shared<Input>(e); //キー入力
90
+
44
-
45
- text = std::make_shared<Text>(e); //テキスト表示
91
+
46
-
47
-
48
-
92
+
49
- //スプライト
93
+ //画像の大きさ
50
-
51
- Data = LoadTexture("Assets/Bullet.png");
94
+
52
-
53
- mSprite = std::make_shared<Sprite>(e, Data);
95
+ mPicSize.x = (float)sp->mSize.x;
96
+
54
-
97
+ mPicSize.y = (float)sp->mSize.y;
98
+
99
+
100
+
101
+
102
+
55
- UV =TextureUV{ glm::ivec2(0,0), glm::ivec2(Data->mSize.x,Data->mSize.y) };
103
+ // printf("%d\n",sp->mData->size());
56
-
57
- }
104
+
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
- void Player::Update()
105
+
66
-
67
- {
106
+
68
-
69
- //移動
107
+
70
-
71
- mSpeed = 10;
108
+
72
-
73
- if (InputKey->KeyDownHold(GLFW_KEY_LEFT) == true)
109
+ if (sp->mData->data() != NULL)
74
110
 
75
111
  {
76
112
 
113
+ if (sp->channels == 3)
114
+
115
+ {
116
+
117
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGB, GL_UNSIGNED_BYTE, sp->mData->data());
118
+
119
+ }
120
+
121
+ else if (sp->channels == 4)
122
+
123
+ {
124
+
125
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, sp->mData->data());
126
+
127
+ }
128
+
129
+ }
130
+
131
+ else {
132
+
133
+ std::cerr << "Unable to load texture: " <<std::endl;
134
+
135
+ }
136
+
137
+
138
+
139
+
140
+
141
+ //ミニマップを設定
142
+
143
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
144
+
145
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
146
+
77
- mVector = VECTOR_LEFT;
147
+ glGenerateMipmap(GL_TEXTURE_2D);
148
+
149
+
150
+
78
-
151
+ //異方性フィルタリングを設定
79
-
80
-
152
+
81
- mCol.setEnable(true);
153
+ GLfloat largest;
154
+
82
-
155
+ glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest);
156
+
157
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest);
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+ //VAO
168
+
169
+ glGenVertexArrays(1, &VAO);
170
+
171
+ glBindVertexArray(VAO);
172
+
173
+
174
+
175
+ //VBO
176
+
177
+ glGenBuffers(1, &VBO);
178
+
179
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
180
+
181
+ glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
182
+
183
+
184
+
185
+
186
+
187
+
188
+
189
+ }
190
+
191
+
192
+
193
+ //描画
194
+
83
- mCol.setSize(glm::ivec2(Data->mSize.y, Data->mSize.x));
195
+ void Sprite::DrawGraph(glm::ivec2 pos, glm::vec2 start, glm::vec2 end)
196
+
84
-
197
+ {
198
+
199
+
200
+
85
-
201
+ glm::vec2 mSize;
86
-
202
+
203
+
204
+
87
- }else if (InputKey->KeyDownHold(GLFW_KEY_RIGHT) == true)
205
+ mSize = end - start; //描画範囲を取得
206
+
207
+
208
+
209
+ if (mSize.x > mPicSize.x)
88
210
 
89
211
  {
90
212
 
91
- mVector = VECTOR_RIGHT;
213
+ mSize.x = mPicSize.x;
92
-
93
-
94
-
95
- mCol.setEnable(true);
96
-
97
- mCol.setSize(glm::ivec2(Data->mSize.y, Data->mSize.x));
98
214
 
99
215
  }
100
216
 
217
+
218
+
101
- else if (InputKey->KeyDownHold(GLFW_KEY_DOWN) == true)
219
+ if (mSize.y > mPicSize.y)
102
220
 
103
221
  {
104
222
 
105
- mVector = VECTOR_DOWN;
223
+ mSize.y = mPicSize.y;
106
-
107
-
108
-
109
- mCol.setEnable(true);
110
-
111
- mCol.setSize(glm::ivec2(Data->mSize.x, Data->mSize.y));
112
224
 
113
225
  }
114
226
 
227
+
228
+
229
+ //左上が原点になるように修正
230
+
231
+ //pos.x = (-SCREEN_WIDTH / 2) + (pos.x);
232
+
115
- else if (InputKey->KeyDownHold(GLFW_KEY_UP) == true)
233
+ //pos.y = (SCREEN_HEIGHT / 2) + (pos.y);
116
-
117
- {
234
+
118
-
119
- mVector = VECTOR_UP;
235
+
120
-
121
-
122
-
123
- mCol.setEnable(true);
124
-
125
- mCol.setSize(glm::ivec2(Data->mSize.x, Data->mSize.y));
126
-
127
- }
128
-
129
- else
130
-
131
- {
132
-
133
- mSpeed = 0;
134
-
135
- }
136
236
 
137
237
 
138
238
 
139
- mPosition += mVector * mSpeed; //速度
140
-
141
- mCol.setMove(mVector * mSpeed); //移動座標
142
-
143
- mCol.setPosition(mPosition); //当たり判定の移動
144
-
145
- }
146
-
147
-
148
-
149
-
150
-
151
- void Player::Draw()
152
-
153
- {
154
-
155
- //スプライトの角度を変更
156
-
157
- if (mVector == VECTOR_LEFT)
158
-
159
- {
160
-
161
- mSprite->setTransform_Rotate(PI / 2);
162
-
163
- mSprite->DrawGraph(mPosition, UV.start, UV.end);
164
-
165
- }
166
-
167
- else if (mVector == VECTOR_RIGHT)
168
-
169
- {
170
-
171
- mSprite->setTransform_Rotate(-PI / 2);
172
-
173
- mSprite->DrawGraph(mPosition, UV.start, UV.end);
174
-
175
- }
176
-
177
- else if (mVector == VECTOR_DOWN)
178
-
179
- {
180
-
181
- mSprite->setTransform_Rotate(PI);
182
-
183
- mSprite->DrawGraph(mPosition, UV.start, UV.end);
184
-
185
- }
186
-
187
- else if (mVector == VECTOR_UP)
188
-
189
- {
190
-
191
- mSprite->setTransform_Rotate(PI * 2);
192
-
193
- mSprite->DrawGraph(mPosition, UV.start, UV.end);
194
-
195
- }
196
-
197
-
198
-
199
-
200
-
201
- text->RenderText(0,0,1.0,glm::vec3(0,1,0),"Position: %d , %d",mPosition.x, mPosition.y);
202
-
203
-
204
-
205
- }
206
-
207
-
208
-
209
-
210
-
211
- Player::~Player()
212
-
213
- {
239
+ shader->Enable(); //シェーダーを有効にする
240
+
241
+ shader->SetFloatUniform_3m("uViewMatrix", getViewMatrix());
242
+
243
+ shader->SetFloatUniform_3m("uWorldMatrix", getWorldMatrix());
244
+
245
+
246
+
247
+ Transform_2D::setTransform_Move(pos); //移動
248
+
249
+
250
+
251
+ /* // 描画座標の中心に画像を描画
252
+
253
+ vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y };
254
+
255
+ vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f, start.x / mPicSize.x ,end.y / mPicSize.y };
256
+
257
+ vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y };
258
+
259
+ vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y };
260
+
261
+ vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y };
262
+
263
+ vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f, end.x / mPicSize.x ,start.y / mPicSize.y };
264
+
265
+ */
266
+
267
+
268
+
269
+ //左上が原点
270
+
271
+ vertex[0] = VertexAttribute_2D{ 0,0, start.x / mPicSize.x ,start.y / mPicSize.y };
272
+
273
+ vertex[1] = VertexAttribute_2D{ 0,-mSize.y, start.x / mPicSize.x ,end.y / mPicSize.y };
274
+
275
+ vertex[2] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y };
276
+
277
+
278
+
279
+
280
+
281
+ vertex[3] = VertexAttribute_2D{ 0 ,0, start.x / mPicSize.x ,start.y / mPicSize.y };
282
+
283
+ vertex[4] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y };
284
+
285
+ vertex[5] = VertexAttribute_2D{ mSize.x, 0, end.x / mPicSize.x ,start.y / mPicSize.y };
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+ //VAO
296
+
297
+ glBindVertexArray(VAO);
298
+
299
+
300
+
301
+ //VBO
302
+
303
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
304
+
305
+ glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
306
+
307
+
308
+
309
+ //頂点座標
310
+
311
+ glEnableVertexAttribArray(0);
312
+
313
+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL);
314
+
315
+
316
+
317
+ //UV座標
318
+
319
+ glEnableVertexAttribArray(1);
320
+
321
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2));
322
+
323
+
324
+
325
+ glBindVertexArray(VAO);
326
+
327
+ glBindTexture(GL_TEXTURE_2D, TextureID);
328
+
329
+ glDrawArrays(GL_TRIANGLES, 0, (GLsizei)std::size(vertex));
330
+
331
+
332
+
333
+ }
334
+
335
+
336
+
337
+
338
+
339
+
340
+
341
+ // 画像サイズを取得
342
+
343
+ glm::vec2 Sprite::getSize()
344
+
345
+ {
346
+
347
+ return mPicSize;
348
+
349
+ }
350
+
351
+
352
+
353
+
354
+
355
+ //コンストラクタ
356
+
357
+ Sprite::Sprite(const Sprite & sp) : Transform_2D(sp.Owner)
358
+
359
+ {
360
+
361
+ shader = std::make_shared<Shader>(sp.Owner, "Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
362
+
363
+ Owner = sp.Owner; //Entryクラス
364
+
365
+ mPicSize.x = sp.mPicSize.x;
366
+
367
+ mPicSize.y = sp.mPicSize.y;
368
+
369
+
370
+
371
+ }
372
+
373
+
374
+
375
+
376
+
377
+ // デストラクタ
378
+
379
+ Sprite::~Sprite()
380
+
381
+ {
382
+
383
+ // バッファを解放
384
+
385
+ glDeleteBuffers(1, &VAO);
386
+
387
+ glDeleteVertexArrays(1, &VAO);
388
+
389
+
390
+
391
+ glBindVertexArray(0);
392
+
393
+ glBindTexture(GL_TEXTURE_2D, 0);
394
+
395
+
396
+
397
+ glDeleteTextures(1,&TextureID);
214
398
 
215
399
 
216
400
 
@@ -220,6 +404,8 @@
220
404
 
221
405
  ```
222
406
 
407
+
408
+
223
409
  ```cpp
224
410
 
225
411
  #include "../Header/Transform_2D.hpp"
@@ -310,7 +496,7 @@
310
496
 
311
497
 
312
498
 
313
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
499
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
314
500
 
315
501
  //回転行列
316
502
 
@@ -354,7 +540,7 @@
354
540
 
355
541
  }
356
542
 
357
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
543
+ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
358
544
 
359
545
  //拡大縮小
360
546
 
@@ -581,353 +767,3 @@
581
767
 
582
768
 
583
769
  ```
584
-
585
-
586
-
587
- ```cpp
588
-
589
- #include "../Header/Sprite.hpp"
590
-
591
- #include "../Header/Shader.hpp"
592
-
593
- #include "../Header/Entry.hpp"
594
-
595
- #include "../Header/LoadTexture.hpp"
596
-
597
- #include "../Header/VertexData.hpp"
598
-
599
-
600
-
601
- // 数学ライブラリ
602
-
603
- #include "glm/ext.hpp"
604
-
605
- #include "glm/glm.hpp"
606
-
607
-
608
-
609
- #include <vector>
610
-
611
-
612
-
613
- // OpenCV
614
-
615
- #include <opencv2/core.hpp>
616
-
617
-
618
-
619
- /*################################################################################################################
620
-
621
- * 画像 描画クラス
622
-
623
- ################################################################################################################*/
624
-
625
-
626
-
627
- //コンストラクタ
628
-
629
- /*
630
-
631
- * Entry クラス
632
-
633
- * テクスチャ パス
634
-
635
- * 描画する画像の寸法
636
-
637
- */
638
-
639
- Sprite::Sprite(class Entry* g, std::shared_ptr<TextureData> sp ) : Transform_2D(g)
640
-
641
- {
642
-
643
- //shader = new Shader(g, "Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
644
-
645
- shader = std::make_shared<class Shader>(g,"Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
646
-
647
-
648
-
649
- Owner = g;//Entryクラス
650
-
651
-
652
-
653
- Transform_2D::setTransfrom(glm::vec2(1,1),0,glm::vec2(0,0)); //トランスフォームを初期化
654
-
655
-
656
-
657
- //テクスチャを設定
658
-
659
- glGenTextures(1, &TextureID);
660
-
661
- glBindTexture(GL_TEXTURE_2D, TextureID);
662
-
663
-
664
-
665
- //画像の大きさ
666
-
667
- mPicSize.x = (float)sp->mSize.x;
668
-
669
- mPicSize.y = (float)sp->mSize.y;
670
-
671
-
672
-
673
-
674
-
675
- // printf("%d\n",sp->mData->size());
676
-
677
-
678
-
679
-
680
-
681
- if (sp->mData->data() != NULL)
682
-
683
- {
684
-
685
- if (sp->channels == 3)
686
-
687
- {
688
-
689
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGB, GL_UNSIGNED_BYTE, sp->mData->data());
690
-
691
- }
692
-
693
- else if (sp->channels == 4)
694
-
695
- {
696
-
697
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, sp->mData->data());
698
-
699
- }
700
-
701
- }
702
-
703
- else {
704
-
705
- std::cerr << "Unable to load texture: " <<std::endl;
706
-
707
- }
708
-
709
-
710
-
711
-
712
-
713
- //ミニマップを設定
714
-
715
-
716
-
717
- //異方性フィルタリングを設定
718
-
719
-
720
-
721
-
722
-
723
-
724
-
725
- //VAO
726
-
727
-
728
-
729
- //VBO
730
-
731
-
732
-
733
-
734
-
735
-
736
-
737
- }
738
-
739
-
740
-
741
- //描画
742
-
743
- void Sprite::DrawGraph(glm::ivec2 pos, glm::vec2 start, glm::vec2 end)
744
-
745
- {
746
-
747
-
748
-
749
- glm::vec2 mSize;
750
-
751
-
752
-
753
- mSize = end - start; //描画範囲を取得
754
-
755
-
756
-
757
- if (mSize.x > mPicSize.x)
758
-
759
- {
760
-
761
- mSize.x = mPicSize.x;
762
-
763
- }
764
-
765
-
766
-
767
- if (mSize.y > mPicSize.y)
768
-
769
- {
770
-
771
- mSize.y = mPicSize.y;
772
-
773
- }
774
-
775
-
776
-
777
- //左上が原点になるように修正
778
-
779
- pos.x = (-SCREEN_WIDTH / 2) + (pos.x);
780
-
781
- pos.y = (SCREEN_HEIGHT / 2) + (pos.y);
782
-
783
-
784
-
785
- Transform_2D::UpdateTransform(); //トランスフォームを更新
786
-
787
- Transform_2D::setTransform_Move(pos); //移動
788
-
789
-
790
-
791
- shader->Enable(); //シェーダーを有効にする
792
-
793
- shader->SetFloatUniform_3m("uViewMatrix", getViewMatrix());
794
-
795
- shader->SetFloatUniform_3m("uWorldMatrix", getWorldMatrix());
796
-
797
-
798
-
799
-
800
-
801
- /* // 描画座標の中心に画像を描画
802
-
803
- vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y };
804
-
805
- vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f, start.x / mPicSize.x ,end.y / mPicSize.y };
806
-
807
- vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y };
808
-
809
- vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y };
810
-
811
- vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y };
812
-
813
- vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f, end.x / mPicSize.x ,start.y / mPicSize.y };
814
-
815
- */
816
-
817
-
818
-
819
- //左上が原点
820
-
821
- vertex[0] = VertexAttribute_2D{ 0,0, start.x / mPicSize.x ,start.y / mPicSize.y };
822
-
823
- vertex[1] = VertexAttribute_2D{ 0,-mSize.y, start.x / mPicSize.x ,end.y / mPicSize.y };
824
-
825
- vertex[2] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y };
826
-
827
-
828
-
829
- vertex[3] = VertexAttribute_2D{ 0 ,0, start.x / mPicSize.x ,start.y / mPicSize.y };
830
-
831
- vertex[4] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y };
832
-
833
- vertex[5] = VertexAttribute_2D{ mSize.x, 0, end.x / mPicSize.x ,start.y / mPicSize.y };
834
-
835
-
836
-
837
-
838
-
839
-
840
-
841
-
842
-
843
- //VAO
844
-
845
- glBindVertexArray(VAO);
846
-
847
-
848
-
849
- //VBO
850
-
851
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
852
-
853
- glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
854
-
855
-
856
-
857
- //頂点座標
858
-
859
- glEnableVertexAttribArray(0);
860
-
861
- glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL);
862
-
863
-
864
-
865
- //UV座標
866
-
867
- glEnableVertexAttribArray(1);
868
-
869
- glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2));
870
-
871
-
872
-
873
- glBindVertexArray(VAO);
874
-
875
- glBindTexture(GL_TEXTURE_2D, TextureID);
876
-
877
- glDrawArrays(GL_TRIANGLES, 0, (GLsizei)std::size(vertex));
878
-
879
-
880
-
881
- }
882
-
883
-
884
-
885
-
886
-
887
-
888
-
889
- // 画像サイズを取得
890
-
891
- glm::vec2 Sprite::getSize()
892
-
893
- {
894
-
895
- return mPicSize;
896
-
897
- }
898
-
899
-
900
-
901
-
902
-
903
-
904
-
905
- // デストラクタ
906
-
907
- Sprite::Sprite(const Sprite & sp) : Transform_2D(sp.Owner)
908
-
909
- {
910
-
911
- //文字数の関係で省略
912
-
913
-
914
-
915
- }
916
-
917
-
918
-
919
-
920
-
921
- // デストラクタ
922
-
923
- Sprite::~Sprite()
924
-
925
- {
926
-
927
- //文字数の関係で省略
928
-
929
- }
930
-
931
-
932
-
933
- ```

5

文章を修正しました。

2021/02/14 06:07

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 角度を変えるとスプライトが上移動してしまう原因が知りたい。
1
+ 角度を変えるとスプライトが上移動してしまう原因が知りたい。回転行列が上手く動作しない理由が知りたい。
test CHANGED
@@ -1,6 +1,16 @@
1
1
  提示画像ですが移動して左キーを押すと座標はそのままで画像が上に移動してしまうのですがこれは何が原因なのでしょか?画像サイズは
2
2
 
3
+ この砲弾の画像の大きさが読み込んでいます。
4
+
5
+
6
+
3
- この砲弾の画像の大きさが読み込んでいます。提示コードは原因ではないと思うのですが場合ういった原因と考えられるのでしょうか?
7
+ 提示コードの/////コメント部内部のコードですがコードのどこが悪いのでしょうか?
8
+
9
+
10
+
11
+
12
+
13
+
4
14
 
5
15
 
6
16
 
@@ -300,7 +310,7 @@
300
310
 
301
311
 
302
312
 
303
-
313
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
304
314
 
305
315
  //回転行列
306
316
 
@@ -344,7 +354,7 @@
344
354
 
345
355
  }
346
356
 
347
-
357
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
348
358
 
349
359
  //拡大縮小
350
360
 

4

文章を修正しました。

2021/02/14 04:55

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -571,3 +571,353 @@
571
571
 
572
572
 
573
573
  ```
574
+
575
+
576
+
577
+ ```cpp
578
+
579
+ #include "../Header/Sprite.hpp"
580
+
581
+ #include "../Header/Shader.hpp"
582
+
583
+ #include "../Header/Entry.hpp"
584
+
585
+ #include "../Header/LoadTexture.hpp"
586
+
587
+ #include "../Header/VertexData.hpp"
588
+
589
+
590
+
591
+ // 数学ライブラリ
592
+
593
+ #include "glm/ext.hpp"
594
+
595
+ #include "glm/glm.hpp"
596
+
597
+
598
+
599
+ #include <vector>
600
+
601
+
602
+
603
+ // OpenCV
604
+
605
+ #include <opencv2/core.hpp>
606
+
607
+
608
+
609
+ /*################################################################################################################
610
+
611
+ * 画像 描画クラス
612
+
613
+ ################################################################################################################*/
614
+
615
+
616
+
617
+ //コンストラクタ
618
+
619
+ /*
620
+
621
+ * Entry クラス
622
+
623
+ * テクスチャ パス
624
+
625
+ * 描画する画像の寸法
626
+
627
+ */
628
+
629
+ Sprite::Sprite(class Entry* g, std::shared_ptr<TextureData> sp ) : Transform_2D(g)
630
+
631
+ {
632
+
633
+ //shader = new Shader(g, "Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
634
+
635
+ shader = std::make_shared<class Shader>(g,"Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
636
+
637
+
638
+
639
+ Owner = g;//Entryクラス
640
+
641
+
642
+
643
+ Transform_2D::setTransfrom(glm::vec2(1,1),0,glm::vec2(0,0)); //トランスフォームを初期化
644
+
645
+
646
+
647
+ //テクスチャを設定
648
+
649
+ glGenTextures(1, &TextureID);
650
+
651
+ glBindTexture(GL_TEXTURE_2D, TextureID);
652
+
653
+
654
+
655
+ //画像の大きさ
656
+
657
+ mPicSize.x = (float)sp->mSize.x;
658
+
659
+ mPicSize.y = (float)sp->mSize.y;
660
+
661
+
662
+
663
+
664
+
665
+ // printf("%d\n",sp->mData->size());
666
+
667
+
668
+
669
+
670
+
671
+ if (sp->mData->data() != NULL)
672
+
673
+ {
674
+
675
+ if (sp->channels == 3)
676
+
677
+ {
678
+
679
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGB, GL_UNSIGNED_BYTE, sp->mData->data());
680
+
681
+ }
682
+
683
+ else if (sp->channels == 4)
684
+
685
+ {
686
+
687
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, sp->mData->data());
688
+
689
+ }
690
+
691
+ }
692
+
693
+ else {
694
+
695
+ std::cerr << "Unable to load texture: " <<std::endl;
696
+
697
+ }
698
+
699
+
700
+
701
+
702
+
703
+ //ミニマップを設定
704
+
705
+
706
+
707
+ //異方性フィルタリングを設定
708
+
709
+
710
+
711
+
712
+
713
+
714
+
715
+ //VAO
716
+
717
+
718
+
719
+ //VBO
720
+
721
+
722
+
723
+
724
+
725
+
726
+
727
+ }
728
+
729
+
730
+
731
+ //描画
732
+
733
+ void Sprite::DrawGraph(glm::ivec2 pos, glm::vec2 start, glm::vec2 end)
734
+
735
+ {
736
+
737
+
738
+
739
+ glm::vec2 mSize;
740
+
741
+
742
+
743
+ mSize = end - start; //描画範囲を取得
744
+
745
+
746
+
747
+ if (mSize.x > mPicSize.x)
748
+
749
+ {
750
+
751
+ mSize.x = mPicSize.x;
752
+
753
+ }
754
+
755
+
756
+
757
+ if (mSize.y > mPicSize.y)
758
+
759
+ {
760
+
761
+ mSize.y = mPicSize.y;
762
+
763
+ }
764
+
765
+
766
+
767
+ //左上が原点になるように修正
768
+
769
+ pos.x = (-SCREEN_WIDTH / 2) + (pos.x);
770
+
771
+ pos.y = (SCREEN_HEIGHT / 2) + (pos.y);
772
+
773
+
774
+
775
+ Transform_2D::UpdateTransform(); //トランスフォームを更新
776
+
777
+ Transform_2D::setTransform_Move(pos); //移動
778
+
779
+
780
+
781
+ shader->Enable(); //シェーダーを有効にする
782
+
783
+ shader->SetFloatUniform_3m("uViewMatrix", getViewMatrix());
784
+
785
+ shader->SetFloatUniform_3m("uWorldMatrix", getWorldMatrix());
786
+
787
+
788
+
789
+
790
+
791
+ /* // 描画座標の中心に画像を描画
792
+
793
+ vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y };
794
+
795
+ vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f, start.x / mPicSize.x ,end.y / mPicSize.y };
796
+
797
+ vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y };
798
+
799
+ vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y };
800
+
801
+ vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y };
802
+
803
+ vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f, end.x / mPicSize.x ,start.y / mPicSize.y };
804
+
805
+ */
806
+
807
+
808
+
809
+ //左上が原点
810
+
811
+ vertex[0] = VertexAttribute_2D{ 0,0, start.x / mPicSize.x ,start.y / mPicSize.y };
812
+
813
+ vertex[1] = VertexAttribute_2D{ 0,-mSize.y, start.x / mPicSize.x ,end.y / mPicSize.y };
814
+
815
+ vertex[2] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y };
816
+
817
+
818
+
819
+ vertex[3] = VertexAttribute_2D{ 0 ,0, start.x / mPicSize.x ,start.y / mPicSize.y };
820
+
821
+ vertex[4] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y };
822
+
823
+ vertex[5] = VertexAttribute_2D{ mSize.x, 0, end.x / mPicSize.x ,start.y / mPicSize.y };
824
+
825
+
826
+
827
+
828
+
829
+
830
+
831
+
832
+
833
+ //VAO
834
+
835
+ glBindVertexArray(VAO);
836
+
837
+
838
+
839
+ //VBO
840
+
841
+ glBindBuffer(GL_ARRAY_BUFFER, VBO);
842
+
843
+ glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
844
+
845
+
846
+
847
+ //頂点座標
848
+
849
+ glEnableVertexAttribArray(0);
850
+
851
+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL);
852
+
853
+
854
+
855
+ //UV座標
856
+
857
+ glEnableVertexAttribArray(1);
858
+
859
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2));
860
+
861
+
862
+
863
+ glBindVertexArray(VAO);
864
+
865
+ glBindTexture(GL_TEXTURE_2D, TextureID);
866
+
867
+ glDrawArrays(GL_TRIANGLES, 0, (GLsizei)std::size(vertex));
868
+
869
+
870
+
871
+ }
872
+
873
+
874
+
875
+
876
+
877
+
878
+
879
+ // 画像サイズを取得
880
+
881
+ glm::vec2 Sprite::getSize()
882
+
883
+ {
884
+
885
+ return mPicSize;
886
+
887
+ }
888
+
889
+
890
+
891
+
892
+
893
+
894
+
895
+ // デストラクタ
896
+
897
+ Sprite::Sprite(const Sprite & sp) : Transform_2D(sp.Owner)
898
+
899
+ {
900
+
901
+ //文字数の関係で省略
902
+
903
+
904
+
905
+ }
906
+
907
+
908
+
909
+
910
+
911
+ // デストラクタ
912
+
913
+ Sprite::~Sprite()
914
+
915
+ {
916
+
917
+ //文字数の関係で省略
918
+
919
+ }
920
+
921
+
922
+
923
+ ```

3

文章を修正しました。

2021/02/14 04:35

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -209,3 +209,365 @@
209
209
 
210
210
 
211
211
  ```
212
+
213
+ ```cpp
214
+
215
+ #include "../Header/Transform_2D.hpp"
216
+
217
+ #include "../Header/Entry.hpp"
218
+
219
+
220
+
221
+ //コンストラクタ
222
+
223
+ Transform_2D::Transform_2D(class Entry* g)
224
+
225
+ {
226
+
227
+ Owner = g; //Entryクラス
228
+
229
+
230
+
231
+ //回転行列を初期化
232
+
233
+ mRotate_matrix = glm::mat3(0);
234
+
235
+ mRadian = 0;
236
+
237
+
238
+
239
+ //拡大縮小行列を初期化
240
+
241
+ mScale_matrix = glm::mat3(0);
242
+
243
+
244
+
245
+ //平行移動行列を初期化
246
+
247
+ mMove_matrix = glm::mat3(0);
248
+
249
+
250
+
251
+
252
+
253
+ mScale = glm::vec2(1,1); //スケール
254
+
255
+ mRadian = 0; //回転
256
+
257
+ mMove = glm::vec2(0, 0); //平行移動
258
+
259
+
260
+
261
+ //初期化
262
+
263
+ setTransform_Scale(mScale);
264
+
265
+ setTransform_Rotate(mRadian);
266
+
267
+ setTransform_Move(mMove);
268
+
269
+ }
270
+
271
+
272
+
273
+ void Transform_2D::UpdateTransform()
274
+
275
+ {
276
+
277
+ setTransform_Scale(mScale);
278
+
279
+ setTransform_Rotate(mRadian);
280
+
281
+ setTransform_Move(mMove);
282
+
283
+ }
284
+
285
+
286
+
287
+ // 同時に初期化
288
+
289
+ void Transform_2D::setTransfrom(glm::vec2 s, float r, glm::vec2 m)
290
+
291
+ {
292
+
293
+ setTransform_Scale(s);
294
+
295
+ setTransform_Rotate(r);
296
+
297
+ setTransform_Move(m);
298
+
299
+ }
300
+
301
+
302
+
303
+
304
+
305
+ //回転行列
306
+
307
+ void Transform_2D::setTransform_Rotate(float r)
308
+
309
+ {
310
+
311
+ float sc[9];
312
+
313
+ sc[0] = cos(r);
314
+
315
+ sc[1] = -sin(r);
316
+
317
+ sc[2] = 0;
318
+
319
+
320
+
321
+ sc[3] = sin(r);
322
+
323
+ sc[4] = cos(r);
324
+
325
+ sc[5] = 0;
326
+
327
+
328
+
329
+ sc[6] = 0;
330
+
331
+ sc[7] = 0;
332
+
333
+ sc[8] = 1;
334
+
335
+
336
+
337
+ glm::mat3 t = glm::make_mat3(sc);
338
+
339
+ mRotate_matrix = t;
340
+
341
+
342
+
343
+ mRadian = r;
344
+
345
+ }
346
+
347
+
348
+
349
+ //拡大縮小
350
+
351
+ void Transform_2D::setTransform_Scale(glm::vec2 p)
352
+
353
+ {
354
+
355
+ float sc[9];
356
+
357
+ sc[0] = p.x;
358
+
359
+ sc[1] = 0;
360
+
361
+ sc[2] = 0;
362
+
363
+
364
+
365
+ sc[3] = 0;
366
+
367
+ sc[4] = p.y;
368
+
369
+ sc[5] = 0;
370
+
371
+
372
+
373
+ sc[6] = 0;
374
+
375
+ sc[7] = 0;
376
+
377
+ sc[8] = 1;
378
+
379
+
380
+
381
+ glm::mat3 t = glm::make_mat3(sc);
382
+
383
+ mScale_matrix = t;
384
+
385
+ }
386
+
387
+
388
+
389
+ //平行移動
390
+
391
+ void Transform_2D::setTransform_Move(glm::vec2 p)
392
+
393
+ {
394
+
395
+ float m[9];
396
+
397
+
398
+
399
+ m[0] = 1;
400
+
401
+ m[1] = 0;
402
+
403
+ m[2] = p.x;
404
+
405
+
406
+
407
+ m[3] = 0;
408
+
409
+ m[4] = 1;
410
+
411
+ m[5] = p.y;
412
+
413
+
414
+
415
+ m[6] = 0;
416
+
417
+ m[7] = 0;
418
+
419
+ m[8] = 1;
420
+
421
+
422
+
423
+
424
+
425
+ glm::mat3 tt = glm::make_mat3(m);
426
+
427
+ mMove_matrix = tt;
428
+
429
+
430
+
431
+ mMove = p;
432
+
433
+
434
+
435
+ }
436
+
437
+
438
+
439
+ //回転
440
+
441
+ glm::mat3 Transform_2D::getRotate()
442
+
443
+ {
444
+
445
+ return mRotate_matrix;
446
+
447
+ }
448
+
449
+
450
+
451
+ //平行移動
452
+
453
+ glm::mat3 Transform_2D::getMove()
454
+
455
+ {
456
+
457
+ return mMove_matrix;
458
+
459
+ }
460
+
461
+ //拡大縮小
462
+
463
+ glm::mat3 Transform_2D::getScale()
464
+
465
+ {
466
+
467
+ return mScale_matrix;
468
+
469
+ }
470
+
471
+
472
+
473
+
474
+
475
+ float Transform_2D::getTransform_getRotate()
476
+
477
+ {
478
+
479
+ return mRadian;
480
+
481
+ }
482
+
483
+
484
+
485
+ glm::vec2 Transform_2D::getTransform_Scale()
486
+
487
+ {
488
+
489
+ return mScale;
490
+
491
+ }
492
+
493
+
494
+
495
+ glm::vec2 Transform_2D::getTransform_Move()
496
+
497
+ {
498
+
499
+ return mMove;
500
+
501
+ }
502
+
503
+
504
+
505
+
506
+
507
+
508
+
509
+ //ワールド行列
510
+
511
+ glm::mat3 Transform_2D::getWorldMatrix()
512
+
513
+ {
514
+
515
+ glm::mat3 r = mScale_matrix * mRotate_matrix * mMove_matrix;
516
+
517
+
518
+
519
+ return r;
520
+
521
+ }
522
+
523
+
524
+
525
+ //ビュー行列
526
+
527
+ glm::mat3 Transform_2D::getViewMatrix()
528
+
529
+ {
530
+
531
+ //ビュー行列
532
+
533
+ float sv[9];
534
+
535
+ sv[0] = (2.0f / SCREEN_WIDTH);
536
+
537
+ sv[1] = 0.0f;
538
+
539
+ sv[2] = 0.0f;
540
+
541
+
542
+
543
+ sv[3] = 0.0f;
544
+
545
+ sv[4] = (2.0f / SCREEN_HEIGHT);
546
+
547
+ sv[5] = 0.0f;
548
+
549
+
550
+
551
+ sv[6] = 0.0f;
552
+
553
+ sv[7] = 0.0f;
554
+
555
+ sv[8] = 1.0f;
556
+
557
+
558
+
559
+ ViewMatrix = glm::make_mat3(sv);
560
+
561
+
562
+
563
+ return ViewMatrix;
564
+
565
+ }
566
+
567
+
568
+
569
+
570
+
571
+
572
+
573
+ ```

2

文章を修正しました。

2021/02/14 04:25

投稿

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

1

文章を修正しました。

2021/02/14 03:52

投稿

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