XNA에서는 다이렉트와 비슷하게 카메라 설정을 하는데 Matrix구조체는 상당히 많은 함수들을 내장하고 있고 이것들을 사용하게 되면 쉽게 카메라 설정이 가능하게 된다.
1. 투영
- Matrix.CreatePerspectiveFieldOfView() 메서드를 사용한다.
Matrix.CreatePerspectiveFieldOfView
(시야각도, 종횡비,근거리클리핑, 원거리클리핑, 투영행렬이저장될 변수)
첫 번째 매개변수 시야각은 보통 45도를 많이 사용하게 되는데 MathHelper 클래스를 사용하여 많이 표현한다. (MathHelper.PiOver4 = 45도)
두번째 매개변수는 종횡비이다. 이 값을 위해 아래와 같이 그래픽 디바이스를 이용한 값을 저장해 두면 편리하다.
// 종횡비
float aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width /
(float)graphics.GraphicsDevice.Viewport.Height;
3번째와 4번째는 각각 근거리와 원거리 클리핑 거리이다. 화면에 그릴 부분을 한정으로 설정한다.
마지막으로 이렇게 설정된 투영행렬이 저장될 Matrix 변수이다.
만약 다음과 같이 투영행렬이 저장될 변수를 설정해두었다면...
private Matrix projection;
최종적으로 다음과 같은 문구가 나오지~~
Matrix.CreatePerspectiveFieldOfView
(MathHelper.PiOver4, aspectRatio,0.0001f, 1000.0f, out projection);
- 45도의 시야각에 위에서 설정한 종횡비사용, 0.0001 ~ 1000 사이에 있는 물체표현, 이값을 projection에 저장!!!! 이렇게..끝!!
2. 뷰
일단 뷰 행렬이 저장될 변수를 선언하고...
private Matrix view;
이제는 Matrix.CreateLookAt() 메서드를 사용한다.
Matrix.CreateLookAt
(카메라위치, 카메라가 바로보는 방향, 카메라의 머리방향(업벡터), 뷰행렬이 저장될 변수)
위와 같으 4개의 매개변수를 사용하는데 카메라의 위치 및 방향, 벡터등을 아래와 같이 선언하여 사용하는데 좋다.
private Vector3 cameraPosition = new Vector3(0.0f, 0.0f, 3.0f);
private Vector3 cameraTarget = Vector3.(0.0f, 0.0f, 0.0f);
private Vector3 cameraUpVector = Vector3.(0.0f, 1.0f, 0.0f);
딱보면 뭔지 알만하다.
참고로 두번째 타켓점을 (0,0,0)일경우 Vector3.Zero 로 사용해도 된다.
또한 업벡터(0,1,0)인 경우 Vector3.Up로 쉽게 표현 가능하다.
결국 위와같이 선언해놓고 이렇게 하면 뷰행렬 값은 끝!!
Matrix.CreateLookAt(ref cameraPosition, ref cameraTarget, ref cameraUpVector, out view);
3. 마지막으로 월드행렬은...지지고뽁고 해야되니 담에..^^;
간단히 private Matrix world = Matrix.Identity; 로 사용(항등행렬)