Graphics/DirectX

Direct X - 6. 좌표 변화 세가지 (월드, 뷰, 투영)

MOLOKINI 2014. 6. 1. 21:07
3D에 관해 필요한 간단한 지식 알고가자.
우리의 모니터는 2차원 평면이기 때문에 X, Y의 2차원 정보밖에 가질 수 없음
그렇다면, 그렇다면 어떻게 2차원 평면에 3차원 공간을 옮길 수 있는 것이냐?
3차원의 정보를 2차원으로 변형하기 때문에 가능
2차원의 화면상에서 3차원의 공간으로 인식하게 변환하고 있는데, 이것을 바로 좌표변환이라고 불러
DirectX 프로그래밍에서는 이 좌표변화를 세가지로 분류되는데, 월드좌표변화, 뷰 좌표변화, 투영 좌표변화
 
그럼 이 세가지에 대해서 알아보자.
OpenGL과 공통으로 알고 가야 할 지식들이다 
 - OpenGL이 오른손 좌표계를 쓴다는 것 외에 다른 개념들은 동일

 
 
월드좌표변화

위와 같은 상자가 있다고 치자, 중심점은 (0, 0, 0)

이 상자를 이동시키거나 회전시키고 싶으면 상자의 모든 정점을 계산해서 이동하지 않으면 안돼, 그렇다면, 상당히 많은 연산이 필요하게되지,,, 특히나 사람같이 정점의 수가 많은 경우에는 그 연산은 배로 늘어나ㅠㅠ

이러한 연산을 일괄적으로 처리해 주는게 바로 

월드좌표변화

 라는거지!

모델데이터를 

확대, 회전, 이동

 등을 실시해서 3차원 공간에 위치시킬 수 있다

 

 

요런거?^^

 

 

 

뷰 좌표변화

그 다음에 필요한게 바로 요고인데, 이름에서 물씬 느껴지는 냄새가 있지요?

이 3D 공간을 

어디에서 보고있는 것인가, 어느 방향에서 보고 있는 것인가

 이런 정보가 필요하게 되요, 이게바로 뷰 좌표변화!,, 카메라라고 생각해보면 됩니다.

여기서 필요한 파라미터는, 

카메라의 위치, 카메라의 주시점, 카메라의 위쪽방향 

카메라의 방향은 위치와 주시점만 있으면 당연히 자동적으로 구해진다

 

 

ㅇㅋ?

 

 

투영 좌표변화

투영 좌표변화는 2D의 스크린으로 가슴두근두근마치! 3D공간인것 처럼 표현하는데 사용된다.

다시말하면, 

3D공간의 어느 범위를 2D 스크린에 찍어야하는지 결정하는것이라 할 수 있겠어효

여기서 사용되는 파라미터는, 

카메라의 시야각, 화면의 어스펙트비, 카메라공간의 전후 클리핑 범위

가 되겠습니다

 

 

시야각카메라가 보이는 범위의 각도, 값을 줄이면 줌인, 늘리면 줌아웃 즉, Y축방향의 각도
어스펙트비 : 스크린의 폭과 세로의 비율, 기본적으로 표시하는 스크린의 폭÷높이, 시야각과 어스펙트비를 건 값이 X축의 시야각이 된다.
카메라공간의 전후 클리핑 범위앞은 어디까지 표시하는지, 안쪽은 어디까지 표시하는지를 지정하는데, 컴퓨터의 성능상 무한대까지 표시할 수 없어서 정해놓는 범위, 여기서 설명한것들은 원근투영인데, 깊이를 표현하는데 사용된다. 직교투영이라는것도 있지만 그거슨 다음에 보겠습니다.

 

 

좌표계

 

왼손 좌표계오른손 좌표계가 있어 DirectX는 기본적으로 왼손 좌표계를 사용한다. 그러나 가끔씩 소프트웨어에따라서 오른손 좌표계를 사용하기도 합니다.

 

 

 

Z버퍼

 

무엇인가 출력할 때에는 전에 그린것이 있을 경우, 그것을 덧씌워서 그리는게 보통이야, 하지만, 3D에서는 전후관계가 항상 따라다니기 때문에 계속 덧씌우기를 하면, 원하지 않는 결과가 나오거나 잔상이 남을 수 있어요

예전에는 Z소트라는 방법으로 안쪽부터 그리는 방법이 사용되어 나름대로 잘 그릴 수 있었지만, 다각형이 교차하는등의 경우가 발생하면 정확하게 전후관계를 표현할 수 없어요

 

ㅠㅠ

그래서 나온것이 Z버퍼

Z버퍼란 픽셀마다 할당할 수 있는 깊이를 나타내는 파라미터로, 다각형을 그릴 때 함께 사용됩니다.

예를들면, 제일 앞이 0.0, 가장 안쪽이 0.1이라고 가정하고, 처음 다각형을 0.4의 위치에 출력하고 다음 다각형을 0.6에 그린다고하면, 그 다각형은 Z수치의 판단으로 뒤에 가려지게 되기 때문에 그려지지 않게 된다. 그래서, 일부러 다각형을 소트하지 않아도 전후관계를 제대로 표현할 수 있게 된 것

그리구 Z버퍼는 픽셀단위로 판정을 하기때문에, 다각형이 교차하더라도 정확하게 쓸 수 있습니다!!