좌표계
가볍게..
DirectX는 왼손 좌표계를 사용한다.
x축이 오른쪽을 향하고 y축은 위를 향하며, z축은 안쪽을 향합니다.
- 동차 좌표계
평행 이동할 때 3차원 벡터인데도 굳이 4차원(아핀 벡터)으로 벡터의 변환을 확장했다. 3차원 공간에 w성분을 더해 w = 1로 벡터를 취급했지만, 이 논리를 진전시켜서 보통 때는 4차원 벡터로 다루고, 특별한 경우에는 w성분의 값으로 벡터를 나누어(x/w, y/w, z/w, 1) 을 실제 3차원 공간 벡터로 생각하는 좌표계를 동차좌표계라고 한다. 그림으로 그리면, 원점으로 부터 뻗어나간 직선위의 모든 점을 같은 벡터라고 생각.. 단, 관측 가능한 것은 w = 1일 때의 평면에서의 교점이다.
이 방법의 장점은 (1, 1, 1, 2)과 (0.5, 0.5, 0.5, 1)을 같은 벡터로 생각하므로 3차원 벡터의 스칼라-곱을 할 경우 4차원 벡터의 w성분에 그 역수를 곱하는 것으로 끝난다.
( 다행스럽게도, 최근의 그래픽 칩은 동차 좌표계를 자동적으로 처리해준다.. 4차원 벡터를 넘겨주면 필요할 경우 자동적으로 3차원 벡터로 바꿔서 렌더링 해준다. )
- 원근 보정
서투르게 텍스처를 입히면 제대로 입혀지지 않는다..
동차 좌표계에서의 평균 조작은 w=1에 투영한 공간에서의 평균 조작과는 다르다.
두 벡터의 중점을 계산.. 원점 (0, 0, 0, 1), 또 하나는 (1, 1, 1, 1)과 (2, 2, 2, 2)..
결과는..?
3차원에서 텍스처를 입힐 때는 원래의 좌표를 (u/z, v/z, 1/z)과 같이, 동차 좌표로 확장하고 나서, 각 좌표를 선형으로 보간한 뒤, w=1 값으로 텍스처를 입히는 방법을 사용해야 올바른 결과가 나온다.
DirectX로 원근 보정을 할 경우 정점 셰이더에서 픽셀 셰이더로 값을 넘길 때 주의해야 한다.
위치 좌표나 텍스처 좌표 값은 래스터라이저에서 적절히 원근 보정되어 픽셀 셰이더 입력으로 넘겨진다. 1/z 처럼( 좌표에 관해서 선형이 아님 ) 기묘한 값을 정점 셰이더에서 픽셀 셰이더로 주고받으면, 원근 보정 처리 자체가 적절한 처리가 안 되기 때문에 픽셀 셰이더에 올바른 값이 입력되지 않는다.
따라서, 정점 셰이더에서 좌표 변환에 관한 선형 값을 얻고, 픽셀 셰이더에서 비선형 값을 계산하는 것이 정확한 렌더링 결과를 얻기 위한 요령.
- 기하 변환
ㅁ 로컬 좌표계
모델링 툴로 3D모델을 생성할 때 사용되는 좌표계입니다.
ㅁ 월드 좌표계
우리가 서 있는 대지를 기준으로 한 좌표계가 월드 좌표계
행렬의 결합 순서는 신중하게 생각해야함..
이동 행렬과 회전 행렬의 순서를 반대로 하면, 완전히 다른 장소로 이동해버린다..
ㅁ 뷰 좌표계
뷰 좌표계란 어디엔가 놓여있는 카메라를 월드의 중심으로 해서, 카메라가 보고 있는 방향을 z축에 맞춘 좌표계이다.
카메라의 위치를 eye, 카메라가 응시하는 방향에 위치한 점 LookAt, 지면에서 수직방향 Up이라 할 때,
카메라의 시선 방향 벡터
e = LookAt - eye
ㅡㅡㅡㅡㅡㅡㅡ
|LookAt - eye|
카메라의 옆 방향
v = Up X e
ㅡㅡㅡㅡ
|Up X e|
카메라의 위쪽 방향
u = e X v
카메라가 놓여진 위치까지의 평행 이동도 필요..
카메라의 월드 좌표계에서의 위치를 c = ( Cx, Cy, Cz )라고 하면..
카메라가 놓여진 위치를 원점으로 되돌려야 하므로, 이 행렬은 벡터c에 의한 평행 이동 행렬의 역행렬이 된다.
결과적으로 최종적인 평행 이동은 카메라가 회전한 공간에서의 평행 이동이 된다.
ㅁ 투영 좌표계( 클립 좌표계 )
3차원 공간에서 디스플레이로 옮기는 2차원 좌표계가 투영 좌표계이다.
실제로는 폴리곤의 앞뒤 관계를 판정하기 위해, 깊이 값도 출력.
투영 좌표계는 화면의 중심을 원점으로해서 상하 좌우에 +-1의 폭을 가지는 좌표계, 깊이는 앞이 0이고 가장 안족이 1인 범위..
컴퓨터에서는 무한히 멀리있는 거리는 다룰 수 없기 때문에, 시야 깊이에 범위를 마련한다. 시야의 먼 한계 값을 후방 클립면.. 시야에서 보이는 가까운 곳의 한계 값을 전방 클립면.. 이렇게 전후, 좌우, 상하로 둘러싸이는 3차원 공간 가운데에 표시되는 영역을 절두체라고 한다.
뷰 좌표계에서 투영 좌표계로의 변환 행렬은 투영 행렬이다..
ㅁ 화면 좌표계
투영 좌표계는 x축, y축이 각각 01에서 1까지의 범위. 화면 영역은 640 X 480 등의 적당한 크기를 말한다. 투영 좌표계에서 화면 좌표계로 변환하는 행렬을 스크린 행렬, 혹은 뷰포트 행렬 또는 뷰포트 스케일링 행렬이라 한다.
투영 좌표계와 화면 좌표계의 대응을 식으로 정리하면.. 디스플레이 해상도를 ( W, H )로 했을 때, 중심좌표는 화면 좌표계에서는 ( W/2, H/2 )위치가 된다. 또 투영 좌표계로 ( -1, 1 )인 점이 화면 좌표계에 서는 ( 0, 0)에 위치 한다. 이상의 관계로, 투영 좌표 (Px, Py)의 점은 화면 좌표계에서 다음과 같다.
X = W/2 ( 1 + Px )
Y = H/2 ( 1 - Py )
[출처] 1.2 수학(2) - 좌표계 |작성자 불패칸
'Programming > Math' 카테고리의 다른 글
투영 벡터 ( Projection Vector ) (0) | 2012.05.16 |
---|---|
동차좌표 ( 同次座標, Homogeneous coordinate ) (0) | 2012.05.16 |
[펌] 3D공간구조 기본충돌 (0) | 2011.09.08 |
역행렬(Inverse Matrix) (0) | 2010.03.17 |
행렬식(Determinant) (0) | 2010.03.17 |