강의 내용 : 카메라 DirectX 9 을 이용한 게임 개발 기본 코스
목 차 카메라 요구사항 구현
카메라의 이동
Matrix 월드 행렬 – 화면세상 속에 물체를 위치시킴 – g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld ); 뷰 - 행렬 – 관찰자의 위치와 방향을 설정 – g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView ); 프로젝션 행렬 – 렌즈의 특성의 설정 – g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
View Matrix 의 목적 World 좌표계의 한 정점 p(x,y,z) 가 있다 점 p 의 관찰자 ( 카메라 ) 기준 좌표는 (x’,y’,z’) 라 하 자. (x’, y’, z’, 1) = V (x, y, z, 1) 이 되는 4x4 행렬 V 를 View Matrix 라고 한다. View Matrix 를 구했다면 View 변환이 행렬 곱셈 한번으로 종료되므로 매우 좋다. 사용자로부터 입력을 받아 View Matrix 를 계산해 야 한다. – 계산해주는 DX 함수가 존재한다. – D3DXMatrixLookAtLH
View & Projection D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec ); – D3DTS_VIEW vFromPt : 카메라 위치 vLookatPt : 카메라가 보는 지점 vUpVec : 카메라 업 벡터 D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, f ); – D3DTS_PROJECTION fovy, zn, zf fovy 는 Y 축 방향의 Field of View. 이번 시간에는 View 만 다룬다.
카메라 관리 클래스의 필요성 View Matrix 를 구하려면 다음의 정보가 필요 – 카메라 위치, 카메라가 보는 지점, 업벡터 일상적인 카메라 움직임을 구현할 때 복잡함 – 카메라가 주인공을 응시하며 회전한다면 추가 자료를 포함하여 카메라 클래스 관리 – 회전, 평행이동 등의 일상 변화에 대응 Camera.h 의 변수 부분을 확인 – Eye, LookAt, Up ( 기본 변수 ) – vView, vCross ( 추가 변수, 기본 변수에서 계산 ) – matView ( 결과 저장 변수 )
카메라 카메라 좌표계의 축을 산출하는 방법 – vLookAt, vEye, vUp 이 주어진다고 가정 – vView 와 vCross 를 구한다. 문제 – 카메라가 앞으로 전진한다. – vLoookAt, vEye, vUp 은 어떻게 변화되는가 ?
카메라 카메라 좌표계의 축을 산출하는 방법 /// 카메라 좌표계의 Z 축방향으로 dist 만큼 전진한다.( 후진은 -dist 를 넣으면 된 다.) D3DXMATRIXA16* ZCamera::MoveLocalZ( float dist ) { D3DXVECTOR3 vNewEye = m_vEye; D3DXVECTOR3 vNewDst = m_vLookat; D3DXVECTOR3 vMove; D3DXVec3Normalize( &vMove, &m_vView ); vMove *= dist; vNewEye += vMove; vNewDst += vMove; // 질문 : 왜 보는 지점도 움직여야 할까 ? return SetView( &vNewEye, &vNewDst, &m_vUp ); }
카메라 카메라 좌표계의 회전행렬 유도 방법 문제. 카메라가 vUp ( 키 방향 ) 을 중심으로 회전 – vLoookAt, vEye, vUp 은 어떻게 변화되는가 ?
카메라 카메라 좌표계의 회전행렬 유도 방법 /// 카메라 좌표계의 Y 축으로 angle 만큼 회전한다. D3DXMATRIXA16* ZCamera::RotateLocalY( float angle ) { D3DXMATRIXA16 matRot; D3DXMatrixRotationAxis( &matRot, &m_vUp, angle ); D3DXVECTOR3 vNewDst; D3DXVec3TransformCoord( &vNewDst, &m_vView, &matRot ); // view * rot 로 새로운 dst vector 를 구한다. vNewDst += m_vEye; // 실제 dst position = eye Position + dst vector return SetView( &m_vEye, &vNewDst, &m_vUp ); }
카메라 클래스 사용방법 전역객체의 포인터를 선언 ZCamera* g_pCamera = NULL; // Camera 클래스 WinMain() 함수에서 객체를 생성 g_pCamera = new ZCamera; 초기화는 다음과 같이 한번만 해준다. g_pCamera->SetView( &vEyePt, &vLookatPt, &vUpVec ); 마우스 또는 키보드 입력이 있으면 g_pCamera 의 함수를 부른다. – g_pCamera->MoveLocalZ(1); 렌더링 수행 전에 카메라의 행렬을 얻어 DirectX 에 전달한다. – g_pd3dDevice->SetTransform( D3DTS_VIEW, g_pCamera - >GetViewMatrix( ));
실습 현재 코드를 수정하여 – 좌 / 우 화살표가 눌리면 옆걸음 ( 게걸음 ) 을 하도록 – Q/E 키가 눌리면 고개를 좌우로 기울이는 효과 (vView 중심축으로 회전 ) – 그 외 여러 효과 구현 호랑이 등에 타고 가는 카메라