-
2. 카메라 클래스프로그래밍/3D게임프로그래밍 2014. 4. 16. 01:50반응형
카메라 클래스에서 가장 중요한 멤버 변수는 뷰 변환에 대한 뷰 행렬 , 투영 변환에 대한 투영 행렬입니다. 카메라 클래스는 화면과 카메라에 대한 정보를 입력 받아 이둘의 행렬을 만드는 것이 주 임무라 하겠습니다.
뷰 행렬을 만들기 위해서 카메라의 위치 (Eye vector), 카메라가 보고 있는 지점(Look Vector), 그리고 카메라의 업 벡터(Up Vector)가 필요한데 이들의 멤버 변수와 카메라를 생성하는데 필요한 Create() 함수 , 카메라의 뷰 행렬과 투영 행렬을 갱신하는 FrameMove()함수를 기본으로 하는 클래스를 다음과 같이 작성합니다.
카메라의 생성과 초기화를 담당하는 CCmera::Create() 함수에서 카메라의 Eye, Look, Up벡터를 초기화 합니다.
투영 행렬은 게임에서 카메라 액션 등을 처리할 때 자주 바꾸지만 우리는 카메라의 기초 강의가 끝날 때 까지
투영 행렬은 변함이 없다고 생각하고 다음과 같이 DirectX SDK에서 지원하는 D3DMatixPerspectiveFovLH()함수를
통해서 먼저 투영 행렬을 만듭니다. 투영 행렬은 이후 강의에서 만드는 과정을 다시 설명할 것입니다.
참고로 D3DMatrixPerspectiveFovLH() 함수는 왼손 좌표계(LH: Left Hand Coordinate System), 투시 투영(Perspective)
,시야 각(FOV: Field OF View) , 화면 종횡 비 (Aspect Ratio: Screen Width/ Screen Height),가상 화면의 근거리 (가까운 면:Near), 가상 화면의 원거리(Far)을 인수로 하는 투영 행렬을 만드는 함수 입니다. 다음 코드에서는 시야 각 45도(π/4.f)
,종횡비(800.f/600.f), Near(1.f), Far(5000.f)를 인수로 해서 투영 행렬을 만들었습니다.
카메라의 갱신을 담당하는 FramMove() 함수에서는 카메라의 위치(Eye), 또는 Look 벡터가 달라지면 이들 값을 갱신하고 뷰 행렬을 만들어 냅니다.
다음 코드는 먼저 카메라 객체가 동작을 하고 있는지 Left, Light, Up, Down키로 테스트 할 수 있도록 작성했습니다.
또한 뷰 행렬을 만들기 위해서 D3DXMatixLookAtLH()함수를 이용했고, 이 함수를 만드는 방법은 이후 강의 에서 다시 설명하겠습니다.
카메라 객체를 CMain 클래스에서 선언한 다음 SAFE_CREATE라는 매크로를 이용해서 생성합니다.
SAVE_NEWCREATE1 매크로에 대한 내용은 코드를 살펴보기 바랍니다.
CMain 클래스의 FrameMove() 함수 안에서 카메라 객체를 갱신합니다. SAFE_FRMOV 는 객체의 멤버 함수
FrameMove() 함수를 호출 하는 매크로입니다.
전체 코드는 다음 예제를 살펴 보기 바랍니다.
반응형