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

質問編集履歴

2

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

2021/03/16 08:18

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- AABB当たり判定でめり込み量をする動作2つ方向に動いたときの修正方法上手く出来ない。
1
+ 補正量少ない方の軸に補正するめり込み量をプログラムある現象の修正方法を知りたい。
body CHANGED
@@ -1,131 +1,149 @@
1
+ 提示画像ですが上右に移動するしながら壁にぶつかるとめり込み量の少ない方の軸へめり込み量を修正するコードです。
1
- 提示コードですが 提示画像のように右キーを押しながら下に動くとで提示画像のように正されてしまうのでどうすればこれを修正できるのでしょうか?どの方向も同じ動きなのでがどうすればいいのでしょうか?
2
+ 提示コードの///の部めりこみ量の少ない方をif文で分岐して修正るのですが提示画像のように一番上ま行くと提示画像のように下に修正されてしまいま。このバグはどうやって修正すればいいのでしょうか?
2
3
 
3
- やりいこと。
4
+ 考え
4
- 左側下から右上に斜めに上がっっときにY軸だけ修正して左上から右下斜めに下がったときにY軸だけ上にあがりたいです。
5
- 縦長方形のブロックどが来た場合なども対処したす。
5
+ bool型変数にんかのときとった条件を考えて保存
6
+ ベクトルを使って交点の座標に修正する。(別の案)
6
7
 
7
8
 
8
9
 
9
- どちらか片方の方向のみの場合は正常に判定出来ます。
10
10
 
11
+ ![イメージ説明](37443f54e3a3302294b3f70e85024878.jpeg)
11
12
 
13
+ ```cpp
12
14
 
15
+ //補正量をのを得る
16
+ glm::vec2 BoxCollision::getFixValue(glm::vec2 player_min, glm::vec2 player_max, glm::vec2 block_min, glm::vec2 block_max)
17
+ {
18
+ //X軸の補正量
19
+ float xA = player_max.x - block_min.x;
20
+ float xB = block_max.x - player_min.x;
21
+ float x;
22
+ float y;
13
23
 
14
- ![イメージ説明](a1864d9c415d029586999ea32e8c7780.jpeg)
24
+ if (xA < xB)
25
+ {
26
+ x = xA;
27
+ }
28
+ else
29
+ {
30
+ x = xB;
31
+ }
15
32
 
16
- ```cpp
33
+ //Y軸の補正量
34
+ float yA = player_max.y - block_min.y;
35
+ float yB = block_max.y - player_min.y;
17
36
 
37
+ if (yA < yB)
38
+ {
39
+ y = yA;
40
+ }
41
+ else
42
+ {
43
+ y = yB;
44
+ }
45
+
46
+ glm::vec2 pos;
47
+ pos.x = x;
48
+ pos.y = y;
49
+
50
+
51
+ return pos;
52
+ }
53
+ //交差判定
18
54
  void BoxCollision::Intersect(BoxCollision& col)
