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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0404
X-plate3Dフェンスの当たり判定5解決


X-plate

リンク

2007/4/4(Wed) 10:04:35|NO.6943

みなさんこんにちは
当たり判定について調べてみたのですが2Dのものしかなかったので
質問させていただきます

自分はHGIMG3のgetcoli命令をつかって障害物をつくっているのですが
getcoli命令は範囲指定なので
フェンスのようなプレート型(平面)の障害物を作ることができません

なにか他の命令があるのでしょうか
わかる方は教えてください
よろしくお願いします



この記事に返信する


f

リンク

2007/4/4(Wed) 12:19:49|NO.6951

こういうのを使うかどうかは良く分からないけど

自分の位置:(x,y)

直線 始点:(x1,y1)
終点:(x2,y2)

とした時、

lr = ((x2 - x1) * (y - y1)) - ((x - x1) * (y2 - y1))

の計算をして、答えがプラスになるかマイナスになるかで、その線分の「右側」にいるのか「左側」にいるのか計算できるよ。
0になったら線の上にいる。

始点から終点に向かって、右か左かが判断できるけど一応数学系の座標系ならマイナスになったら右と言うことで。
確認せず勝手に言うけど座標系によると思うので使う時は確認してください。



まあ、つまり、こういう直線を「境界線」として定義しておいてですね。
移動前の自分の位置と移動予定の自分の位置とで交点計算してですね。
もし交差するのなら、自分が線のどちら側にいるのかで判定するとか。


なにかもっと簡単な機能があるかどうかは知らないので、便利な機能があったらソレ使ってください。



f

リンク

2007/4/4(Wed) 12:20:06|NO.6952

交点計算についてはコチラ

//直線の公式
A = (y2 - y1) / (x2 - x1)
B = (y1 - A * x1)
y = A * x + B
//(この時、x1 = x2の場合、垂直な線)

// 交点計算
//直線1をそのままA、B、直線2をA’、B’とする
x = (B' - B) / (A - A')
y = ((A * B') - (B * A')) / (A - A')
// (ただし、A=A'の時は平行線の為、交点が存在しない。
// この時、B=B'であれば、同じ線上の線分である。)



X-plate

リンク

2007/4/5(Thu) 12:51:09|NO.6998

うーん今試していますがなかなかうまくいきません
とりあえず試行錯誤してがんばってみます



f

リンク

2007/4/5(Thu) 17:35:00|NO.7004

じゃあ、引っかかっていそうな交点計算。

直線Aを (asx,asy)-(aex,aey)、
直線Bを (bsx,bsy)-(bex,bey)とした時、
このサブルーチンを呼ぶと交点座標(resx,resy)を計算してくれる。

エラー時は(0,0)が入り、reseに1が入る。
もしreseが2になっていたら、交点は存在するけど、指定したA、Bの線の範囲に無い。


分かりやすく書いたので多少長いのは勘弁。
バグがあるかもしれないので内容をよく読んで確認してね(脅しw)。
まともにチェックしてないから。

asx =-100.0 : asy = 0.0 aex = 100.0 : aey = 0.0 bsx = 0.0 : bsy =-100.0 bex = 0.0 : bey = 100.0 gosub *intersection print resx print resy print rese stop *intersection v1=0 : v2=0 if asx = aex : v1=1 if bsx = bex : v2=1 //双方垂直線>エラー if ( v1 + v2 ) = 2 { resx = 0.0 resy = 0.0 rese = 1 return } //片側が垂直線だった時の処理 if v1 = 1 { a2 = ( bey - bsy ) / ( bex - bsx) b2 = bsy - a2 * bsx resx = asx resy = a2 * asx + b2 rese = 0 gosub *areacheck return } if v2 = 1 { a1 = ( aey - asy ) / ( aex - asx) b1 = asy - a1 * asx resx = bsx resy = a1 * bsx + b1 rese = 0 gosub *areacheck return } //両方垂直でなかった時の処理 a1 = ( aey - asy ) / ( aex - asx) b1 = asy - a1 * asx a2 = ( bey - bsy ) / ( bex - bsx) b2 = bsy - a2 * bsx //平行線 > エラー if a1 = a2 { resx = 0.0 resy = 0.0 rese = 1 return } resx = ( b2 - b1 ) / ( a1 - a2 ) resy = (( a1 * b2 ) - ( b1 * a2 )) / ( a1 - a2 ) rese = 0 gosub *areacheck return *areacheck //直線Aの範囲内にいるか確認 if asx < aex { if resx < asx : rese = 2 if resx > aex : rese = 2 else { if resx < aex : rese = 2 if resx > asx : rese = 2 } if asy < aey { if resy < asy : rese = 2 if resy > aey : rese = 2 else { if resy < aey : rese = 2 if resy > asy : rese = 2 } //直線Bの範囲内にいるか確認 if bsx < bex { if resx < bsx : rese = 2 if resx > bex : rese = 2 else { if resx < bex : rese = 2 if resx > bsx : rese = 2 } if bsy < bey { if resy < bsy : rese = 2 if resy > bey : rese = 2 else { if resy < bey : rese = 2 if resy > bsy : rese = 2 } return



X-plate

リンク

2007/4/6(Fri) 12:46:15|NO.7039

ありがとうございます
何とかなりそうです



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