3D衝突判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
TN

3D衝突判定について

#1

投稿記事 by TN » 16年前

アクションゲームを作成中なのですが内積と外積を使い、床とキャラの衝突判定を取ろうと思うのですが、
平面の取得方法が悪いのかキャラが床に埋まってしまいます。
ソースを載せますので修正点を教えてください。
MakePlane( LPCSTR pFileName )
{
	LPD3DXMESH  p_mesh;	//メッシュ
	LPMESHTABLE p_m_table; //作業用

	/*** 三頂点の座標と平面得る ***/
	//メッシュインタフェースを得る
	p_m_table = CMesh::GetMeshTable( pFileName );
	p_mesh = p_m_table->m_pMesh;

	/*** 頂点フォーマットのサイズを得る ***/
	UINT	fvf_size = D3DXGetFVFVertexSize( p_mesh->GetFVF() );

	do{

		/*** 頂点バッファをLockする ***/
		BYTE*	p_vertex = NULL;
		if(FAILED( p_mesh->LockVertexBuffer( 0, (LPVOID*)&p_vertex )) ){

			/*** エラー ***/
			Dialog( "CFieldHitCheck ","Line	66 : 頂点バッファのLockに失敗 " );
			break;
		}

		/*** インデックスバッファLockする ***/
		WORD*	p_index = NULL;		//インデックスバッファポインタ
		if(FAILED( p_mesh->LockIndexBuffer(0, (LPVOID*)&p_index )))
		{
			/*** エラー ***/
			Dialog( "CFieldHitCheck", "Line	74 : インデックスバッファのLockに失敗" );
			break;
		}

		/*** メッシ構成しているポリゴンの枚数を得る ***/
		INT	polygon = p_mesh->GetNumFaces();			//ポリゴンの枚数

		/*** すべてのポリゴンから当たり判定用の平面情報を取得する ***/
		LPPLANETABLE p_work = m_pPlaneTableList;		//作業用
		//枚数分ループ
		for( INT i = 0; i < polygon; i++ )
		{

			/* 頂点を取り出す */
			for(INT j = 0; j < 3; j++)
			{
				/* 頂点を得る */	   // ↓キャストすることで1度に代入  ↓インデックス * 頂点サイズ(32byte)
				p_work->m_Vertex[ j ] = *( D3DXVECTOR3* )(p_vertex + *p_index * fvf_size);

				//次のインデックスへ
				p_index++;
			}

			/*** 頂点データから平面を作る ***/
			//頂点から法泉を算出
			D3DXPlaneFromPoints( &p_work->m_Plane,			//格納先
								 &p_work->m_Vertex[ 0 ],	//頂点1
								 &p_work->m_Vertex[ 1 ],	//頂点2
								 &p_work->m_Vertex[ 2 ]);	//頂点2

			/*** メモリ確保 ***/
			//まだすべてのポリゴンを読み込んでいなければ次のメモリを確保
			if(i + 1 < polygon )
			{

				/* メモリ確保 */
				p_work->m_pNext = new PLANETABLE;
				p_work = p_work->m_pNext;

			}
			else
			{
				/* 終端なのでNULLを設定 */
				p_work->m_pNext = NULL;

			}

		}

	}while(0);
	
	/*** インデックスバッファをunlockする ***/
	p_mesh->UnlockIndexBuffer();

	/*** 頂点バッファをunlockする ***/
	p_mesh->UnlockVertexBuffer();
}

“C言語何でも質問掲示板” へ戻る