19
55
  {
56
+
57
+ // printf("%f\n",getVector().y);
58
+
59
+
20
60
  if ((col.getMax().x > box.mMin->x && box.mMax->x > col.getMin().x)
21
61
  && (col.getMax().y > box.mMin->y && box.mMax->y > col.getMin().y))
22
62
  {
23
-
24
63
  setCol(true); //当たり判定を設定
25
64
  setColTag(col.getMyTag()); //タグを取得
26
65
  col.setColTag(getMyTag()); //タグを設定
27
66
 
28
-
67
+ glm::ivec2 size = getMax() - getMin(); //サイズ
29
68
 
69
+ glm::vec2 fix = getFixValue(getMin(), getMax(), col.getMin(), col.getMax()); //めりこみ量
30
- if (getTriggerType() == false)
70
+ printf("X: %.2f\n", fix.x);
71
+ printf("y: %.2f\n", fix.y);
72
+
73
+ if (getVector().x > 0 && getVector().y == 0)
31
74
  {
75
+ glm::vec2 p;
32
- //printf("ああ\n");
76
+ p.x = col.getMin().x - size.x;
77
+ p.y = getMin().y;
33
78
 
79
+ setMinValue(p);
80
+ }else if (getVector().x < 0 && getVector().y == 0)
81
+ {
34
- glm::vec2 vec = getVector();
82
+ glm::vec2 p;
35
- vec = glm::normalize(vec); //正規化
83
+ p.x = col.getMax().x;
36
- // vec = vec * -1.0f; //反転
84
+ p.y = getMin().y;
37
85
 
38
- glm::vec2 size = getMax() - getMin(); //自分の大きさ
86
+ setMinValue(p);
39
87
 
88
+ }
40
- if (vec.x > 0 && vec.y == 0)
89
+ else if (getVector().y < 0 && getVector().x == 0)
41
- {
90
+ {
91
+ glm::vec2 p;
42
- glm::vec2 pos = col.getMin();
92
+ p.y = col.getMax().y;
43
- pos.x += -size.x;
44
- pos.y = getMin().y;
93
+ p.x = getMin().x;
45
94
 
46
- setMinValue(pos);
95
+ setMinValue(p);
96
+ }
97
+ else if (getVector().y > 0 && getVector().x == 0)
98
+ {
99
+ printf("あああ\n");
100
+ glm::vec2 p;
101
+ p.y = col.getMin().y - size.y;
102
+ p.x = getMin().x;
47
103
 
104
+ setMinValue(p);
48
- }
105
+ }
49
- else if (vec.x < 0 && vec.y == 0)
106
+ else if (getVector().x > 0 && getVector().y < 0)
107
+ {
108
+
109
+ //////////////////////////////////////////////////////////////////////////////////////////
110
+ if ((fix.x < fix.y))
50
111
  {
51
-
52
- glm::vec2 pos = col.getMin();
53
- pos.x += +size.x;
54
- pos.y = getMin().y;
55
112
 
113
+ printf("ああああ\n");
56
- setMinValue(pos);
114
+ glm::vec2 p;
57
- }
58
- else if (vec.x == 0 && vec.y > 0)
59
- {
60
- glm::vec2 pos = col.getMin();
115
+ p.x = col.getMin().x - size.x;
61
- pos.y += -size.y;
62
- pos.x = getMin().x;
116
+ p.y = getMin().y;
63
-
64
- setMinValue(pos);
65
- }
66
- else if (vec.x == 0 && vec.y < 0)
67
- {
68
- glm::vec2 pos = col.getMax();
69
- pos.x = getMin().x;
70
-
71
- setMinValue(pos);
72
- }
73
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////
74
- else if (vec.x > 0 && vec.y > 0)
75
- {
76
117
 
77
- glm::vec2 pos = glm::vec2(0, 0);
78
- pos.y = col.getMin().y - size.y;
79
- pos.x = getMin().x;
118
+ setMinValue(p);
80
119
 
81
- setMinValue(pos);
82
120
  }
83
- else if (vec.x < 0 && vec.y > 0)
84
- {
121
+ else {
85
- glm::vec2 pos = glm::vec2(0, 0);
122
+ printf("うううううう\n");
86
- pos.y = col.getMin().y - size.y;
87
- pos.x = getMin().x;
88
123
 
89
- setMinValue(pos);
90
- }
91
- else if (vec.x > 0 && vec.y < 0)
92
- {
93
-
94
- glm::vec2 pos = glm::vec2(0,0);
124
+ glm::vec2 p;
95
- pos.x = getMin().x;
125
+ p.x = getMin().x;
96
- pos.y = col.getMax().y;
126
+ p.y = col.getMax().y;
97
127
 
98
- setMinValue(pos);
128
+ setMinValue(p);
99
129
 
100
130
  }
101
- else if (vec.x < 0 && vec.y < 0)
131
+ ////////////////////////////////////////////////////////////////////////////////////////
102
- {
132
+ }
103
- glm::vec2 pos = glm::vec2(0, 0);
104
- pos.x = getMin().x;
105
- pos.y = col.getMax().y;
106
133
 
107
- setMinValue(pos);
108
134
 
109
- }
110
135
 
111
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
112
136
 
113
137
 
114
-
115
-
116
-
117
-
118
-
119
- }
120
138
  }
121
139
  else
122
140
  {
123
- //交差していない
141
+ //交差していない
124
-
125
142
  setCol(false);
126
143
  setColTag(Tag::Invalid);
127
144
  col.setColTag(Tag::Invalid);
128
145
  }
146
+
129
147
  }
130
148
 
131
149
  ```

1

文章を修正しました。

2021/03/16 08:18

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,11 @@
1
1
  提示コードですが 提示画像のように右キーを押しながら下に動くと一瞬で提示画像のように補正されてしまうのですがどうすればこれを修正できるのでしょうか?どの方向も同じ動きなのですがどうすればいいのでしょうか?
2
2
 
3
+ やりたいこと。
4
+ 左側下から右上に斜めに上がっっときにY軸だけ修正して左上から右下斜めに下がったときにY軸だけ上にあがりたいです。
5
+ 縦長方形のブロックなどが来た場合なども対処したいです。
6
+
7
+
8
+
3
9
  どちらか片方の方向のみの場合は正常に判定出来ます。
4
10
 
5
11