// 카메라 변경시 ChangeCamera() 에서 호출되는 함수 // nCurrentCameraMode = 현재모드 , nNewCameraMode는 새로 설정할 카메라모드 CCamera* CPlayer::OnChangeCamera(ID3D11Device* pd3dDevice, DWORD nNewCameraMode, DWORD nCurrentCameraMode) { CCamera* pNewCamera = NULL; // 새로운 카메라의 모드에 따라 카메라를 새로 생성 switch (nNewCameraMode) { case FIRST_PERSON_CAMERA : pNewCamera = new CFirstPersonCamera(m_pCamera); break; case THIRD_PERSON_CAMERA: pNewCamera = new CThirdPersonCamera(m_pCamera); } if (pNewCamera) { // 기존 카메라가 없으면 새로운 카메라르 위한 쉐이더 변수 생성 if (!m_pCamera) pNewCamera->CreateShaderVariables(pd3dDevice); pNewCamera->SetMode(nNewCameraMode); // 현재 카메라를 사용하는 플레이어 객체를 설정한다. //pNewCamera->SetPlayer(this); } if (m_pCamera) delete m_pCamera; return pNewCamera; }
CCamera* CObject_Player::OnChangeCamera(ID3D11Device *pd3dDevice, DWORD nNewCameraMode, DWORD nCurrentCameraMode) { CCamera *pNewCamera = NULL; //새로운 카메라의 모드에 따라 카메라를 새로 생성한다. switch (nNewCameraMode) { case FIRST_PERSON_CAMERA: pNewCamera = new CFirstPersonCamera(m_pCamera); break; case THIRD_PERSON_CAMERA: pNewCamera = new CThirdPersonCamera(m_pCamera); break; case SPACESHIP_CAMERA: pNewCamera = new CSpaceShipCamera(m_pCamera); break; } /*현재 카메라의 모드가 스페이스-쉽 모드의 카메라이고 새로운 카메라가 1인칭 또는 3인칭 카메라이면 플레이어의 Up 벡터를 월드좌표계의 y-축 방향 벡터(0, 1, 0)이 되도록 한다. 즉, 똑바로 서도록 한다. 그리고 스페이스-쉽 카메라의 경우 플레이어의 이동에는 제약이 없다. 특히, y-축 방향의 움직임이 자유롭다. 그러므로 플레이어의 위치는 공중(위치 벡터의 y-좌표가 0보다 크다)이 될 수 있다. 이때 새로운 카메라가 1인칭 또는 3인칭 카메라이면 플레이어의 위치는 지면이 되어야 한다. 그러므로 플레이어의 Right 벡터와 Look 벡터의 y 값을 0으로 만든다. 이제 플레이어의 Right 벡터와 Look 벡터는 단위벡터가 아니므로 정규화한다.*/ if (nCurrentCameraMode == SPACESHIP_CAMERA) { m_d3dxvUp = D3DXVECTOR3(0.0f, 1.0f, 0.0f); m_d3dxvRight.y = 0.0f; m_d3dxvLook.y = 0.0f; D3DXVec3Normalize(&m_d3dxvRight, &m_d3dxvRight); D3DXVec3Normalize(&m_d3dxvLook, &m_d3dxvLook); m_fPitch = 0.0f; m_fRoll = 0.0f; /*Look 벡터와 월드좌표계의 z-축(0, 0, 1)이 이루는 각도(내적=cos)를 계산하여 플레이어의 y-축의 회전 각도 m_fYaw로 설정한다.*/ m_fYaw = (float)D3DXToDegree(acosf(D3DXVec3Dot(&D3DXVECTOR3(0.0f, 0.0f, 1.0f), &m_d3dxvLook))); if (m_d3dxvLook.x < 0.0f) m_fYaw = -m_fYaw; } else if ((nNewCameraMode == SPACESHIP_CAMERA) && m_pCamera) { /*새로운 카메라의 모드가 스페이스-쉽 모드의 카메라이고 현재 카메라 모드가 1인칭 또는 3인칭 카메라이면 플레이어의 로컬 축을 현재 카메라의 로컬 축과 같게 만든다.*/ m_d3dxvRight = m_pCamera->GetRightVector(); m_d3dxvUp = m_pCamera->GetUpVector(); m_d3dxvLook = m_pCamera->GetLookVector(); } if (pNewCamera) { //기존 카메라가 없으면 새로운 카메라를 위한 쉐이더 변수를 생성한다. if (!m_pCamera) pNewCamera->CreateShaderVariables(pd3dDevice); pNewCamera->SetMode(nNewCameraMode); //현재 카메라를 사용하는 플레이어 객체를 설정한다. pNewCamera->SetPlayer(this); } if (m_pCamera) delete m_pCamera; return(pNewCamera); }
void CGameFramework::BuildObjects() { m_pScene = new CScene(); //플레이어 객체를 생성한다. m_pPlayer = new CPlayer(); //카메라 객체를 생성하고 뷰-포트를 설정한다. CCamera *pCamera = new CCamera(); pCamera->CreateShaderVariables(m_pd3dDevice); pCamera->SetViewport(m_pd3dDeviceContext, 0, 0, m_nWndClientWidth, m_nWndClientHeight, 0.0f, 1.0f); //투영 변환 행렬을 생성한다. pCamera->GenerateProjectionMatrix(1.0f, 500.0f, float(m_nWndClientWidth) / float(m_nWndClientHeight), 90.0f); //카메라 변환 행렬을 생성한다. D3DXVECTOR3 d3dxvEyePosition = D3DXVECTOR3(150.0f, 150.0f, -250.0f); D3DXVECTOR3 d3dxvLookAt = D3DXVECTOR3(0.0f, 0.0f, 0.0f); D3DXVECTOR3 d3dxvUp = D3DXVECTOR3(0.0f, 1.0f, 0.0f); pCamera->GenerateViewMatrix(d3dxvEyePosition, d3dxvLookAt, d3dxvUp); //카메라 객체를 플레이어 객체에 설정한다. m_pScene->SetCamera(pCamera); m_pPlayer->SetCamera(pCamera); m_pPlayer->CreateShaderVariables(m_pd3dDevice); if (m_pScene) m_pScene->BuildObjects(m_pd3dDevice); D3DXCOLOR d3dxcColor(1.0f, 0.0f, 0.0f, 1.0f); D3D11_BUFFER_DESC bd; ZeroMemory(&bd, sizeof(bd)); bd.Usage = D3D11_USAGE_DYNAMIC; bd.ByteWidth = sizeof(D3DXCOLOR); bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; D3D11_SUBRESOURCE_DATA d3dSubResource; d3dSubResource.pSysMem = &d3dxcColor; d3dSubResource.SysMemPitch = 0; d3dSubResource.SysMemSlicePitch = 0; m_pd3dDevice->CreateBuffer(&bd, &d3dSubResource, &m_pd3dcbColor); m_pd3dDeviceContext->PSSetConstantBuffers(PS_SLOT_COLOR, 1, &m_pd3dcbColor); }
void CGameFramework::BuildObjects() { m_pScene = new CScene(); //플레이어 객체를 생성한다. m_pPlayer = new CPlayer(); //카메라 객체를 생성하고 뷰-포트를 설정한다. CCamera *pCamera = new CCamera(); pCamera->CreateShaderVariables(m_pd3dDevice); pCamera->SetViewport(m_pd3dDeviceContext, 0, 0, m_nWndClientWidth, m_nWndClientHeight, 0.0f, 1.0f); //투영 변환 행렬을 생성한다. pCamera->GenerateProjectionMatrix(1.0f, 500.0f, float(m_nWndClientWidth) / float(m_nWndClientHeight), 90.0f); //카메라 변환 행렬을 생성한다. D3DXVECTOR3 d3dxvEyePosition = D3DXVECTOR3(0.0f, 0.0f, -55.0f); D3DXVECTOR3 d3dxvLookAt = D3DXVECTOR3(0.0f, 0.0f, 0.0f); D3DXVECTOR3 d3dxvUp = D3DXVECTOR3(0.0f, 1.0f, 0.0f); pCamera->GenerateViewMatrix(d3dxvEyePosition, d3dxvLookAt, d3dxvUp); //카메라 객체를 플레이어 객체에 설정한다. m_pPlayer->SetCamera(pCamera); m_pPlayer->CreateShaderVariables(m_pd3dDevice); if (m_pScene) m_pScene->BuildObjects(m_pd3dDevice); }