更简化的第一人称视角,矩阵未优化。
简化后的部分,实现对鼠标的控制。
//设置第一人称视角控制
HRESULT CMyD3DApplication::SetFirstView()
{
D3DXMATRIX matIdentity;
D3DXMatrixIdentity( &matIdentity );
m_pd3dDevice->SetTransform( D3DTS_WORLD, &matIdentity );
//视角矩阵
D3DXMATRIX matView;
D3DXMATRIX matMoveView,matMoveOut;
D3DXMATRIX matRotY,matRotX,matBothRot;
D3DXMatrixLookAtLH( &matView, &m_matAni.eye, &m_matAni.LookAt, &m_matAni.Up);
{
//对摄影机进行水平旋转
if(m_RotView){
D3DXMatrixRotationY(&matRotY,m_yAngle);
D3DXMatrixRotationX(&matRotX,m_xAngle);
D3DXMatrixMultiply(&matBothRot,&matRotY,&matRotX);
D3DXMatrixMultiply(&matRotOut,&matView,&matBothRot);
matView = matRotOut;
m_StartView = true;
}else{
if(m_StartView){
matView = matRotOut;
}
}
//移动
if(m_AtView){
m_AtView = false;
D3DXMatrixTranslation(&matMoveView,m_ViewX,m_ViewY,m_ViewZ);
D3DXMatrixMultiply(&matMoveOut,&matView,&matMoveView);
matView = matMoveOut;
}
}
m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView);
// Set the projection matrix
D3DXMATRIX matProj;
FLOAT fAspect = ((FLOAT)m_d3dsdBackBuffer.Width) / m_d3dsdBackBuffer.Height;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, fAspect, 1.0f, 100.0f );
m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
return S_OK;
}
//通过Dinput的鼠标处理部分。
HRESULT CMyD3DApplication::ProcessMouse()
{
if(FAILED(pMouse->GetDeviceState(sizeof(MState),(LPVOID)&MState)))
return E_FAIL;
//X > 0 X < 0
if(MState.lX < 0){
m_RotView = true;
m_RotXYView = true;
m_yAngle += m_RotationAdd;
}
if(MState.lX > 0){
m_RotView = true;
m_RotXYView = true;
m_yAngle -= m_RotationAdd;
}
//Y > 0 Y < 0
if(MState.lY < 0){
m_RotView = true;
m_RotXYView = false;
m_xAngle += m_RotationAdd;
}
if(MState.lY > 0){
m_RotView = true;
m_RotXYView = false;
m_xAngle -= m_RotationAdd;
}
//零时
if(MState.lX == 0 && MState.lY == 0){
m_RotView = false;
}
return S_OK;
}
浙公网安备 33010602011771号