トップページ > 過去ログ > 記事閲覧
3Dでモデルに貫通しないようにする
名前:baru 日時: 2012/06/03 12:03

//自分をボタンにあわせて進める if(CheckHitKey(KEY_INPUT_A)==1){ MYZ-=7.0f*cos(DRazianX-90.0f/180.0f*PHI_F); MYX+=7.0f*sin(DRazianX-90.0f/180.0f*PHI_F); lif=1; }else{ lif=0; } if(CheckHitKey(KEY_INPUT_D)==1){ MYZ-=7.0f*cos(DRazianX+90.0f/180.0f*PHI_F); MYX+=7.0f*sin(DRazianX+90.0f/180.0f*PHI_F); rif=1; }else{ rif=0; } if(CheckHitKey(KEY_INPUT_W)==1){ MYZ+=7.0f*cos(DRazianX); MYX-=7.0f*sin(DRazianX); uif=1; }else{ uif=0; } if(CheckHitKey(KEY_INPUT_S)==1){ MYZ-=7.0f*cos(DRazianX); MYX+=7.0f*sin(DRazianX); dif=1; }else{ dif=0; } blockath[0]=MV1CollCheck_Capsule(blockModel,0,VGet(MYX,MYY,MYZ),VGet(MYX,MYY+80.0f,MYZ),5.0f); if(blockath[0].HitNum==1){ if(lif==1){ MYZ+=7.0f*cos(DRazianX-90.0f/180.0f*PHI_F); MYX-=7.0f*sin(DRazianX-90.0f/180.0f*PHI_F); } if(rif==1){ MYZ+=7.0f*cos(DRazianX+90.0f/180.0f*PHI_F); MYX-=7.0f*sin(DRazianX+90.0f/180.0f*PHI_F); } if(uif==1){ MYZ-=7.0f*cos(DRazianX); MYX+=7.0f*sin(DRazianX); } if(dif==1){ MYZ+=7.0f*cos(DRazianX); MYX-=7.0f*sin(DRazianX); } } MV1SetPosition(blockModel,VGet(600.0f,300.0f,600.0f) ) ; MV1DrawModel(blockModel); 自分をボタンですすめてモデルに貫通しないようにもでるにあたったら 戻すというプログラムをかいているんですが 貫通してしまうのです どこがまちがっているんでしょうか? これは3Dのゲームのプログラムの一部です

Page: 1 |

Re: 3Dでモデルに貫通しないようにする ( No.1 )
名前:いっち 日時:2012/06/03 14:04

> if(blockath[0].HitNum==1){ どのようなモデルと当たり判定を行っているのかわかりませんが常に1ということはあまり無いのではないでしょうか?
Re: 3Dでモデルに貫通しないようにする ( No.2 )
名前:baru 日時:2012/06/14 21:02

>どのようなモデルと当たり判定を行っているのかわかりませんが常に1ということはあまり無いのではないでしょうか? これはモデルとカプセルが当たっていたらどのボタンで進んだかをしらべて押したぼたんの反対方向に進ませるというものです どこか勘違いしてたらすいませんが教えてください
Re: 3Dでモデルに貫通しないようにする ( No.3 )
名前:いっち 日時:2012/06/14 23:45

> if(blockath[0].HitNum==1){ ではなく > if(blockath[0].HitNum>0){ とするのが正しいのではないでしょうか?
Re: 3Dでモデルに貫通しないようにする ( No.4 )
名前:ar 日時:2012/06/15 13:07

HitNumに格納されるのは接触していると判定されたポリゴンの数ですので、 仮に正方形の板ポリゴンとカプセルが接触した場合でも(状況によりますが) 板ポリゴンは2枚の三角形ポリゴンで構成されている為、HitNumには2が格納されます。 接触したか否か?を判定する場合にはいっちさんがおっしゃられている様に "HitNumが1以上かどうか" を見て処理を行うか分岐させると良いと思います。 また、当たり判定で押しだし処理を行う場合は接触した全てのポリゴンに対して押しだし移動処理をする必要があるので 実際の処理は接触ポリゴンの数だけ行う事になります。 少々複雑ですがサンプルプログラム"3Dアクション基本"内のPlayer_Move関数を読み解くと参考になるかと思います。 こちらでは移動の向きを押されたボタンから得るのではなく、 予め移動ベクトルとして用意してから処理しています。 (実際には移動する前の座標と移動した後の座標を判定に使います) ttp://homepage2.nifty.com/natupaji/DxLib/program/dxprogram_3DAction.html

Page: 1 |