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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1224
アキアキノヒロロHGIMG4 の コリジョン判定5解決


アキアキノヒロロ

リンク

2020/12/24(Thu) 11:49:52|NO.91998

HGIMG4 の [getcoli] でコリジョン判定しようとしても、対象となるオブジェクトが大きすぎると、衝突検出が難しい(検出しない)ように思います。

キャラクターが山に衝突した時止まるようにするため、キャラクターと山、それぞれを囲むような大きさの箱を [gpbox] し、[gppbind] で物理設定をして実現した場合です。
キャラクター用の箱を動かして(キャラクターはこの箱の動きをコピー)、山用の箱に衝突すれば、止まります。
しかし、それぞれの箱に [setcoli] でコリジョン設定もしていたに関わらず、 [getcoli] で検出できません。所属グループ値を同じに、かつ衝突検出対象グループ値も同じで、設定しています。同様に [gppbind] [setcoli] した他のキャラクターの箱との衝突では、しっかり [getcoli] で検出しています。[getcoli] の [distance] 設定値を色々変えてみても、山用の箱との検出はしてくれません。また、[distance] 設定値を
「たとえば、-1.5を指定した場合は、衝突範囲を1.5倍に拡大した状態で、衝突検出が行なわれます。」
に従ってマイナス値にすると、山用の箱とも、そしてキャラクターの箱同士でも、検出しなくなってしまいます。

円(または矩形)と矩形との判定を用いればできるでしょうが、山をいくつも設置するのには煩雑すぎるので、あくまでも物理設定とともに設定するコリジョン設定を使いたいのです。
この問題の解決策が考えつきません。よろしくお願いします。



この記事に返信する


アキアキノヒロロ

リンク

2021/1/6(Wed) 20:59:46|NO.92026

HGIMG4 のこととなると、やはりというか、残念なことに、いつもほとんど反応がなく、一人相撲になってしまいます。

このコリジョン判定の問題は、私個人に限られたことなのか、他の方でも同様なことが生じていることなのかさえ分かりません。
どなたか、試しにうまくいくかやってみて頂けないものでしょうか。
別にたてた「HGIMG4のライトの設定」も進展がなく、「HGIMG4」の頭打ち状態が悲しいです。

勉強しても、あれこれ工夫してみても、万年初心者同然の私の頭では、打開できません。



おにたま(管理人)

リンク

2021/1/7(Thu) 00:33:10|NO.92028

>アキアキノヒロロ さん

HGIMG4の仕様が複雑なため、色々と試行錯誤をすることになってしまってすみません。
コリジョン設定について、もし掲示板に貼れる程度の簡単なテストスクリプトがありましたらご提示頂けると大変助かります。
こちらでも色々なテストは行っていますが、すべてを確認できないため簡単にテストできるものが有難いのが現状です。
引き続き何かあれば掲示板等でお知らせ頂けたら嬉しいです。



アキアキノヒロロ

リンク

2021/1/8(Fri) 15:29:07|NO.92037

テストスクリプトを作ってみました。tamaneモデルは特別必要ありませんが、あるとイメージしやすいと思います。
「sample/hgimg4」にいれてやって見てください。

