Microsoft Visual Studio .NET 2003
 Microsoft DirectX 9.0 SDK (December 2004)

■ビルボード Prev  Top  Next

今回はビルボードをやります。
ビルボードは、プリミティブを常にユーザーの方を向くように回転させる処理のことです。 通常は平面である2Dエフェクトが、カメラ位置と方向に関係なく常に正面を向くようにする目的で使用します。

---Main.cpp---


void SetBillBoardMatrix( LPDIRECT3DDEVICE9 pd3dDevice, D3DXMATRIX* pMatMatrix )
{
   D3DXMATRIX CameraMatrix, WorldMatrix, ScalingMatrix, TranslationMatrix;

   //ビューマトリックスを取得する
   pd3dDevice->GetTransform( D3DTS_VIEW, &CameraMatrix );

   //ビューマトリックスによる回転マトリックスの逆行列(注意1)
   D3DXMatrixInverse( &CameraMatrix, NULL, &CameraMatrix );

   //ビューマトリックスの逆行列は、オブジェクトの向き(回転)だけを考慮するので平行移動は無効にする。
   CameraMatrix._41 = 0.0f;
   CameraMatrix._42 = 0.0f;
   CameraMatrix._43 = 0.0f;
   
   //スケーリングマトリックスを抽出する
   D3DXMatrixIdentity( &ScalingMatrix );
   ScalingMatrix._11 = pMatMatrix->_11;
   ScalingMatrix._22 = pMatMatrix->_22;
   ScalingMatrix._33 = pMatMatrix->_33;

   //平行移動マトリックスを抽出する
   D3DXMatrixIdentity( &TranslationMatrix );
   TranslationMatrix._41 = pMatMatrix->_41;
   TranslationMatrix._42 = pMatMatrix->_42;
   TranslationMatrix._43 = pMatMatrix->_43;

   //スケーリングして、回転して、平行移動する。
   WorldMatrix = ScalingMatrix * CameraMatrix * TranslationMatrix;
   pd3dDevice->SetTransform( D3DTS_WORLD, &WorldMatrix );
}

D3DXMATRIX GetBillBoardMatrix( LPDIRECT3DDEVICE9 pd3dDevice, D3DXMATRIX* pMatMatrix )
{
   D3DXMATRIX CameraMatrix, WorldMatrix, ScalingMatrix, TranslationMatrix;

   //ビューマトリックスを取得する
   pd3dDevice->GetTransform( D3DTS_VIEW, &CameraMatrix );

   //ビューマトリックスによる回転マトリックスの逆行列(注意1)
   D3DXMatrixInverse( &CameraMatrix, NULL, &CameraMatrix );

   //ビューマトリックスの逆行列は、オブジェクトの向き(回転)だけを考慮するので平行移動は無効にする。
   CameraMatrix._41 = 0.0f;
   CameraMatrix._42 = 0.0f;
   CameraMatrix._43 = 0.0f;
   
   //スケーリングマトリックスを抽出する
   D3DXMatrixIdentity( &ScalingMatrix );
   ScalingMatrix._11 = pMatMatrix->_11;
   ScalingMatrix._22 = pMatMatrix->_22;
   ScalingMatrix._33 = pMatMatrix->_33;

   //平行移動マトリックスを抽出する
   D3DXMatrixIdentity( &TranslationMatrix );
   TranslationMatrix._41 = pMatMatrix->_41;
   TranslationMatrix._42 = pMatMatrix->_42;
   TranslationMatrix._43 = pMatMatrix->_43;

   //スケーリングして、回転して、平行移動する。
   WorldMatrix = ScalingMatrix * CameraMatrix * TranslationMatrix;

   return WorldMatrix;
}

今回は関数だけ紹介します。この関数内でビルボード用の行列変換マトリックスを作成して、ついでにワールド座標系に格納します。 引数のpMatMatrixは2Dオブジェクトのスケーリングと平行移動成分を持ちます。回転成分をいれても無視します。

(注意1) ビューマトリックスの逆行列を取得しています。これはカメラの回転方向を打ち消して常に正面を向くようにするための行列です。

プログラムは以上ですが、2Dオブジェクトを作成するときの注意がいくつかあります。

  • 原点位置に配置する
  • XY平面状に平行に配置する。
  • 面の表面(見えるほうの面)をZ軸の負の方向に向ける。
  • Prev  Top  Next
    inserted by FC2 system