// ViewCamera.cpp: implementation of the CViewCamera class. // ////////////////////////////////////////////////////////////////////// #include "ViewCamera.h" #include "Vertex.h" #include #define KeyPressed( key ) HIBYTE( GetAsyncKeyState( key ) ) ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CViewCamera::CViewCamera() { m_CameraMode=0; m_matView.MakeIdent(); m_matPosition.MakeIdent(); m_fRotx=m_fRoty=m_fRotz=0.0f; m_cFade=-1; m_dwTickTime=-1; } CViewCamera::~CViewCamera() { } void CViewCamera::BuildFrustum(float fAspect, float fFov,float fNearPlane,float fFarPlane) { //fFarPlane=1000.0f; m_fAspect=fAspect; m_fFov=fFov; m_fFarPlane=fFarPlane; m_fNearPlane=100.0f; vector3 vecTopLeft,vecTopRight,vecBottomLeft,vecBottomRight; //float fFrustumHeight=fFarPlane*tanf(fFov*0.5f); //float fFrustumWidth=fFrustumHeight*fAspect; float fFrustumWidth=fFarPlane*tanf(fFov*0.5f); float fFrustumHeight=fFrustumWidth*fAspect; //fFrustumHeight*=0.8f; //fFrustumWidth*=0.8f; vecTopLeft.y=fFrustumHeight; vecTopLeft.x=-fFrustumWidth; vecTopLeft.z=fFarPlane; vecTopRight.y=fFrustumHeight; vecTopRight.x=fFrustumWidth; vecTopRight.z=fFarPlane; vecBottomLeft.y=-fFrustumHeight; vecBottomLeft.x=-fFrustumWidth; vecBottomLeft.z=fFarPlane; vecBottomRight.y=-fFrustumHeight; vecBottomRight.x=fFrustumWidth; vecBottomRight.z=fFarPlane; //m_vecFrustumTop[0]=vector3(0.0f,0.0f,-1000.0f); m_vecFrustumTop[0]=vector3(0.0f,0.0f,0.0f); m_vecFrustumTop[1]=vecTopRight; m_vecFrustumTop[2]=vecTopLeft; //m_vecFrustumBottom[0]=vector3(0.0f,0.0f,-1000.0f); m_vecFrustumBottom[0]=vector3(0.0f,0.0f,0.0f); m_vecFrustumBottom[1]=vecBottomLeft; m_vecFrustumBottom[2]=vecBottomRight; //m_vecFrustumLeft[0]=vector3(0.0f,0.0f,-1000.0f); m_vecFrustumLeft[0]=vector3(0.0f,0.0f,0.0f); m_vecFrustumLeft[1]=vecTopLeft; m_vecFrustumLeft[2]=vecBottomLeft; //m_vecFrustumRight[0]=vector3(0.0f,0.0f,-1000.0f); m_vecFrustumRight[0]=vector3(0.0f,0.0f,0.0f); m_vecFrustumRight[1]=vecBottomRight; m_vecFrustumRight[2]=vecTopRight; m_vecFrustumNear[0]=vector3(0.0f,0.0f,0.0f)+vector3(0.0f,0.0f,fNearPlane); m_vecFrustumNear[1]=vector3(0.0f,100.0f,0.0f)+vector3(0.0f,0.0f,fNearPlane); m_vecFrustumNear[2]=vector3(100.0f,0.0f,0.0f)+vector3(0.0f,0.0f,fNearPlane); } void CViewCamera::Render(LPDIRECT3DDEVICE8 pd3dDevice) { /* if(m_cFade==-1) return; m_pVertex[0].v.x=0.0f;m_pVertex[1].v.x=0.0f; m_pVertex[2].v.x=800.0f;m_pVertex[3].v.x=800.0f; m_pVertex[1].v.y=0.0f;m_pVertex[3].v.y=0.0f; m_pVertex[0].v.y=600.0f;m_pVertex[2].v.y=600.0f; m_pVertex[0].tu=0.0f;m_pVertex[1].tu=0.0f;m_pVertex[3].tu=1.0f;m_pVertex[2].tu=1.0f; m_pVertex[1].tv=0.0f;m_pVertex[3].tv=0.0f;m_pVertex[0].tv=1.0f;m_pVertex[2].tv=1.0f; color NowDiffuseColor; if(m_FadeInitValue+(m_AdderFadeValue)*m_cFade>255) { m_cFade=255; NowDiffuseColor.c=0xffffffff; } else if(m_FadeInitValue+(m_AdderFadeValue)*m_cFade<0) { m_cFade=255; NowDiffuseColor.c=0x0; } else { NowDiffuseColor.a=m_FadeInitValue+(m_AdderFadeValue)*m_cFade; NowDiffuseColor.r=m_FadeInitValue+(m_AdderFadeValue)*m_cFade; NowDiffuseColor.g=m_FadeInitValue+(m_AdderFadeValue)*m_cFade; NowDiffuseColor.b=m_FadeInitValue+(m_AdderFadeValue)*m_cFade; } for(int i=0;i<4;i++) { m_pVertex[i].w=0.1f;m_pVertex[i].v.z=0.1f; m_pVertex[i].Specular.c=0x0; m_pVertex[i].Diffuse.c=NowDiffuseColor.c; } pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE); pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); pd3dDevice->SetTexture(0,NULL); pd3dDevice->SetTexture(1,NULL); pd3dDevice->SetRenderState( D3DRS_LIGHTING,FALSE); pd3dDevice->SetRenderState( D3DRS_FOGENABLE,FALSE); pd3dDevice->SetVertexShader(TLVERTEXFVF); pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE ); pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE ); pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,m_pVertex,sizeof(TLVertex)); pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,FALSE); pd3dDevice->SetRenderState( D3DRS_LIGHTING,TRUE); pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE); if(m_cFade++>=255) { m_cFade=-1; } */ /* pd3dDevice->SetTexture(0,NULL); pd3dDevice->SetTexture(1,NULL); matrix mat; mat.MakeIdent(); pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&mat); pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE); pd3dDevice->SetVertexShader(LVERTEXFVF); pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); pd3dDevice->SetRenderState( D3DRS_LIGHTING,FALSE); //Top Render data LVertex FrustumVertex[3]; FrustumVertex[0].v=m_vecFrustumTop[0]; FrustumVertex[1].v=m_vecFrustumTop[1]; FrustumVertex[2].v=m_vecFrustumTop[2]; FrustumVertex[0].spec.c=0x0; FrustumVertex[0].diff.c=0xff0000ff; FrustumVertex[1].spec.c=0x0; FrustumVertex[1].diff.c=0xff0000ff; FrustumVertex[2].spec.c=0x0; FrustumVertex[2].diff.c=0xff0000ff; pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,1,FrustumVertex,sizeof(LVertex)); //Top Render data FrustumVertex[0].v=m_vecFrustumBottom[0]; FrustumVertex[1].v=m_vecFrustumBottom[1]; FrustumVertex[2].v=m_vecFrustumBottom[2]; FrustumVertex[0].spec.c=0x0; FrustumVertex[0].diff.c=0xffff0000; FrustumVertex[1].spec.c=0x0; FrustumVertex[1].diff.c=0xffff0000; FrustumVertex[2].spec.c=0x0; FrustumVertex[2].diff.c=0xffff0000; pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,1,FrustumVertex,sizeof(LVertex)); // FrustumVertex[0].v=m_vecFrustumLeft[0]; FrustumVertex[1].v=m_vecFrustumLeft[1]; FrustumVertex[2].v=m_vecFrustumLeft[2]; FrustumVertex[0].spec.c=0x0; FrustumVertex[0].diff.c=0xff000000; FrustumVertex[1].spec.c=0x0; FrustumVertex[1].diff.c=0xff000000; FrustumVertex[2].spec.c=0x0; FrustumVertex[2].diff.c=0xff000000; pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,1,FrustumVertex,sizeof(LVertex)); // FrustumVertex[0].v=m_vecFrustumRight[0]; FrustumVertex[1].v=m_vecFrustumRight[1]; FrustumVertex[2].v=m_vecFrustumRight[2]; FrustumVertex[0].spec.c=0x0; FrustumVertex[0].diff.c=0xff00ff00; FrustumVertex[1].spec.c=0x0; FrustumVertex[1].diff.c=0xff00ff00; FrustumVertex[2].spec.c=0x0; FrustumVertex[2].diff.c=0xff00ff00; pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,1,FrustumVertex,sizeof(LVertex)); pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW); pd3dDevice->SetRenderState( D3DRS_LIGHTING,TRUE); //*/ } void CViewCamera::MoveFrustum() { float fFrustumHeight=m_fFarPlane*tanf(m_fFov*0.5f); float fFrustumWidth=fFrustumHeight*(1.0f/m_fAspect); vector3 vecTopLeft,vecTopRight,vecBottomLeft,vecBottomRight,vecCenterAxisX,vecCenterAxisY,vecCenter; matrix matHeight,matWidth; matHeight.Translation(vector3(fFrustumWidth,fFrustumHeight,m_fFarPlane)); matHeight=matHeight*m_matPosition; vecTopRight=matHeight.GetLoc(); matHeight.Translation(vector3(-fFrustumWidth,fFrustumHeight,m_fFarPlane)); matHeight=matHeight*m_matPosition; vecTopLeft=matHeight.GetLoc(); matHeight.Translation(vector3(fFrustumWidth,-fFrustumHeight,m_fFarPlane)); matHeight=matHeight*m_matPosition; vecBottomRight=matHeight.GetLoc(); matHeight.Translation(vector3(-fFrustumWidth,-fFrustumHeight,m_fFarPlane)); matHeight=matHeight*m_matPosition; vecBottomLeft=matHeight.GetLoc(); matHeight.Translation(vector3(fFrustumWidth,0.0f,m_fFarPlane)); matHeight=matHeight*m_matPosition; vecCenterAxisX=matHeight.GetLoc(); matHeight.Translation(vector3(0.0f,fFrustumHeight,m_fFarPlane)); matHeight=matHeight*m_matPosition; vecCenterAxisY=matHeight.GetLoc(); matHeight.Translation(vector3(0.0f,0.0f,m_fFarPlane)); matHeight=matHeight*m_matPosition; vecCenter=matHeight.GetLoc(); m_vecFrustumTop[0]=m_matPosition.GetLoc(); m_vecFrustumTop[1]=vecCenter; m_vecFrustumTop[2]=vecCenterAxisY; m_vecCenterAxis[0]=(m_vecFrustumTop[1]-m_vecFrustumTop[0])^(m_vecFrustumTop[2]-m_vecFrustumTop[1]); m_vecCenterAxis[0].Normalize(); m_vecCenterAxis[0]=-m_vecCenterAxis[0]; m_vecFrustumTop[0]=m_matPosition.GetLoc(); m_vecFrustumTop[1]=vecCenter; m_vecFrustumTop[2]=vecCenterAxisX; m_vecCenterAxis[1]=(m_vecFrustumTop[1]-m_vecFrustumTop[0])^(m_vecFrustumTop[2]-m_vecFrustumTop[1]); m_vecCenterAxis[1].Normalize(); m_vecCenterAxis[1]=-m_vecCenterAxis[1]; m_vecFrustumTop[0]=m_matPosition.GetLoc(); m_vecFrustumTop[1]=vecTopRight; m_vecFrustumTop[2]=vecTopLeft; m_vecFrustumNormal[0]=(m_vecFrustumTop[1]-m_vecFrustumTop[0])^(m_vecFrustumTop[2]-m_vecFrustumTop[1]); m_vecFrustumNormal[0].Normalize(); m_vecFrustumBottom[0]=m_matPosition.GetLoc(); m_vecFrustumBottom[1]=vecBottomLeft; m_vecFrustumBottom[2]=vecBottomRight; m_vecFrustumNormal[1]=(m_vecFrustumBottom[1]-m_vecFrustumBottom[0])^(m_vecFrustumBottom[2]-m_vecFrustumBottom[1]); m_vecFrustumNormal[1].Normalize(); m_vecFrustumLeft[0]=m_matPosition.GetLoc(); m_vecFrustumLeft[1]=vecTopLeft; m_vecFrustumLeft[2]=vecBottomLeft; m_vecFrustumNormal[2]=(m_vecFrustumLeft[1]-m_vecFrustumLeft[0])^(m_vecFrustumLeft[2]-m_vecFrustumLeft[1]); m_vecFrustumNormal[2].Normalize(); m_vecFrustumRight[0]=m_matPosition.GetLoc(); m_vecFrustumRight[1]=vecBottomRight; m_vecFrustumRight[2]=vecTopRight; m_vecFrustumNormal[3]=(m_vecFrustumRight[1]-m_vecFrustumRight[0])^(m_vecFrustumRight[2]-m_vecFrustumRight[1]); m_vecFrustumNormal[3].Normalize(); /* m_vecFrustumNear[1]=; m_vecFrustumNear[2]=; */ matrix matNear[3]; matNear[0].Translation(vector3(0.0f,0.0f,0.0f)+vector3(0.0f,0.0f,m_fNearPlane)); matNear[1].Translation(vector3(100.0f,0.0f,0.0f)+vector3(0.0f,0.0f,m_fNearPlane)); matNear[2].Translation(vector3(0.0f,100.0f,0.0f)+vector3(0.0f,0.0f,m_fNearPlane)); matNear[0]=matNear[0]*m_matPosition; matNear[1]=matNear[1]*m_matPosition; matNear[2]=matNear[2]*m_matPosition; m_vecFrustumNear[0]=matNear[0].GetLoc(); m_vecFrustumNear[1]=matNear[1].GetLoc(); m_vecFrustumNear[2]=matNear[2].GetLoc(); /* vector3 vecTopLeft,vecTopRight,vecBottomLeft,vecBottomRight; vecTopLeft.y=fFrustumHeight; vecTopLeft.x=-fFrustumWidth; vecTopLeft.z=fFarPlane; vecTopRight.y=fFrustumHeight; vecTopRight.x=fFrustumWidth; vecTopRight.z=fFarPlane; vecBottomLeft.y=-fFrustumHeight; vecBottomLeft.x=-fFrustumWidth; vecBottomLeft.z=fFarPlane; vecBottomRight.y=-fFrustumHeight; vecBottomRight.x=fFrustumWidth; vecBottomRight.z=fFarPlane; m_vecFrustumTop[0]=vector3(0.0f,0.0f,-1000.0f); m_vecFrustumTop[1]=vecTopRight; m_vecFrustumTop[2]=vecTopLeft; m_vecFrustumBottom[0]=vector3(0.0f,0.0f,-1000.0f); m_vecFrustumBottom[1]=vecBottomLeft; m_vecFrustumBottom[2]=vecBottomRight; m_vecFrustumLeft[0]=vector3(0.0f,0.0f,-1000.0f); m_vecFrustumLeft[1]=vecTopLeft; m_vecFrustumLeft[2]=vecBottomLeft; m_vecFrustumRight[0]=vector3(0.0f,0.0f,-1000.0f); m_vecFrustumRight[1]=vecBottomRight; m_vecFrustumRight[2]=vecTopRight; */ /* matrix matPlaneTrans; matPlaneTrans.Translation(m_vecFrustumTop[0]); matPlaneTrans=m_matPosition*matPlaneTrans; m_vecFrustumTop[0]=matPlaneTrans.GetLoc(); matPlaneTrans.Translation(m_vecFrustumTop[1]); matPlaneTrans=m_matPosition*matPlaneTrans; m_vecFrustumTop[1]=matPlaneTrans.GetLoc(); matPlaneTrans.Translation(m_vecFrustumTop[2]); matPlaneTrans=m_matPosition*matPlaneTrans; m_vecFrustumTop[2]=matPlaneTrans.GetLoc(); // matPlaneTrans.Translation(m_vecFrustumBottom[0]); matPlaneTrans=m_matPosition*matPlaneTrans; m_vecFrustumBottom[0]=matPlaneTrans.GetLoc(); matPlaneTrans.Translation(m_vecFrustumBottom[1]); matPlaneTrans=m_matPosition*matPlaneTrans; m_vecFrustumBottom[1]=matPlaneTrans.GetLoc(); matPlaneTrans.Translation(m_vecFrustumBottom[2]); matPlaneTrans=m_matPosition*matPlaneTrans; m_vecFrustumBottom[2]=matPlaneTrans.GetLoc(); // matPlaneTrans.Translation(m_vecFrustumLeft[0]); matPlaneTrans=m_matPosition*matPlaneTrans; m_vecFrustumLeft[0]=matPlaneTrans.GetLoc(); matPlaneTrans.Translation(m_vecFrustumLeft[1]); matPlaneTrans=m_matPosition*matPlaneTrans; m_vecFrustumLeft[1]=matPlaneTrans.GetLoc(); matPlaneTrans.Translation(m_vecFrustumLeft[2]); matPlaneTrans=m_matPosition*matPlaneTrans; m_vecFrustumLeft[2]=matPlaneTrans.GetLoc(); // matPlaneTrans.Translation(m_vecFrustumRight[0]); matPlaneTrans=m_matPosition*matPlaneTrans; m_vecFrustumRight[0]=matPlaneTrans.GetLoc(); matPlaneTrans.Translation(m_vecFrustumRight[1]); matPlaneTrans=m_matPosition*matPlaneTrans; m_vecFrustumRight[1]=matPlaneTrans.GetLoc(); matPlaneTrans.Translation(m_vecFrustumRight[2]); matPlaneTrans=m_matPosition*matPlaneTrans; m_vecFrustumRight[2]=matPlaneTrans.GetLoc(); */ } void CViewCamera::InterfaceFreelook(int MouseX, int MouseY) { if(m_isAnimateCamera) { PlayAnimate(); return; } D3DXMATRIX *matPosition=(D3DXMATRIX*)GetMatPosition(); float fDeltaY=MouseX/300.0f; float fDeltaX=MouseY/300.0f; D3DXVECTOR3 vecT(0.0f, 0.0f, 0.0f); D3DXVECTOR3 vecR(0.0f, 0.0f, 0.0f); D3DXMATRIX matT, matR; D3DXQUATERNION qR; if(KeyPressed(VK_MENU)) return; if(KeyPressed(VK_SHIFT)) { if(KeyPressed('A') || KeyPressed(VK_LEFT)) vecT.x -= 341.0f; // Slide Left if(KeyPressed('D') || KeyPressed(VK_RIGHT)) vecT.x += 341.0f; // Slide Right if(KeyPressed(VK_DOWN)) vecT.y += 341.0f; // Slide Down if(KeyPressed(VK_UP)) vecT.y -= 341.0f; // Slide Up if(KeyPressed('W')) vecT.z += 341.0f; // Move Forward if(KeyPressed('S')) vecT.z -= 341.0f; // Move Backward if(KeyPressed(VK_NUMPAD4)) fDeltaY+=0.008f; if(KeyPressed(VK_NUMPAD6)) fDeltaY-=0.008f; if(KeyPressed(VK_NUMPAD8)) fDeltaX-=0.008f; if(KeyPressed(VK_NUMPAD2)) fDeltaX+=0.008f; } else { if(KeyPressed('A') || KeyPressed(VK_LEFT) ) vecT.x -= 1.0f; // Slide Left if(KeyPressed('D') || KeyPressed(VK_RIGHT)) vecT.x += 1.0f; // Slide Right if(KeyPressed(VK_DOWN)) vecT.y += 1.0f; // Slide Down if(KeyPressed(VK_UP)) vecT.y -= 1.0f; // Slide Up if(KeyPressed('W')) vecT.z += 1.0f; // Move Forward if(KeyPressed('S')) vecT.z -= 1.0f; // Move Backward if(KeyPressed(VK_NUMPAD4)) fDeltaY+=0.008f; if(KeyPressed(VK_NUMPAD6)) fDeltaY-=0.008f; if(KeyPressed(VK_NUMPAD8)) fDeltaX-=0.008f; if(KeyPressed(VK_NUMPAD2)) fDeltaX+=0.008f; } D3DXMatrixTranslation(&matT, vecT.x, vecT.y, vecT.z); D3DXMatrixMultiply(matPosition, &matT, matPosition); float fRotationX=GetRotationX(); float fRotationY=GetRotationY(); D3DXQuaternionRotationYawPitchRoll(&qR, 0.0f,-fRotationX ,0.0f); D3DXMatrixRotationQuaternion(&matR, &qR); D3DXMatrixMultiply(matPosition, &matR, matPosition); fRotationX-=fDeltaX; fRotationY-=fDeltaY; D3DXQuaternionRotationYawPitchRoll(&qR,-fDeltaY,fRotationX, 0.0f); D3DXMatrixRotationQuaternion(&matR, &qR); D3DXMatrixMultiply(matPosition, &matR, matPosition); SetRotaitionX(fRotationX); SetRotaitionY(fRotationY); SetVecPosition(vector3(GetMatPosition()->_41,GetMatPosition()->_42,GetMatPosition()->_43)); /* matrix matView; float fViewHeight=70000; matView.CameraLookAt(vector3(30000.0f/2.0f,fViewHeight,30000.0f/2.0f),vector3(30000.0f/2.0f,0.0f,30000.0f/2.0f),vector3(0.0f,0.0f,1.0f)); //*/ matrix *matPos=GetMatPosition(); matrix matInv; matInv.Inverse(*matPos); SetMatView(matInv); //matPos->Inverse(matView); //SetMatView(matView); if(KeyPressed(VK_SPACE)) { } else { MoveFrustum(); } } void CViewCamera::InterfaceCharlook(int MouseX, int MouseY, float fCharMove) { if(m_isAnimateCamera) { PlayAnimate(); return; } /* D3DXMATRIX *matPosition=(D3DXMATRIX*)GetMatPosition(); float fRoty=(float)MouseX/300.0f; float fRotx=(float)MouseY/300.0f; D3DXVECTOR3 vecT(0.0f, 0.0f, 0.0f); D3DXVECTOR3 vecR(-fRotx,-fRoty, 0.0f); //if(KeyPressed('W')) vecT.z += fCharMove; D3DXMATRIX matT, matR; D3DXQUATERNION qR; D3DXQuaternionRotationYawPitchRoll(&qR, 0, -m_fRotx, 0); D3DXMatrixRotationQuaternion(&matR, &qR); D3DXMatrixMultiply(m_matExtraPosition, &matR, m_matExtraPosition); D3DXMatrixTranslation(&matT, vecT.x, vecT.y, vecT.z); D3DXMatrixMultiply(m_matExtraPosition, &matT, m_matExtraPosition); m_fRotx+=vecR.x; m_fRoty+=vecR.y; m_fRotz+=vecR.z; D3DXQuaternionRotationYawPitchRoll(&qR, vecR.y, m_fRotx, vecR.z); D3DXMatrixRotationQuaternion(&matR, &qR); D3DXMatrixMultiply(m_matExtraPosition, &matR, m_matExtraPosition); D3DXMatrixTranslation(&matT,0.0f,0.0f,-350.0f); D3DXMatrixMultiply(matPosition, &matT, m_matExtraPosition); SetVecPosition(vector3(GetMatPosition()->_41,GetMatPosition()->_42,GetMatPosition()->_43)); matrix *matPos=GetMatPosition(); matrix matInv; matInv.Inverse(*matPos); SetMatView(matInv); MoveFrustum(); */ } void CViewCamera::InterfaceCharlook2(int MouseX, int MouseY) { if(m_isAnimateCamera) { PlayAnimate(); return; } m_fRotx+=(float)MouseY/300.0f; m_fRoty+=(float)MouseX/300.0f; if(m_fRotx > 3.14159f/2.0f-0.3f) m_fRotx=3.14159f/2.0f-0.3f; if(m_fRotx < -3.14159f/2.0f+0.7f) m_fRotx=-3.14159f/2.0f+0.7f; //DXMATRIX matT, matR; matrix matRotation,matResult; D3DXQUATERNION qR; matResult.Translation(vector3(0.0f,0.0f,-1.0f)); D3DXQuaternionRotationYawPitchRoll(&qR,m_fRoty,m_fRotx,0.0f); D3DXMatrixRotationQuaternion(matRotation,&qR); matResult=matResult*matRotation; m_vecCameraPosition=matResult.GetLoc(); /* m_fRotx=3.1415f; m_fRoty=3.1415f; matrix matRotY,matRotX,matResult; matRotY.YRotation(m_fRoty); matRotX.XRotation(m_fRotx); matResult.Translation(vector3(1.0f,0.0f,0.0f)); matResult=matResult*matRotY; vector3 vecRotY=matRotY.GetLoc(); vecRotY^ */ } void CViewCamera::InterfaceFreeCamera(int MouseX, int MouseY) { if(m_isAnimateCamera) { PlayAnimate(); return; } //InterfaceFreelook(-MouseX,-MouseY); } void CViewCamera::LookAt(vector3 vecPos, vector3 vecTarget, vector3 vecUp) { /*m_matView.CameraLookAt(vecPos,vecTarget,vecUp); m_matPosition.Inverse(m_matView); MoveFrustum(); */ vector3 vecNewUp = vector3(0.0f,1.0f,0.0f); D3DXMatrixLookAtLH((D3DXMATRIX *)(&m_matView),(D3DXVECTOR3 *)(&vecPos),(D3DXVECTOR3 *)&vecTarget,(D3DXVECTOR3 *)&vecNewUp); m_matPosition.Inverse(m_matView); MoveFrustum(); m_vecPosition = vector3(m_matPosition._41,m_matPosition._42,m_matPosition._43); D3DXVECTOR3* pZBasis = (D3DXVECTOR3*) &m_matPosition._31; m_fRoty = atan2f( pZBasis->x, pZBasis->z ); float fLen = sqrtf(pZBasis->z*pZBasis->z + pZBasis->x*pZBasis->x); m_fRotx = -atan2f( pZBasis->y, fLen ); m_fRotz = 0.0f; //m_matView=m_matStackView; //m_matPosition=m_matStackPosition; } void CViewCamera::PlayAnimate() { if(m_dwTickTime==-1) { m_dwTickTime=GetTickCount(); m_dwLastUpdateTime=m_dwTickTime; return ; } DWORD dwOldTickTime=m_dwTickTime; m_dwTickTime=GetTickCount(); m_fNowAniTime+=(float)(m_dwTickTime-dwOldTickTime); float fNode=(m_fNowAniTime/m_fTotalAniTime)*100.0f; bool bNodeFound=false; for(int cNode=1;cNode_41,matPosition->_42,matPosition->_43); vecNew=vector3(matResult._41,matResult._42,matResult._43); return vecNew-vecOld; } vector3 CViewCamera::GetViewUpVector() { D3DXMATRIX *matPosition=(D3DXMATRIX*)GetMatPosition(); D3DXMATRIX matT,matResult; D3DXVECTOR3 vecT(0.0f, 1.0f, 0.0f); D3DXMatrixTranslation(&matT, vecT.x, vecT.y, vecT.z); D3DXMatrixMultiply(&matResult, &matT, matPosition); vector3 vecOld,vecNew; vecOld=vector3(matPosition->_41,matPosition->_42,matPosition->_43); vecNew=vector3(matResult._41,matResult._42,matResult._43); return vecNew-vecOld; }