忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

メッシュからバウンディングスフィアとバウンディングボックスを求める

どうもこんにちは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

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]