ページ 1 / 1
【DirectX9】任意の点を中心に画像を回転→任意の座標に描画
Posted: 2013年8月05日(月) 22:18
by MoNoQLoREATOR
DirectX9のお話です。
任意の点を中心に画像を回転
↓
任意の座標に描画
ということを実現しようとしたのですが、何故か画像の大きさまで変わってしまいます。
十中八九 行列の計算方法を間違えているはずですが、どこをどう間違えているのかがわかりません。
以下実行結果と主要ソースコードです。

奥が無回転、手前が有回転です。
mie_image_draw.cpp
► スポイラーを表示
コード:
#include "../h/includes.h"
bool mie::image::draw()
{
D3DXMatrixTranslation(&matrix, 0,0,0); // Initialize Matrix
rotate(degree() ); // 内部でmatrixに行列を掛けて上書きしている
translate(); // rotate内で移動した分多めに移動させている
sprite->SetTransform(&matrix); // 最終的に得られた行列を反映させる
sprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_DONOTSAVESTATE);
HRESULT hr = sprite->Draw(texture, NULL, NULL, NULL, 0xFFFFFFFF);
sprite->End();
return SUCCEEDED(hr);
}
mie_image_dC-rotate.cpp
► スポイラーを表示
コード:
#include "../h/includes.h"
float mie::image::degree() const { return Degree; }
float & mie::image::degree(){ return Degree; }
void mie::image::rotate(const float degree)
{
// ここでは、z軸を中心とした回転のみを考える
/*
回転の中心となる点が座標(0,0,0)の地点になるように画像を移動
↓
そこに回転行列を掛ける
↓
生成された行列をmatrixに掛けて上書きする
//*/
/*
rotcx() ... 回転の中心のx座標
rotcy() ... 回転の中心のy座標
ちなみに現在は画像の中心が回転の中心になるように値が固定されている
//*/
D3DXMATRIX mat;
D3DXMatrixTranslation(&mat, -float(rotcx() ),-float(rotcy() ),0);
D3DXMATRIX rotm;
D3DXMatrixRotationZ(&rotm, D3DX_PI*degree/180);
mat *= rotm;
matrix *= mat;
}
mie_image_translate.cpp
► スポイラーを表示
コード:
#include "../h/includes.h"
void mie::image::translate()
{
D3DXMATRIX mat;
D3DXMatrixTranslation(&mat, x+float(rotcx() ),y+float(rotcy() ),0);
matrix += mat;
}
念のためプロジェクトフォルダもごっそりアップロードしておきました。
VisualStudio2012用プロジェクト
VisualStudio2010用プロジェクト
VisualStudio2008用プロジェクト
※ DirectX9 SDK は付属しておりません。ライブラリディレクトリへのリンクは適切に修正してください
よろしくお願い致します。
Re: 【DirectX9】任意の点を中心に画像を回転→任意の座標に描画
Posted: 2013年8月05日(月) 22:36
by みけCAT
mie_image_translate.cppの移動行列はmatrixに足すのではなく掛けるべきなのではないですか?
Re: 【DirectX9】任意の点を中心に画像を回転→任意の座標に描画
Posted: 2013年8月07日(水) 01:14
by MoNoQLoREATOR
仰るとおりでした。
今となっては、何故足していたのかわかりませんが、とにかく移動行列を足すのではなく掛けるようにすると期待通りの表示になりました。
念のため修正後のコードを貼っておきます。
mie_image_translate.cpp
► スポイラーを表示
コード:
#include "../h/includes.h"
void mie::image::translate()
{
D3DXMATRIX mat;
D3DXMatrixTranslation(&mat, x+float(rotcx() ),y+float(rotcy() ),0);
matrix *= mat;
}
解決しました。
ありがとうございました。