ページ 11

モデルとマップの当たり判定

Posted: 2009年11月23日(月) 17:07
by klos
モデルとマップの当たり判定を行いたいと思っています。

以下に載せる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 ;
}

Re:モデルとマップの当たり判定

Posted: 2009年11月23日(月) 18:18
by Justy

> HitPolyDim.HitNumが常にゼロのまま変化しません

 これはデバッガで確認した値ですか?
 もし表示されている値がそうなっているのだとしたら、本当の値とは
異なる可能性がありますので、デバッガを使うとかログに書き出す、
或いは HitPolyDim.HitNum > 0 の中でメッセージボックスを出してみる、などして
本当にそうなのか確認してみて下さい。



> 指摘ありましたらお教えください

 見た感じ3Dの処理的におかしなところは見あたらないですね。
 可能性としては実は半径 100程度では本当に接触していない、とか
Floor.ModelHandleが -1になっているなどソースからは見えない部分に
あるのかもしれません。

 3D処理以外の部分で見ますと、プレイヤー移動関数なのに ScreenFlip、
画面の更新をしているのが気になります。

 PlayerMove関数が1フレームの処理における最後の処理ならばいいのですが、
そうでないのなら、この関数の呼び出し元その他の処理如何によっては、
表示関連がおかしなことになりますので、ScreenFlipを適切な場所に
配置し直して下さい。


 その上で、まだ現象が起こるようなら再現可能なコードとデータを添付するのが
いいかと思います。