[1]. 드디어 카메라를 세팅해본다.
[2]. Engine 프로젝트에서, GameObject 의 자식 클래스로, Camera를 만드는데, 이 때의 Camera 클래스는, 모든 카메라가 기본적으로 들고 있어야 할, 기능들을 담고 있는 부모 클래스이다. 이 클래스는 부모 클래스이기 떄문에, Create 함수가 없이, Clone 함수만을 순수가상함수로 제공한다.
[3]. 전에는 카메라 자체에 뷰, 투영 행렬을 저장하고, 그 카메라를 검색해서 행렬을 찾아오는 방식이었다면, 이제는 장치에 뷰, 투영 행렬을 저장하고 Transform 을 통해서 뽑아서 사용하는 식으로 진행한다.
[4]. PipeLine 이라는 Base 를 상속 받는 클래스를 별도로 만들고, 이 클래스가 뷰, 투영 행렬을 갖고 있도록 한다.
[5]. PipeLine 클래스는,
[6]. 멤버 변수로 뷰, 투영 행렬을 가지는데, enum 열거체를 통해 한 번에 선언 및 초기화 작업을 하려고 m_TransformationMatrices 라는 이름의 배열로 선언한다. 역행렬을 구하는 함수 조차도 이 곳에서 제공할 예정이기 때문에, 역행렬이라는 뜻의, m_TransformationInverseMatrices 도 배열로 선언한다. 이 두 배열 변수들은, _float4x4 형태의 저장용 행렬 타입이다.
[7]. 이제 이 PipeLine 클래스에 Get / Set 함수들을 만들어서, 행렬들을 제공한다. Set 함수는, 뷰 와 투영 행렬에 해당하는 행렬에 저장하는 함수이다.

[8]. PipeLine 클래스의 Initialize 함수는, 멤버 변수로 선언해 놨던, 행렬 배열들을 항등행렬로 초기화 해주는 함수이다.
[9]. 이제 PipeLine 클래스가 기본적인 틀이 완성되었으면, 위의 Get / Set 함수들을 Client 에 GameInstance 를 통해 제공하기 위해서, GameInstance 클래스에 추가해준다.
[10]. GameInstance 에 PipeLine 함수들을 추가했으면, 이제 Engine 프로젝트의 Camera 클래스로 가서, 코드작성.
[11]. Initialize(void* _pArg) 함수에서 __super::Initialize 를 통해 Camera 가 Transform 을 사용할 수 있게 하고, Camera 가 내가 희망하는 방향으로 1. 자리잡고 2. 보여주기 위해서, 세팅을 한다.
[12]. Transform Component 에서 Set_State 함수로 Camera 클래스의 구조체, CAMERA_DESC 에서의 데이터 변수 중 하나인 _float3 vEye 을 자리 잡고 w 를 1로 채워주자. 그리고 자리를 잡았으면, LookAt 함수를 통해, _float3 vAt 의 값도 설정해서, 보여주는 코드를 완성한다.
