|
发表于 2003-11-17 14:07:00
|
显示全部楼层
Re:第一人称视角问题
float m_fPitch;
CDXInput *m_Input;
D3DXVECTOR3 m_vLook; // Camera Look Vector
D3DXVECTOR3 m_vUp; // Camera Up Vector
D3DXVECTOR3 m_vRight; // Camera Right Vector
D3DXVECTOR3 m_vCameraPos; // Camera Position
//-----------------------------------------------------------------------------------------------
//fElpasedTime:当前祯和上一祯的时间间隔
//fMoveSpeed:玩家的移动速度
//功能:更新视矩阵
//-----------------------------------------------------------------------------------------------
void CCamera::UpdateCamera(float fElpasedTime,float fMoveSpeed)
{
//读取输入
m_Input->ReadUserInput();
DIMOUSESTATE2 diMouseState = m_Input->GetMouseState();
D3DXMATRIX mtxRot;
//根据鼠标让view matrix变化
if(diMouseState.rgbButtons[0] & 0x80 )
{
if( diMouseState.lY != 0 )
{
D3DXMatrixRotationAxis( &mtxRot, &m_vRight, D3DXToRadian( (float)diMouseState.lY / 3.0f) );
//m_vLook绕m_vRight旋转
D3DXVec3TransformCoord( &m_vLook, &m_vLook, &mtxRot );
//m_vUp绕m_vRight旋转
D3DXVec3TransformCoord( &m_vUp, &m_vUp, &mtxRot );
}
if( diMouseState.lX != 0 )
{
float fPitchAmount = ((float)diMouseState.lX / 3.0f);
m_fPitch += fPitchAmount;
D3DXMatrixRotationAxis( &mtxRot, &D3DXVECTOR3(0,1,0), D3DXToRadian(fPitchAmount) );
//m_vLook绕y轴旋转
D3DXVec3TransformCoord( &m_vLook, &m_vLook, &mtxRot );
//m_vUp绕y轴旋转
D3DXVec3TransformCoord( &m_vUp, &m_vUp, &mtxRot );
}
}
D3DXVECTOR3 tmpLook = m_vLook;
D3DXVECTOR3 tmpRight = m_vRight;
//人物向前走
if( m_Input->KeyDown(DIK_W) )
m_vCameraPos += (fMoveSpeed*tmpLook)*fElpasedTime;
//向后退
if( m_Input->KeyDown(DIK_S) )
m_vCameraPos -= (fMoveSpeed*tmpLook)*fElpasedTime;
//向左走
if( m_Input->KeyDown(DIK_A) )
m_vCameraPos -= (fMoveSpeed*tmpRight)*fElpasedTime;
//向右走
if( m_Input->KeyDown(DIK_D) )
m_vCameraPos += (fMoveSpeed*tmpRight)*fElpasedTime;
//向上
if( m_Input->KeyDown(DIK_HOME) )
m_vCameraPos.y += fMoveSpeed*fElpasedTime;
//向下
if( m_Input->KeyDown(DIK_END) )
m_vCameraPos.y -= fMoveSpeed*fElpasedTime;
//更新视矩阵
UpdateViewMatrix();
}
//---------------------------------------------------------------------------------------
//功能:更新视矩阵
//---------------------------------------------------------------------------------------
void CCamera::UpdateViewMatrix()
{
// 视矩阵的构成:
//
// | rx ux lx 0 |
// | ry uy ly 0 |
// | rz uz lz 0 |
// | -(r.e) -(u.e) -(l.e) 1 |
//
// r = Right vector
// u = Up vector
// l = Look vector
// e = Eye position in world space
// . = Dot-product operation
D3DXMATRIX view;
D3DXMatrixIdentity(&view);
// Vector regeneration
D3DXVec3Normalize( &m_vLook, &m_vLook );
D3DXVec3Cross( &m_vRight, &m_vUp, &m_vLook );
D3DXVec3Normalize( &m_vRight, &m_vRight );
//D3DXVec3Cross( &m_vUp, &m_vLook, &m_vRight );
D3DXVec3Normalize( &m_vUp, &m_vUp );
// Build the view matrix
view._11 = m_vRight.x; view._12 = m_vUp.x; view._13 = m_vLook.x;
view._21 = m_vRight.y; view._22 = m_vUp.y; view._23 = m_vLook.y;
view._31 = m_vRight.z; view._32 = m_vUp.z; view._33 = m_vLook.z;
view._41 =- D3DXVec3Dot( &m_vCameraPos, &m_vRight );
view._42 =- D3DXVec3Dot( &m_vCameraPos, &m_vUp );
view._43 =- D3DXVec3Dot( &m_vCameraPos, &m_vLook );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &view );
} |
|