モデルとマップの当たり判定
Posted: 2009年11月23日(月) 17:07
モデルとマップの当たり判定を行いたいと思っています。
以下に載せるPlayerMove関数について説明します。
ポリゴン同士が接触した場合は「Hit」と表示され接触しているポリゴンの数が表示され、
接触しているポリゴンが水色で表示されるはずなのですが、
HitPolyDim.HitNumが常にゼロのまま変化しません。
モデルとマップが接触した場合は、HitPolyDim.HitNumが1以上にならなければなりません。
なぜ、接触しても表示が変わらないのでしょうか?
MV1CollCheck_Sphereを使う前にコリジョン情報の構築が必要なので、
その部分は別にある初期化用関数の中で次のようにしています。
この関数で床のモデルとプレイヤーのモデルの接触判定をしたいのですが、
段階的に作って行こうと思い、現時点ではまず最初に「周りに障害物が無いか?」を調べるコードを書いています。
これが出来たら次は床があるのか無いのか。無ければ落下処理、あれば歩行するなどなど考えています。
開発環境はVistaでBCC、DXライブラリを使用しています。
ここが違うから思ってるように動かないんだ等、指摘ありましたらお教えください(_ _)
以下に載せるPlayerMove関数について説明します。
ポリゴン同士が接触した場合は「Hit」と表示され接触しているポリゴンの数が表示され、
接触しているポリゴンが水色で表示されるはずなのですが、
HitPolyDim.HitNumが常にゼロのまま変化しません。
モデルとマップが接触した場合は、HitPolyDim.HitNumが1以上にならなければなりません。
なぜ、接触しても表示が変わらないのでしょうか?
MV1CollCheck_Sphereを使う前にコリジョン情報の構築が必要なので、
その部分は別にある初期化用関数の中で次のようにしています。
Floor.ModelHandle = MV1LoadModel( "floor.mqo" ) ; if( MV1SetupCollInfo( Floor.ModelHandle , -1 , 8 , 8 , 8 ) ) return -1 ;次の部分が実際の当たり判定部分です。
この関数で床のモデルとプレイヤーのモデルの接触判定をしたいのですが、
段階的に作って行こうと思い、現時点ではまず最初に「周りに障害物が無いか?」を調べるコードを書いています。
これが出来たら次は床があるのか無いのか。無ければ落下処理、あれば歩行するなどなど考えています。
開発環境はVistaでBCC、DXライブラリを使用しています。
ここが違うから思ってるように動かないんだ等、指摘ありましたらお教えください(_ _)
// プレイヤーの移動処理(あたり判定?)
int PlayerMove( void )
{
int i ;
MV1_COLL_RESULT_POLY_DIM HitPolyDim ;
// どこかのポリゴンと接触しているか調べる
HitPolyDim = MV1CollCheck_Sphere( Floor.ModelHandle , -1 , Player1.Position , 100.0f ) ;
DrawSphere3D( Player1.Position , 100.0f, 8, GetColor( 255,0,0 ), GetColor( 0,0,0 ), FALSE ) ; // デバッグ用の当たり判定検知範囲を表示
// 接触している場合
if( HitPolyDim.HitNum > 0 )
{
// 当たったポリゴンの数だけ繰り返し
for( i = 0 ; i < HitPolyDim.HitNum ; i ++ )
{
// 当たったポリゴンを描画
DrawTriangle3D(
HitPolyDim.Dim[ i ].Position[ 0 ],
HitPolyDim.Dim[ i ].Position[ 1 ],
HitPolyDim.Dim[ i ].Position[ 2 ], GetColor( 0,255,255 ), TRUE ) ;
}
}
// 接触しているポリゴンの数を表示
DrawFormatString( 0 , 55 , GetColor( 255 , 255 , 255 ) ,
"Hit: %d" , HitPolyDim.HitNum ) ;
// 画面の更新
ScreenFlip() ;
// 当たり判定情報の後始末
MV1CollResultPolyDimTerminate( HitPolyDim ) ;
return 0 ;
}