0からのゲームプログラミング > 回転

Back Next
更新日 2004.04.24
回転

 今回は、ヘリのプロペラを回転させてみましょう。


Screen.h

//====================================================================
//			CScreenStage クラスの定義
//====================================================================
class CScreenStage : public CScreen{
	// Xファイル
	CXFile		m_xHeli;		// ヘリ本体
	CXFile		m_xProp;		// プロペラ
	CXFile		m_xGround;		// 地面

	// マトリックス(行列)
	D3DXMATRIX	m_MtrxHeli;		// ヘリ本体
	D3DXMATRIX	m_MtrxProp;		// プロペラ
	D3DXMATRIX	m_MtrxGround;		// 地面

	float		m_fPropAngle;		// プロペラの角度(単位:ラジアン)

	・
	・
	・
};

 Screen.h では、プロペラの角度を保存する変数を追加しています。


ScreenStage.cpp

// コンストラクタ
CScreenStage::CScreenStage() : m_fPropAngle(0)
{
	・
	・
	・
}


// 動作
// 引数、戻値なし。
void CScreenStage::Move(void)
{
	// 平行移動の行列を作成
	D3DXMatrixTranslation(&m_MtrxHeli, 0, 100, 0);

	// プロペラを回転させる
	m_fPropAngle += 0.5f;
	if(m_fPropAngle > PI)
		m_fPropAngle -= 2 * PI;

	// 回転行列を作成
	D3DXMatrixRotationY(&m_MtrxProp, m_fPropAngle);

	m_MtrxProp = m_MtrxProp * m_MtrxHeli;
}


 コンストラクタでは、変数の初期化をしています。


 プロペラを回転させるところでは、1フレーム毎に 0.5f ラジアン加えています。角度の範囲を -π 〜 π ラジアンとして考えている為、πラジアンを超えれば 2πラジアンを引いています。この範囲チェックをしなくても、しばらく [ 半永久? ] は大丈夫な訳ですが、一応しています。

PI (π、パイ) は、3.141592654f と内部で定義しています。(DirectX では、D3DX_PI が用意されていますが、単に名前を短くしたかっただけです。)


 D3DXMatrixRotationY 関数は、y 軸を回転軸にして回転する行列を作成します。第1パラメータには、指定したマトリックス [ 行列 ] に演算結果が格納されます。第2パラメータには、回転の角度 ( ラジアン単位 ) を指定します。y軸方向に対して時計回り [ 右回り ] が正の角度です。(注:右手座標系)


 同じように x軸、z軸を回転軸にして回転する行列を作成するには、それぞれ、D3DXMatrixRotationX 、 D3DXMatrixRotationZ 関数を使用します。使用法は、D3DXMatrixRotationY 関数とほぼ同じです。


 m_MtrxProp = m_MtrxProp * m_MtrxHeli;

 最後に上のコードですが、行列の乗算には、記号 * を使って行います。まず、プロペラを回転させてから、平行移動させています。掛ける順序を逆にする、即ち、平行移動してから回転させると意味が違ってきます。イメージして下さいね。

 上の例では、ヘリの中心がy軸上にあるので、掛ける順序を替えても結果は同じになってしまいますが。尚、上のコードは、以下のようにする方がスマートでしょうか。

 m_MtrxProp *= m_MtrxHeli;


 行列の積は、D3DXMatrixMultiply 関数を使っても出来ますが、記号 * を使った方が簡単ですね。


 また、回転行列を作成する関数には、以下のような関数もあります。

D3DXMatrixRotationAxis
D3DXMatrixRotationQuaternion
D3DXMatrixRotationYawPitchRoll



 今回の内容のプログラムは、こちらのページにあります。

【スポンサード リンク】


Back Next

0からのゲームプログラミング > 回転