e3dでのビルボードの当たり判定について
YMO 2013/4/9(Tue) 13:49:08|NO.53506
easy3DでFPS的なゲームを作成中なのですが、ビルボードを使用した弾丸の地形との当たり判定がうまくいきません。
下記のコードを実行してスペースキーを押すと「外部DLLの呼び出しに失敗〜」のエラーがでてしまいます。
E3DChkConfBillboardの部分を削除すると弾は普通に飛んで寿命の数値通り消滅するのですが…。
当たり判定部分の記述をif result = 1 : end にするとスペースキーを押して即終了となるので
どうやら弾丸を発射した時点で地面に接触と判定されてしまっているようです。
アドバイス頂けましたら幸いです。
//弾丸設定
#define tama_max 100 //弾数
#define tama_life 80 //弾の寿命
dim tama, tama_max
dim count, tama_max
ddim bx, tama_max : ddim by, tama_max : ddim bz, tama_max
arrayleng = 100
dim confbbid, arrayleng
*main
gosub *shot
gosub *move_shot
*shot
if key & 16{
repeat tama_max
if tama(cnt) = 0{
tama(cnt) = 1
count(cnt) = 0
break
}
loop
gosub *make_shot
}
return
//弾丸作成
*make_shot
repeat tama_max
if tama(cnt) = 1 {
E3DCreateBillboard mediadir2, px*2, py*2, 1,tama(cnt),1,1
E3DGetPos hsid1, saveposx1, saveposy1, saveposz1
E3DGetDirQ2 hsid1, qid
E3DMultQVec qid, 0, 0, -1000, bx(cnt), by(cnt),bz(cnt)
E3DSetBillboardPos tama(cnt), saveposx1+bx(cnt), saveposy1+by(cnt)+600, saveposz1+bz(cnt)
break
}
loop
gosub *move_shot
return
//弾丸移動
*move_shot
repeat tama_max
if tama(cnt) ! 0 {
E3DGetBillboardInfo tama(cnt), x, y, z, mediadir2, transparent, w, h
E3DSetBillboardpos tama(cnt), x+bx(cnt), y+by(cnt), z+bz(cnt)
count(cnt)++
E3DChkConfBillboard hsid0, 1, result, confbbid, arrayleng, confnum
if result = 1 : E3DDestroyBillboard confbbid
if count(cnt) = tama_life {
E3DDestroyBillboard tama(cnt)
tama(cnt) = 0
count(cnt) = 0
break
}
}
loop
return
aaa 2013/4/9(Tue) 18:04:25|NO.53507
>>弾丸を発射した時点で地面に接触と判定
地形のモデルはどんな形、大きさ、なのでしょう?
地形モデル全体をすっぽりと覆う大きさの
境界球とビルボード個々の境界球との当り判定になっていますが
そこは意図した通りなのでしょうか?
>>外部DLLの呼び出しに失敗〜
if result = 1 : E3DDestroyBillboard confbbid
を
if result = 1 : E3DDestroyBillboard tama(cnt)
に変えても、同様のエラーが出ますでしょうか?
YMO 2013/4/9(Tue) 18:42:37|NO.53510
マップサイズは下記の通りです。起伏の大きい荒れ地といった感じにしています。
if result = 1 : E3DDestroyBillboard tama(cnt)に変えてみましたがエラーは変わらずです。
>>地形モデル全体をすっぽりと覆う大きさの境界球
そういう判定になってるんですね…できれば地形にぴったり合わせたかったのですが。
難しいようならマップを平らにして障害物を置くといった感じに修正してみようかな…。
mapsize = 100000.0: mapdiv = 60: mapheight = 3000.0
E3DLoadGroundBMP pathbuf.0, pathbuf.1, pathbuf.2, pathbuf.3, mapsize, mapsize, mapdiv, mapdiv, mapheight, hsid0
posx0 = 0.0 : posy0 = 0.0 : posz0 = 0.0
degx0 = 0.0 : degy0 = 0.0 : degz0 = 0.0
E3DSetPos hsid0, posx0, posy0, posz
E3DSetDir hsid0, degx0, degy0, degz0
//自機と地面の当たり判定
*ChkConf
mapminy = -100
E3DChkConfGround hsid1, hsid0, 1, mapheight, mapminy, result, adjustx, adjusty, adjustz, nx,ny,nz
if (result != 0) {
E3DSetPos hsid1, adjustx, adjusty, adjustz
}
return
aaa 2013/4/10(Wed) 01:55:26|NO.53517
壁モデルとの細かいあたり判定は
E3DChkConfLineAndFace を使えば良いと思います。
弾の移動前の座標を保持しておき
[ E3DChkConfLineAndFace 弾の前の座標xyz, 弾の現在の座標xyz, hsid0, 1, pn,fn, hx,hy,hz, nx,ny,nz, revfaceflag ]
のように、弾の前フレームの座標と現在の弾の座標を結ぶ線分と、モデルのポリゴンとの
当り判定を取り、ヒットしていたらビルボードを消去します。
E3DLoadGroundBMP で作成したモデルでも使えました。
YMO 2013/4/10(Wed) 12:30:10|NO.53518
>aaaさん
E3DChkConfLineAndFace使用してみたところ、地形の起伏でちゃんと弾が消滅するようになりました!
該当のサンプルは以前見てはいたのですがこういう部分で使えるものだったんですね。
本当にありがとうございました。