- 왼손 좌표계란 아래 그림과 같이 양(+)의 Z축이 모니터의 안쪽으로 들어가는 방향을 말한다.
- D3D에서는 왼손 좌표계를 사용한다.
- OpenGL에서는 왼손, 오른손 좌표계를 선택적으로 사용할 수 있다.
- 벡터 : 크기와 방향을 갖는 물리량. (가속도, 속도 등의 크기와 방향을 동시에 표현해야하는 수치)
- 스칼라 : 크기만 갖는 물리량. (기압, 속력 등의 단일한 숫자 표기, 방향이 없다!)
벡터는 3차원 그래픽스 상에서 은면제거(backface-culling)나 음영(shading)등에 주로 사용된다.
아래 그림은 2차원 평면 상에서 원점 O(0, 0)을 기준으로 점 P(x, y)를 향하는 벡터 OP를 나타낸 것이다.
그리고 아래 그림은 3차원 공간 상에서 원점 O(0, 0)을 기준으로 점 Q(x, y, z)를 향하는 벡터 OQ를 나타낸 것이다.
공간상에서의 위치(position)를 나타내는 것으로 일반적으로 여러개가 모여서
특정 형태의 오브젝트를 구성하는 요소를 정점(vertex)이라고 한다.
정점은 (x, y, z)좌표 이외에 다른 정보도 갖는다.
위에 그림의 Q(x, y, z)가 정점이다.
3개의 정점(vertex)이 모이면 하나의 면(face)을 만들 수 있다.
이렇게 3개의 정점으로 만들어진 삼각형을 폴리곤(polygon)이라고 한다.
계산이 간단해서 빠르게 곡선을 표현할 수 있다.
3차원 그래픽에서 입체도형을 그릴때 물체표면을 작은 삼각형 모양의 폴리곤으로 분할한다.
분할한 폴리곤을 수치 데이터로 바꾸면 물체의 보이지 않는 부분을 계산하고, 화면에 영상으로 나타낼 수 있기 때문이다.
폴리곤의 수가 많으면 많을수록 세밀한 표현이 가능해지며,
폴리곤의 갯수가 적은것을 로우 폴리곤, 많은 것을 하이 폴리곤 이라고 한다.
[로우 폴리곤 모델]
[하이 폴리곤 모델]
이미지 출처 : http://kane.egloos.com/1600617
폴리곤에서 정점과 정점을 연결하는 직선을 변 또는 모서리라고 한다.
일반적인 D3D 프로그래밍시에는 변에 대한 데이터를 가공할 일이 없지만,
특별한 경우에는 이 데이터가 요긴하게 사용되기도 한다. (ex. 그림자 볼륨 (volume shadow)기법)
폴리곤으로 3차원 공간상의 면을 만들지만 이것으로는 우리가 생각하는 복잡한 물체를 표현하는데는 무리가 있다.
이러한 폴리곤들이 모여서 하나의 3차원 물체를 만들게 되는데 이것을 메쉬(Mesh)라고 한다.
즉, 메쉬는 3차원 공간상의 객체(object)인 셈이다.
이미지 출처 : http://www.ceremade.dauphine.fr/~peyre/geodesic_computations/
주로 두 벡터의 사이각( cosΘ )을 구하기 위해서 사용된다.
두 벡터를 이용해서 내적을 하게 되면 스칼라 값이 나오게 되는데,
이 값을 이용해서 두 벡터를 이루는 사이각( cosΘ ) 을 구할 수 있다.
벡터의 내적을 이용해 앞에 말했던 은면제거(backface culling)나 광원효과 또는 방향 같은 것에 사용된다.
- 내적 공식
두 벡터 A(x, y), B(x, y)의 내적
A∙B = AxBx + AyBy
- 벡터의 내적의 특성
내적의 값이 1 : 완전히 겹친다.
내적의 값이 -1 : 완전히 뒤집혀져 있다. (180도)
내적의 값이 0 : 수직이다. ( 90도 )
내적의 값이 > 0 : 0~90도 사이의 각을 갖는다. (예각)
내적의 값이 < 0 : 두 벡터 사이의 각도는 90도 보다 크다. (둔각)
두 벡터를 외적하게 되면 두 벡터에 대해 수직인 제3의 벡터값이 나오게된다.
벡터 V1, V2 그리고 외적벡터를 V0 라 하면
V0.x = V1.y * V2.z - V1.z * V2.y
V0.y = V1.z * V2.x - V1.x * V2.z
V0.z = V1.x * V2.y - V1.y * V2.x
라고 할 수 있다.
다시 쓰자면,
V0 = {(V1.y * V2.z - V1.z * V2.y), (V1.z * V2.x - V1.x * V2.z), (V1.x * V2.y - V1.y * V2.x)}
이다. ( 한줄로 쓰니깐 더 햇갈리네... )
법선의 벡터는 대표적으로 폴리곤의 법선벡터를 구하는데 사용된다.
폴리곤의 법선벡터란 폴리곤의 평면에 수직인 벡터를 말한다. 즉, 폴리곤이 쳐다보고있는 방향이라고 할 수 있다.
- 폴리곤의 법선벡터 구하는 방법
위 그림처럼 3개의 점 P1, P2, P3가 있다고 할때 벡터 2개를 만들 수 있다.
그 벡터를 V1, V2라고 하면,
V1 = P2 - P1
V2 = P3 - P1
V1은 시작점이 P1, 끝점이 P2인 벡터이고
V2는 시작점이 P1, 끝점이 P3인 벡터이다.
이 2개의 벡터를 외적하게 되면 그것이 바로 폴리곤의 법선벡터가 되는 것이다.
로컬 좌표계는 (0, 0, 0)을 기준으로의 물체의 좌표이다. (즉, 자기 자신의 좌표이다.)
로컬은 대체로 물체 하나가 로컬 좌표계를 하나씩 갖는다고 생각하면 된다.
단순히 하나의 물체만 표현한다면 로컬좌표 시스템만 있으면 충분하다.
물체가 중심이 되서 갖는 좌표계이므로 항상 원점 중심에 물체가 놓이게 된다.
로컬 좌표계의 물체는 항상 그 자리 그 상태를 유지하고 있다.
월드 좌표란, 존재하는 모든 물체의 위치에 기준이 되는 원점을 가지게 되는 좌표계이다.
오브젝트들이 우리가 표시하려는 공간의 어느 위치에 있는지를 나타내게 된다.
전환(Transform)과 회전(Rotation)이 용이하다.
로컬좌표계를 회전과 동시에 이동(전환)을 하면 월드로 변환이 된다.
카메라에서 보는 시점을 뜻하는데 자신을 기준으로 보이는 좌표를 이야기한다.
단순히 하나의 물체만 표현한다면 로컬좌표 시스템만 있으면 충분하다.
하지만, 이 오브젝트의 뒷면이나 옆면, 혹은 회전을 시키려면 어떻게 해야 할까?
이 문제의 답은
a) 오브젝트를 돌려 보거나
b) 자신이 뒤로 가서 보면 된다.
a)는 공간 좌표 시스템을 이용하는 것이고,
b)는 카메라 좌표 시스템을 이용하는 것이다.
내가 보이는데로 화면에 출력할 때 각 오브젝트가 이리저리 움직이고, 나 또한 움직일 때는 좌표계는 어떻게 쓰일까?
답: 각 오브젝트가 움직일 때는 월드좌표계를 사용하고 나의 시점이 변할 때는 카메라좌표계를 사용한다.
3차원 상에서 오브젝트를 투영하기 위해서는 아래와 같은 절차가 필요하다.
로컬 좌표계 -> 월드 좌표계 -> 카메라 좌표계 -> 투영
좌표계를 모델 공간에서 월드 공간으로 바꾸는 것으로, 모델을 월드에 놓기 때문에 월드 변환이라고 한다.
이 변환은 이동, 회전, scaling의 조합을 포함할 수 있다.
물체를 월드 어디에 놓을것인지 정하는 과정이다.
모든 정점은 기본적으로 로컬 좌표계 값을 갖는다.
이 값들은 최초에 3D 데이터가 생성되는 시점에서 기준이되는 원점을 중심으로한 좌표계다.
이러한 물체를 3D 월드상에 특정한 위치에 띄우기 위해서는 별도의 물체의 로컬 좌표계를 월드 좌표계로 변환해야 한다.
변환은 행렬로 이루어지고, 이러한 행렬을 변환행렬(Transform matrix)라고 한다.
변환행렬은 모든 물체마다 하나씩 존재한다.
Z버퍼란 화면에 그려질 하나하나의 픽셀에 대한 깊이 값을 보관하는 버퍼를 말한다.
렌더링 파이프라인 과정을 거치게 되면 3차원 공간 상의 모든 정점은(-1, -1, 0) ~ (1, 1, 1)사이의 공간에 위치하게 된다.
- 렌더링 파이프 라인
월드, 카메라, 프로젝션 변환 작업을 통한 좌표계 변환 프로세스를 렌더링 파이프라인 이라고 한다.
이때, (x, y, z)를 보면 Z값이 0.0 ~ 1.0 사이의 값이 나오게 된다.
Z버퍼란 화면에 그려질 픽셀들의 Z값을 보관하는 특별한 버퍼(0.0 ~ 1.0) 사이의 값을 보관하는 소수점 버퍼)를 말한다.
이 값에 따라서 물체의 랜더링 우선순위가 결정된다.
즉, 물체 A의 Z값이 0.1이고 물체 B의 Z값이 0.5이라고 가정했을때,
출력 순서를 물체 A를 먼저 그 다음에 물체 B를 출력 했을때 2D에서는 물체A위에 물체B가 그려지게 된다.
하지만 3D에서는 이 Z값을 기준으로 물체A뒤에 물체B가 그려지게된다.
[ Z-Buffer 참고 이미지 ]
참고 사이트 :
http://blog.naver.com/seeper0/120001390933
http://hybridego.tistory.com/entry/벡터외적내적법선
http://codecrue.egloos.com/12673
http://www.misofruit.co.kr/seojewoo/programming/graphic1.htm
http://icoder.tistory.com/entry/tut03matrix
http://bio.gsnu.ac.kr/~youknow/graphic/3DMAX_2.htm
'Programming > DirectX 3D' 카테고리의 다른 글
DrawPrimitive외 여러 Draw함수들 (0) | 2012.02.23 |
---|---|
DirectX 3D - 적이 플레이어를 따라오게 하기 - (3) | 2012.02.16 |
Visual Studio 2008에서 DirectX 3D 프로그래밍 시작하기 (1) | 2012.02.06 |