どうもこんにちはISOMIです。連続でブログを書かせていただきます。
今回は、メッシュから簡単にバウンディングボックスとバウンディングスフィアを求める方法を書いてみようと思います。といっても、DirectXにある関数を使うだけなのですが(笑)。
[3回]
使用するのは、D3DXComputeBoundingBox関数とD3DXComputeBoundingSphere関数です。
// クラスのメンバ変数などにでも
LPD3DXMESH lpMesh; // 読み込んだメッシュのデータ
D3DXVECTOR3 vBBMin, vBBMax; // バウンディングボックスの最小点座標と最大点座標
D3DXVECTOR3 vBBLen; // 最小点から最大点へのベクトル
D3DXVECTOR3 vBSCenter; // バウンディングスフィアの中心座標
float BSr; // バウンディングスフィアの半径
// メッシュを読み込んでいるかのチェック
if( lpMesh != NULL)
{
// バウンディングボックス計算
DWORD VertexCnt = lpMesh->GetNumVertices(); // 頂点数
DWORD VertexSize = lpMesh->GetNumBytesPerVertex(); // 1つの頂点のサイズ
BYTE *p;
// 頂点バッファをロックし、頂点の先頭アドレス取得
HRESULT hr = lpMesh->LockVertexBuffer(D3DLOCK_READONLY,(LPVOID*)&p);
if(SUCCEEDED(hr)){
// バウンディングボックスを算出
D3DXComputeBoundingBox( (D3DXVECTOR3*)p,
VertexCnt,
VertexSize,
&vBBMin,
&vBBMax);
vBBLen = vBBMax - vBBMin;
// バウンディングスフィアを算出
D3DXComputeBoundingSphere( (D3DXVECTOR3*)p,
VertexCnt,
VertexSize,
&vBSCenter,
&BSr);
// 頂点バッファをアンロック
lpMesh->UnlockVertexBuffer();
}
}
以上でバウンディングボックスとバウンディングスフィアの求め方でした。
レイ判定など処理のかかる判定の前にバウンディングボックスなどで簡単に判定をしておくとだいぶ実行時間が変わります。実際にReleaseモードで60FPS出なかったのが出るようになったので、やっておくといいでしょう。
PR
COMMENT