DirectX9の地面と当たった座標を取得したいがアクセス違反が起こる
Posted: 2014年12月16日(火) 21:17
はじめまして。
現在DirectX9をつかってゲーム作りをしています。そこでD3DXIntersectを使って地面との当たり判定を行い、その当たった座標を取得してその座標にキャラクターを設置させたいところです。
ネットに載っていたサンプル等を見て組んだプログラムがこちらで
LockVertexBufferをした後に頂点座標を取得しようとするとアクセス違反で怒られます。
自分が思うにはVerNum[0] * VertexSizeがp_vertexを超えているから??と言った感じです。
しかしネットのサンプルとどこが違うのかわかりません。
ちなみに参考にさせていただいたコードがこちらのブログです
http://ponkotu2009.blog53.fc2.com/blog-date-201311.html
なにか原因がわかる方、いらっしゃいませんでしょうか。よろしくお願いします。
環境
OS : Windows
コンパイラ名 : VisualStudio2013
現在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