1、实现第三人称摄像机 案例说明:本例子 通过在 D3D 中架设一个 第三人称 摄像机 ,掌握 DirectInput 的使用和 D3D中 3 维向量的计算。 打开工程后,首先修改原来 FreeCamera 的类设计, 将 private 成员改成 protected 成员, 将Input 修改成虚函数,加入 Move 和 Rote 两个成员函数 在 FreeCamera.cpp 文件中实现 Move 和 Rote 函数 D3DXVECTOR3 FreeCamera:Move() D3DXVECTOR3 moveVec(0.0f,0.0f,0.0f); if (g_pInput-IsKeyDown
2、(DIK_UP) | g_pInput-IsKeyDown(DIK_W) /计算摄像机方向的向量 D3DXVECTOR3 vec = m_vViewAt- m_vPos; /转换成单位向量 D3DXVec3Normalize( /向量缩小倍 vec = vec*0.01f; /移动摄像机 moveVec += vec; if (g_pInput-IsKeyDown(DIK_DOWN) | g_pInput-IsKeyDown(DIK_S) D3DXVECTOR3 vec = m_vViewAt- m_vPos; D3DXVec3Normalize( vec = vec*0.01f; moveV
3、ec -= vec; if (g_pInput-IsKeyDown(DIK_LEFT) | g_pInput-IsKeyDown(DIK_A) D3DXVECTOR3 vec = m_vViewAt- m_vPos; D3DXVec3Normalize( D3DXVECTOR3 fvec; /使用叉积计算垂直于摄像机方向的向量 D3DXVec3Cross( fvec = fvec*0.01f; moveVec += fvec; if (g_pInput-IsKeyDown(DIK_RIGHT) | g_pInput-IsKeyDown(DIK_D) D3DXVECTOR3 vec = m_vV
4、iewAt- m_vPos; D3DXVec3Normalize( D3DXVECTOR3 fvec; D3DXVec3Cross( fvec = fvec*0.01f; moveVec -= fvec; return moveVec; D3DXVECTOR3 FreeCamera:Rote() D3DXVECTOR3 vec = m_vViewAt- m_vPos; if (g_pInput-GetRButton() /获得鼠标移动的大小 int x = g_pInput-GetMoveX(); D3DXMATRIX rote,temp; /生成沿向量 tvec旋转的矩阵 D3DXMatri
5、xRotationAxis( int y = -g_pInput-GetMoveY(); D3DXVECTOR3 tvec; D3DXVec3Cross( /生成沿向量 tvec旋转的矩阵 D3DXMatrixRotationAxis( D3DXVec3TransformCoord( D3DXVec3Normalize( float t= D3DXVec3Dot( if (fabs(t) GetMoveZ(); if (z 0 vec = vec * 0.001f * z; /移动摄像机 m_vPos = m_vPos + vec; if (z GetNumAnimationSets(); LPD3DXANIMATIONSET pAnimSet; for(DWORD i=0;iGetAnimationSet(i, strcpy(strTempName, pAnimSet-GetName(); if(strcmp(strAnimName,strTempName)=0)