directx メモ – 2Dカメラの作り方(directx9)

Posted: 2012年2月19日 カテゴリー: プログラミングメモ, directx, directx メモ
タグ:, , , , , , ,

今回はあまりのネタの無さに、昔別サイトの掲示板で書いた物を書き直して見ました。このメモは、前に書いた2Dカメラの作り方と同じ論理でC++とdirectx9で2D用のカメラの作り方を乗せます。ちなみに、今回は描画を全てID3DXSpriteを使用していますので、板ポリゴンを使用する場合は別の方法をとってください。

まず、違う記事で書いた2Dカメラを持ってきます。実装方法は、XNAをdirectxに変換するだけなので、詳細は省いときます。必要なのはカメラの現在地、ズーム(拡大)、回転を合わせたマトリックスを出す関数を用意することです。

次に実際に描画する時、ID3DXSpriteのBegin()を呼ぶ際にカメラの行列を保存し、End()が呼ばれるまでの間に描画される全てのスプライトにこのマトリックスを適用す。

後は、描画処理を実装するだけです。少し自分で作ったクラスが入りますが、描画関数はXNAのSpriteBatchに似せて作られています:

// カメラのマトリックスを保存する
D3DXMATRIX _transform = camera.TransformMatrix;

void Sprite::Draw(Texture *texture, Vector2 &position, Colour &colour, Vector2 &origin, float scale, float angle, float depth)
{
// 位置と原点を保存する
D3DXMATRIX m1, m2;
D3DXVECTOR3 ori( origin.X, origin.Y, 1.0f );
D3DXVECTOR3 pos( position.X, position.Y, 0 );

// スケーリング
D3DXMatrixScaling( &m1, scale, scale, 0.0f );

// 回転
D3DXMatrixRotationZ( &m2, angle );
D3DXMatrixMultiply( &m1, &m1, &m2 );

// 移動
D3DXMatrixTranslation( &m2, position.X, position.Y, depth );
D3DXMatrixMultiply( &m1, &m1, &m2);

// パラメータで送られてきた位置や角度とカメラのマトリックスを合わせる
D3DXMatrixMultiply( &m1, &m1, &_transform);

// 行列をスプライトに設定する
HR( _sprite->SetTransform( &m1 ) );

// 実際に描画する
_sprite->Draw( texture, NULL, &ori, NULL, colour );

// 行列をリセットする
D3DXMatrixIdentity( &m1 );
_sprite->SetTransform( &m1 );
}

以上です。実装後はこんな感じになります:

http://www.youtube.com/watch?v=b_6AWmiFz54

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中