質問編集履歴

2

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

2021/03/16 08:18

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- AABB当たり判定でめり込み量を動作で2つ方向に動いたときの修正方法上手く出来ない。
1
+ 補正量少ない方の軸に補正するめり込み量をプログラムであ現象の修正方法を知りたい。
test CHANGED
@@ -1,30 +1,24 @@
1
+ 提示画像ですが上右に移動するしながら壁にぶつかるとめり込み量の少ない方の軸へめり込み量を修正するコードです。
2
+
1
- 提示コードですが 提示画像のように右キーを押しながら下に動くと一瞬で提示画像のように正されてしまですがどうすればこれを修正できるのでしょうか?どの方向も同じ動きなのでがどうすればいいのでしょうか?
3
+ 提示コードの///の部めりこみ量の少ない方をif文で分岐して修正るのですが提示画像のように一番上まで行くと提示画像のように下に修正されてしまいます。こバグはどうやって修正すればいいのでしょうか?
2
-
3
-
4
-
4
+
5
+
6
+
5
- やりいこと。
7
+ 考え
6
-
7
- 左側下から右上に斜めに上がっっときにY軸だけ修正して左上から右下斜めに下がったときにY軸だけ上にあがりたいです。
8
+
8
-
9
- 縦長方形のブロックなどが来た場合なども対処したいです。
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
- どちら片方方向のみの場合は正常に判定出来ます。
9
+ bool型変数になんかのときといった条件を考えて保存
10
+
18
-
11
+ ベクトルを使って交点の座標に修正する。(別の案)
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
27
- ![イメージ説明](a1864d9c415d029586999ea32e8c7780.jpeg)
21
+ ![イメージ説明](37443f54e3a3302294b3f70e85024878.jpeg)
28
22
 
29
23
 
30
24
 
@@ -32,18 +26,102 @@
32
26
 
33
27
 
34
28
 
29
+ //補正量をのを得る
30
+
31
+ glm::vec2 BoxCollision::getFixValue(glm::vec2 player_min, glm::vec2 player_max, glm::vec2 block_min, glm::vec2 block_max)
32
+
33
+ {
34
+
35
+ //X軸の補正量
36
+
37
+ float xA = player_max.x - block_min.x;
38
+
39
+ float xB = block_max.x - player_min.x;
40
+
41
+ float x;
42
+
43
+ float y;
44
+
45
+
46
+
47
+ if (xA < xB)
48
+
49
+ {
50
+
51
+ x = xA;
52
+
53
+ }
54
+
55
+ else
56
+
57
+ {
58
+
59
+ x = xB;
60
+
61
+ }
62
+
63
+
64
+
65
+ //Y軸の補正量
66
+
67
+ float yA = player_max.y - block_min.y;
68
+
69
+ float yB = block_max.y - player_min.y;
70
+
71
+
72
+
73
+ if (yA < yB)
74
+
75
+ {
76
+
77
+ y = yA;
78
+
79
+ }
80
+
81
+ else
82
+
83
+ {
84
+
85
+ y = yB;
86
+
87
+ }
88
+
89
+
90
+
91
+ glm::vec2 pos;
92
+
93
+ pos.x = x;
94
+
95
+ pos.y = y;
96
+
97
+
98
+
99
+
100
+
101
+ return pos;
102
+
103
+ }
104
+
105
+ //交差判定
106
+
35
107
  void BoxCollision::Intersect(BoxCollision& col)
36
108
 
