ページ 11

DirectX9の地面と当たった座標を取得したいがアクセス違反が起こる

Posted: 2014年12月16日(火) 21:17
by 2toN
はじめまして。
現在DirectX9をつかってゲーム作りをしています。そこでD3DXIntersectを使って地面との当たり判定を行い、その当たった座標を取得してその座標にキャラクターを設置させたいところです。
ネットに載っていたサンプル等を見て組んだプログラムがこちらで

コード:

	LPD3DXMESH mesh = gameDevice->graphics->GetMesh(MODEL_ID::STAGE_MODEL);  //ステージのメッシュを取得
	DWORD NumFaces = mesh->GetNumFaces();	// 面(ポリゴン)の数取得
	DWORD NumVertices = mesh->GetNumVertices(); // 頂点の数を取得
	DWORD FVF = mesh->GetFVF(); // 頂点フォーマットを取得
	DWORD VertexSize = D3DXGetFVFVertexSize(FVF); // 頂点のサイズを取得


	//当たり判定
	BOOL groundCollide;	//地面とあたっているか
	FLOAT dist, u, v;				//距離とUV座標
	DWORD faceINDEX = 0;	//ポリゴン番号
	//地面との当たり判定
	D3DXVECTOR3 pos = ((const D3DXVECTOR3&)transform.position)+D3DXVECTOR3(0,1,0);  //transform.position,transform.toMatrix4()はキャラクターのポジションと行列
	D3DXIntersect(mesh, &pos, &(const D3DXVECTOR3&)-getUp(transform.toMatrix4()),
		&groundCollide, &faceINDEX, &u, &v, &dist, NULL, NULL);      //getUpはキャラクターの上向きベクトルを取得しています。
	if (groundCollide){  //地面とあたっていたら

		DWORD*	p_index = 0;
		BYTE* p_vertex = 0;
		//ロック
		if (!FAILED(mesh->LockIndexBuffer(D3DLOCK_DISCARD, (LPVOID*)&p_index))){
			DWORD VerNum[3];
			VerNum[0] = p_index[faceINDEX * 3];
			VerNum[1] = p_index[faceINDEX * 3 + 1];
			VerNum[2] = p_index[faceINDEX * 3 + 2];
			if (!FAILED(mesh->LockVertexBuffer(D3DLOCK_DISCARD, (LPVOID*)&p_vertex))){
				D3DXVECTOR3 VerPos[3];
				VerPos[0] = *(D3DXVECTOR3*)(p_vertex + VerNum[0] * VertexSize);       //ここでアクセス違反が発生する(0xC0000005: 場所 0x2B9FEF4C の読み取り中にアクセス違反が発生しました。)
				VerPos[1] = *(D3DXVECTOR3*)(p_vertex  +VerNum[1] * VertexSize);
				VerPos[2] = *(D3DXVECTOR3*)(p_vertex  +VerNum[2] * VertexSize);


				D3DXVECTOR3 P = VerPos[0] + (u * (VerPos[1] - VerPos[0])) + (v * (VerPos[2] - VerPos[0]));   //座標を算出
				transform.position = (const Vector3&)P;
				mesh->UnlockVertexBuffer();
			}
			mesh->UnlockIndexBuffer();
		}
	}
 
LockVertexBufferをした後に頂点座標を取得しようとするとアクセス違反で怒られます。
自分が思うにはVerNum[0] * VertexSizeがp_vertexを超えているから??と言った感じです。
しかしネットのサンプルとどこが違うのかわかりません。
ちなみに参考にさせていただいたコードがこちらのブログです
http://ponkotu2009.blog53.fc2.com/blog-date-201311.html

なにか原因がわかる方、いらっしゃいませんでしょうか。よろしくお願いします。

環境  
OS : Windows
コンパイラ名 : VisualStudio2013

Re: DirectX9の地面と当たった座標を取得したいがアクセス違反が起こる

Posted: 2014年12月17日(水) 01:03
by 2toN
DWORDからBYTEへ、*3しているところを*2にしたら動作しました。(ほしい座標はもってこれていませんが・・・)

とりあえず解決とさせていただきます。申し訳ございませんでした。

Re: DirectX9の地面と当たった座標を取得したいがアクセス違反が起こる

Posted: 2014年12月17日(水) 10:53
by 2toN
何度ももうしわけございません。
上記のBYTEだとうまく座標を持ってこれませんでしたが、WORDにしたところ座標を取得することができました。
自己解決してしまって申し訳ありませんが、今後同じような壁に当たった方がおられたら参考にしていただけると幸いです。

スレ汚し申し訳ございませんでした。

Re: DirectX9の地面と当たった座標を取得したいがアクセス違反が起こる

Posted: 2014年12月17日(水) 19:00
by ISLe()
参考したという記事にはWORDが使われていますね。

インデックスバッファは、作成する際に16ビットサイズか32ビットサイズかを選択できます。
16ビットサイズで作成したならWORD、32ビットサイズで作成したならDWORDを使うことになります。