HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2025
1223
iemon2Dでの当たり判定のすり抜け防止判定処理4解決


iemon

リンク

2025/12/23(Tue) 12:08:53|NO.104548

このトピックは既にあるはずなのですが、検索しても出てきませんでした
(Google検索に放りだされてgoogle先生の無関係な検索結果に飲まれる)。

2Dの当たり判定(衝突判定)処理で、矩形同士がお互い動いている場合、すり抜けしないような処理を探しています。

「Swept AABB」というのがあり、
https://gamedev.net/tutorials/programming/general-and-gameplay-programming/swept-aabb-collision-detection-and-response-r3084/
これはそのままだと動いている矩形と静止矩形の判定です。
AIによると、vx,vyなど移動スピードの変数を引いて相対化したらSweptAABBでも判定できると答えました。

Swept AABB以外に、もっと簡単な判定があったような気もするのですがご存知ですか。
昔、HSP系のwikiか講座でも扱っていたような気がするんですが見失いました。



この記事に返信する


kinokawa

リンク

2025/12/23(Tue) 13:23:56|NO.104549

すり抜けない2D衝突判定を書いてみよう
https://www.youtube.com/watch?v=FkD-intv7IE
HSP言語で作る余裕はないのですが
説明がわかりやすいので貼りました



iemon

リンク

2025/12/23(Tue) 13:48:18|NO.104550

>>kinokawaさん
ありがとうございます こういうの完璧ですね!
しかし医療系てw 医療系恐るべし!
概要だけ見て、まだなんのプログラミング言語だこりゃ?って段階ですが
なんとかCやHSPに直してみます



iemon

リンク

2025/12/23(Tue) 17:35:06|NO.104551

一旦解決済みにしておきます!

いろいろやってみたけど移植は難しかったです。
内容的にはSweptAABBと似ており、除算をなくした式という感じらしいです。



usagi

リンク

2025/12/25(Thu) 17:32:05|NO.104562

こんにちわ。面白そうなことしてますね。
私は移動距離を割って繰り返し判定するような事しかしたことなかったです。
線形的な移動であればこの方法でもある程度の当たり判定がとれそうですね。
(本当はすり抜けて欲しいのに当たってしまう事もあるかも)

おそらく言語はjavascrptかと思いますが計算は単純なので、
Y軸の逆転と三項演算とタプルをHSPスタイルにすれば行けると思いますよ。

よろしかったら一例ですがどうぞ。

#module ; 参考: https://www.youtube.com/watch?v=FkD-intv7IE #defcfunc collides double l1, double t1, double r1, double b1, double vx1, double vy1, double l2, double t2, double r2, double b2, double vx2, double vy2 ; ☆三項演算子はifで分ける、タプルは個々に代入する if vx1 < vx2 { l = l2-r1 : r = r2-l1 : vx = vx2-vx1 } else { l = l1-r2 : r = r1-l2 : vx = vx1-vx2 } ; ☆Y軸はマイナスなので入れ替える。 if vy1 < vy2 { t = b2-t1 : b = t2-b1 : vy = vy2-vy1 } else { t = b1-t2 : b = t1-b2 : vy = vy1-vy2 } ; ☆ |点が大きな矩形に含まれている |上の斜線よりも下 |下の斜線よりも上 return l < 0 & 0 < r + vx & b < 0 & 0 < t + vy & vx*t - vy*l > 0 & 0 > vx*b - vy*r #global #module #deffunc boxs double l, double t, double r, double b pos l,t : line r,t : line r,b : line l,b : line l, t : return #deffunc check_rect var l, var t, var r, var b if l > r : v = l : l = r : r = v if t > b : v = t : t = b : b = v return #global onclick gosub *ON_CLICK msg.0 = "一個目の矩形の左上をクリックしてください" msg.1 = "一個目の矩形の右下をクリックしてください" msg.2 = "一個目の矩形の移動ベクトルをクリックしてください" msg.3 = "二個目の矩形の左上をクリックしてください" msg.4 = "二個目の矩形の右下をクリックしてください" msg.5 = "二個目の矩形の移動ベクトルをクリックしてください" msg.6 = "※結果を書き込む※" msg.7 = "クリックで最初から" hit_msg = "結果:衝突していません", "結果:!!!衝突しました!!!" step = 0 *DRAW redraw 1 : await 16 : redraw 0 rgbcolor $F9F9D7 : boxf pos 0,0 : rgbcolor : mes msg.step circle mousex-2, mousey-2, mousex+2, mousey+2 rgbcolor $FF if step = 1 : boxs l1, t1, mousex, mousey if step > 1 : boxs l1, t1, r1, b1 midx = (l1+r1)/2 : midy = (t1+b1)/2 if step = 2 : line mousex, mousey, midx, midy if step > 2 : line vx1+midx, vy1+midy, midx, midy rgbcolor $FF0000 if step = 4 : boxs l2, t2, mousex, mousey if step > 4 : boxs l2, t2, r2, b2 midx = (l2+r2)/2 : midy = (t2+b2)/2 if step = 5 : line mousex, mousey, midx, midy if step > 5 : line vx2+midx, vy2+midy, midx, midy if step = 7 { rgbcolor $AAAAFF boxs l1+vx1, t1+vy1, r1+vx1, b1+vy1 line l1, t1, l1+vx1, t1+vy1 : line r1, b1, r1+vx1, b1+vy1 rgbcolor $FFAAAA boxs l2+vx2, t2+vy2, r2+vx2, b2+vy2 line l2, t2, l2+vx2, t2+vy2 : line r2, b2, r2+vx2, b2+vy2 } goto *DRAW *ON_CLICK switch step case 0 : l1 = mousex : t1 = mousey : step++ : swbreak case 1 : r1 = mousex : b1 = mousey : step++ : check_rect l1, t1, r1, b1 : swbreak case 2 : vx1 = mousex - (l1+r1)/2 : vy1 = mousey - (t1+b1)/2 : step++ : swbreak case 3 : l2 = mousex : t2 = mousey : step++ : swbreak case 4 : r2 = mousex : b2 = mousey : step++ : check_rect l2, t2, r2, b2 : swbreak case 5 : vx2 = mousex - (l2+r2)/2 : vy2 = mousey - (t2+b2)/2 msg.6 = hit_msg.collides(l1, t1, r1, b1, vx1, vy1, l2, t2, r2, b2, vx2, vy2) step++ : swbreak case 6 : step++ : swbreak case 7 : step = 0 : swbreak swend return



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.104548への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2025(c) All rights reserved.