37
109
  {
38
110
 
111
+
112
+
113
+ // printf("%f\n",getVector().y);
114
+
115
+
116
+
117
+
118
+
39
119
  if ((col.getMax().x > box.mMin->x && box.mMax->x > col.getMin().x)
40
120
 
41
121
  && (col.getMax().y > box.mMin->y && box.mMax->y > col.getMin().y))
42
122
 
43
123
  {
44
124
 
45
-
46
-
47
125
  setCol(true); //当たり判定を設定
48
126
 
49
127
  setColTag(col.getMyTag()); //タグを取得
@@ -52,199 +130,155 @@
52
130
 
53
131
 
54
132
 
55
-
133
+ glm::ivec2 size = getMax() - getMin(); //サイズ
134
+
135
+
136
+
56
-
137
+ glm::vec2 fix = getFixValue(getMin(), getMax(), col.getMin(), col.getMax()); //めりこみ量
57
-
58
-
138
+
59
- if (getTriggerType() == false)
139
+ printf("X: %.2f\n", fix.x);
140
+
60
-
141
+ printf("y: %.2f\n", fix.y);
142
+
143
+
144
+
145
+ if (getVector().x > 0 && getVector().y == 0)
146
+
61
- {
147
+ {
148
+
62
-
149
+ glm::vec2 p;
150
+
151
+ p.x = col.getMin().x - size.x;
152
+
153
+ p.y = getMin().y;
154
+
155
+
156
+
157
+ setMinValue(p);
158
+
159
+ }else if (getVector().x < 0 && getVector().y == 0)
160
+
161
+ {
162
+
163
+ glm::vec2 p;
164
+
165
+ p.x = col.getMax().x;
166
+
167
+ p.y = getMin().y;
168
+
169
+
170
+
171
+ setMinValue(p);
172
+
173
+
174
+
175
+ }
176
+
177
+ else if (getVector().y < 0 && getVector().x == 0)
178
+
179
+ {
180
+
181
+ glm::vec2 p;
182
+
183
+ p.y = col.getMax().y;
184
+
185
+ p.x = getMin().x;
186
+
187
+
188
+
189
+ setMinValue(p);
190
+
191
+ }
192
+
193
+ else if (getVector().y > 0 && getVector().x == 0)
194
+
195
+ {
196
+
63
- //printf("ああ\n");
197
+ printf("ああ\n");
64
-
65
-
66
-
198
+
67
- glm::vec2 vec = getVector();
199
+ glm::vec2 p;
68
-
200
+
69
- vec = glm::normalize(vec); //正規化
201
+ p.y = col.getMin().y - size.y;
70
-
71
- // vec = vec * -1.0f; //反転
202
+
72
-
73
-
74
-
75
- glm::vec2 size = getMax() - getMin(); //自分の大きさ
203
+ p.x = getMin().x;
204
+
205
+
206
+
76
-
207
+ setMinValue(p);
208
+
77
-
209
+ }
78
-
210
+
79
- if (vec.x > 0 && vec.y == 0)
211
+ else if (getVector().x > 0 && getVector().y < 0)
212
+
213
+ {
214
+
215
+
216
+
217
+ //////////////////////////////////////////////////////////////////////////////////////////
218
+
219
+ if ((fix.x < fix.y))
80
220
 
81
221
  {
82
222
 
223
+
224
+
225
+ printf("ああああ\n");
226
+
83
- glm::vec2 pos = col.getMin();
227
+ glm::vec2 p;
84
-
228
+
85
- pos.x += -size.x;
229
+ p.x = col.getMin().x - size.x;
86
-
230
+
87
- pos.y = getMin().y;
231
+ p.y = getMin().y;
88
-
89
-
90
-
232
+
233
+
234
+
91
- setMinValue(pos);
235
+ setMinValue(p);
92
236
 
93
237
 
94
238
 
95
239
  }
96
240
 
241
+ else {
242
+
97
- else if (vec.x < 0 && vec.y == 0)
243
+ printf("うううううう\n");
98
-
99
- {
244
+
100
-
101
-
102
-
245
+
246
+
103
- glm::vec2 pos = col.getMin();
247
+ glm::vec2 p;
104
-
105
- pos.x += +size.x;
248
+
106
-
107
- pos.y = getMin().y;
249
+ p.x = getMin().x;
250
+
108
-
251
+ p.y = col.getMax().y;
109
-
110
-
252
+
253
+
254
+
111
- setMinValue(pos);
255
+ setMinValue(p);
256
+
257
+
112
258
 
113
259
  }
114
260
 
115
- else if (vec.x == 0 && vec.y > 0)
116
-
117
- {
118
-
119
- glm::vec2 pos = col.getMin();
120
-
121
- pos.y += -size.y;
122
-
123
- pos.x = getMin().x;
124
-
125
-
126
-
127
- setMinValue(pos);
128
-
129
- }
130
-
131
- else if (vec.x == 0 && vec.y < 0)
132
-
133
- {
134
-
135
- glm::vec2 pos = col.getMax();
136
-
137
- pos.x = getMin().x;
138
-
139
-
140
-
141
- setMinValue(pos);
142
-
143
- }
144
-
145
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////
261
+ ////////////////////////////////////////////////////////////////////////////////////////
146
-
147
- else if (vec.x > 0 && vec.y > 0)
148
-
149
- {
150
-
151
-
152
-
153
- glm::vec2 pos = glm::vec2(0, 0);
154
-
155
- pos.y = col.getMin().y - size.y;
156
-
157
- pos.x = getMin().x;
158
-
159
-
160
-
161
- setMinValue(pos);
162
-
163
- }
164
-
165
- else if (vec.x < 0 && vec.y > 0)
166
-
167
- {
168
-
169
- glm::vec2 pos = glm::vec2(0, 0);
170
-
171
- pos.y = col.getMin().y - size.y;
172
-
173
- pos.x = getMin().x;
174
-
175
-
176
-
177
- setMinValue(pos);
178
-
179
- }
180
-
181
- else if (vec.x > 0 && vec.y < 0)
182
-
183
- {
184
-
185
-
186
-
187
- glm::vec2 pos = glm::vec2(0,0);
188
-
189
- pos.x = getMin().x;
190
-
191
- pos.y = col.getMax().y;
192
-
193
-
194
-
195
- setMinValue(pos);
196
-
197
-
198
-
199
- }
200
-
201
- else if (vec.x < 0 && vec.y < 0)
202
-
203
- {
204
-
205
- glm::vec2 pos = glm::vec2(0, 0);
206
-
207
- pos.x = getMin().x;
208
-
209
- pos.y = col.getMax().y;
210
-
211
-
212
-
213
- setMinValue(pos);
214
-
215
-
216
-
217
- }
218
-
219
-
220
-
221
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
222
-
223
-
224
-
225
-
226
-
227
-
228
-
229
-
230
-
231
-
232
-
233
-
234
-
235
-
236
262
 
237
263
  }
238
264
 
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+
239
275
  }
240
276
 
241
277
  else
242
278
 
243
279
  {
244
280
 
245
- //交差していない
281
+ //交差していない
246
-
247
-
248
282
 
249
283
  setCol(false);
250
284
 
@@ -254,6 +288,8 @@
254
288
 
255
289
  }
256
290
 
291
+
292
+
257
293
  }
258
294
 
259
295
 

1

文章を修正しました。

2021/03/16 08:18

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
 
4
4
 
5
+ やりたいこと。
6
+
7
+ 左側下から右上に斜めに上がっっときにY軸だけ修正して左上から右下斜めに下がったときにY軸だけ上にあがりたいです。
8
+
9
+ 縦長方形のブロックなどが来た場合なども対処したいです。
10
+
11
+
12
+
13
+
14
+
15
+
16
+
5
17
  どちらか片方の方向のみの場合は正常に判定出来ます。
6
18
 
7
19