2009年11月10日火曜日

任意の位置を中心に回転

まあ 単純なミスで苦労したけどできたかな


//=========================================================================================================
// ActRotationNextFrame
// : フレームを一つ進める
// IN : NONE
// OUT : NONE
//RETURN : TRUE : 処理済み
//=========================================================================================================
BOOL CKeyFrameAnimate::ActRotationNextFrame()
{
if( m_type&ROTATION && m_dwRotFrameSize != 0)
{
//--------------------------------
//回転フレームカウントをインクリメント
//--------------------------------
m_dwRotFrameCnt++;
//--------------------------------
//現在回転角度 + 速度
//--------------------------------
D3DXVECTOR3 vecRotValue( m_vecSRot.x +=m_vecRotUnit.x,
m_vecSRot.y +=m_vecRotUnit.y,
m_vecSRot.z +=m_vecRotUnit.z);

//--------------------------------
//行列合成
//--------------------------------
m_matRst = m_matTarget;
if(!m_bSelf)//任意座標中心回転
{
//--------------------------------------------------------
// 回転ターゲット位置(V) 回転中心位置(O)の値 ||VO||を求め、移動させておく
// ||VO||の距離分原点中心から離れ、回転することになり、回転後の位置に
// 回転中心までの距離を加算することで任意位置中心回転座標を取得。
//--------------------------------------------------------
m_matRst._41 = m_matTarget._41 - m_vecRotCenter.x;
m_matRst._42 = m_matTarget._42 - m_vecRotCenter.y;
m_matRst._43 = m_matTarget._43 - m_vecRotCenter.z;
}
//--------------------------------
//ヨー・ピッチ・ロールを指定してクォータニオンを作成
//--------------------------------
D3DXQUATERNION qRst(0,0,0,1.0f);
D3DXQuaternionRotationYawPitchRoll(&qRst,m_vecSRot.y,m_vecSRot.x,m_vecSRot.z);
D3DXMATRIX matRot;
D3DXMatrixRotationQuaternion(&matRot,&qRst); //クォータニオンの計算を行う行列を作成
D3DXMatrixMultiply(&m_matRst,&m_matRst,&matRot);//合成
//--------------------------------------------------------
// 回転後、回転中心までの距離を加算し、任意位置中心回転座標を取得。
//--------------------------------------------------------
if( !m_bSelf )//任意座標中心回転
{
m_matRst._41 += m_vecRotCenter.x;
m_matRst._42 += m_vecRotCenter.y;
m_matRst._43 += m_vecRotCenter.z;
}
else//ターゲットで指定された行列の位置中心回転
{
//--------------------------------
//元の位置に移動
//--------------------------------
m_matRst._41 = m_matTarget._41;
m_matRst._42 = m_matTarget._42;
m_matRst._43 = m_matTarget._43;
}
//--------------------------------
//終了チェック
//--------------------------------
if(m_dwRotFrameCnt >= m_dwRotFrameSize)
{
m_dwRotFrameCnt = 0;//フレームカウント初期化
m_dwRotFrameSize = 0;//アニメーション終了
m_type&=(~ROTATION) ;//フラグオフ
}
return TRUE;
}//if( m_type&ROTATION && m_dwRotFrameSize != 0)
return FALSE;
}

0 件のコメント:

コメントを投稿