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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0409
YMOe3dでのビルボードの当たり判定について4解決


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使用してみたところ、地形の起伏でちゃんと弾が消滅するようになりました!
該当のサンプルは以前見てはいたのですがこういう部分で使えるものだったんですね。
本当にありがとうございました。



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