#include "hgimg4.as" gpreset setcls CLSMODE_SOLID, $404040 gpfloor id_floor, 30, 30, $aaaaaa // 床ノードを追加 setpos id_floor, 0, 0, 0 gppbind id_floor, 0 // [地面]の物理設定を行なう ;== [model_box_0] ================================================ gpbox model_box_0, 0.6, $ff0000 // [モデル]用 箱ノードを追加 setpos model_box_0, 0.0, 0.3, 0.0 // gpbox model_box_0, 1.0, $ff0000 // (大きさを変えてみる) // setpos model_box_0, 0.0, 0.5, 0.0 setalpha model_box_0, 128 gppbind model_box_0, 1.0, 1.0 // 物理設定 setcoli model_box_0, 1, 1 // コリジョン設定 gpload id_model_0,"res/tamane" // モデル読み込み setscale id_model_0, 0.004,0.004,0.004 setpos id_model_0, 0.0, 0.0, 0.0 ;== [model_box_1] ================================================ gpbox model_box_1, 0.6, $ffff00 // [モデル]用 箱ノードを追加 setpos model_box_1, 0.0, 0.3, 5.0 setalpha model_box_1, 128 gppbind model_box_1, 1.0, 1.0 // 物理設定 setcoli model_box_1, 1, 1 // コリジョン設定 gpload id_model_1,"res/tamane" // モデル読み込み setscale id_model_1, 0.004,0.004,0.004 setpos id_model_1, 5.0, 0.0, 0.0 ;== [Mt_box_0] ================================================ gpbox Mt_box_0, 4.0, $0000ff // [山]用 箱ノードを追加 setpos Mt_box_0, -5.0, 2.0, 0.0 setalpha Mt_box_0, 128 gppbind Mt_box_0, 0 // 物理設定 = 不動でやってみる // gppbind Mt_box_0, 1.0, 1.0 // (可動でやってみる) setcoli Mt_box_0, 1, 1 // コリジョン設定 ;== [Mt_box_1] ================================================ gpbox Mt_box_1, 2.0, $00ff00 // [山]用 箱ノードを追加 setpos Mt_box_1, 5.0, 1.0, 0.0 setalpha Mt_box_1, 128 gppbind Mt_box_1, 0 // 物理設定 = 不動でやってみる // gppbind Mt_box_1, 1.0, 1.0 // (可動でやってみる) setcoli Mt_box_1, 1, 1 // コリジョン設定 ;== [Mt_box_2] ================================================ gpbox Mt_box_2, 1.2, $00ffff // [山]用 箱ノードを追加 setpos Mt_box_2, 0.0, 0.6, -5.0 setalpha Mt_box_2, 128 gppbind Mt_box_2, 0 // 物理設定 = 不動でやってみる // gppbind Mt_box_2, 1.0, 1.0 // (可動でやってみる) setcoli Mt_box_2, 1, 1 // コリジョン設定 ;================================================== setpos GPOBJ_CAMERA, 0, 5, 15 // カメラ位置を設定 ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 *main_loop stick key,15 if key&128 : end redraw 0 // 描画開始 // タッチでカメラ位置を動かす if dragmd { // ドラッグ中 getkey a,1 if a=1 { dx=0.05*(mousex-dragx)+cx dy=0.05*(mousey-dragy)+cy setpos GPOBJ_CAMERA, dx,dy,cz } else { dragmd=0 } } else { // ドラッグなし getkey a,1 if a { dragx=mousex : dragy=mousey getpos GPOBJ_CAMERA, cx,cy,cz dragmd=1 } } gplookat GPOBJ_CAMERA, 0, 1, 0 // カメラから指定した座標を見る // カーソルキーで [model_box] を動かす if key&1 : gppapply model_box_0, GPPAPPLY_IMPULSE, -0.2, 0.0, 0.0 if key&4 : gppapply model_box_0, GPPAPPLY_IMPULSE, 0.2, 0.0, 0.0 if key&2 : gppapply model_box_0, GPPAPPLY_IMPULSE, 0.0, 0.0, -0.2 if key&8 : gppapply model_box_0, GPPAPPLY_IMPULSE, 0.0, 0.0, 0.2 getpos model_box_0, x, y, z setpos id_model_0, x, 0, z getpos model_box_1, x, y, z setpos id_model_1, x, 0, z getcoli i, model_box_0, 1 // [model_box_0] が 接触したオブジェクトを調べる if i=model_box_1 : obj_name="model_box_1" if i=Mt_box_0 : obj_name="Mt_box_0" if i=Mt_box_1 : obj_name="Mt_box_1" if i=Mt_box_2 : obj_name="Mt_box_2" if i=-1 : obj_name="NO" gpdraw // シーンの描画 color 255,255,255 pos 8, 8 : mes "HGIMG4 sample" pos 8, 50 : mes obj_name redraw 1 // 描画終了 await 1000/60 // 待ち時間 goto *main_loop ;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
方向キーで中央の[tamane箱]を動かして、手前の[tamane箱]や、左・右・奥の箱に衝突させて、比べて見てください。
左・右・奥の箱は、山を囲む[gppbind][setcoli]用の箱を想定しています。
私の環境では、手前の[tamane箱]と奥の箱のみ衝突検出し、左・右の箱は検出しません。



おにたま(管理人)

リンク

2021/1/15(Fri) 23:14:56|NO.92087

>アキアキノヒロロ さん

サンプルスクリプトのご提示ありがとうございます。
確かにgetcoli命令の検出サイズをマイナス値にした場合の判定がおかしいですね。
getcoli命令の当たり判定は、簡易的なもので物理設定を行ったモデルの情報をもとにした接触とは異なっています。
次のバージョンでは、getcoli命令の不具合も対応しつつ、物理設定を行ったモデルの衝突情報を別な命令で取得できるよう準備を行っています。
また、従来の箱や平面、球体の衝突だけでなくモデルの形状を使用した接触にも対応したいと考えています。
引き続き宜しくお願い致します。



アキアキノヒロロ

リンク

2021/1/16(Sat) 05:47:49|NO.92088

おにたまさん、有難うございます。
いつもいつも、丁寧なご対応、感謝しております。
お忙しいことと思いますが、次期バージョンの発表、心待ちしております。


それにつけても、普段からの思いが湧き上がります。
「Hgimg4」について、もっともっと多くの方々に語って頂きたいです。



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