블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

좌표계

Programming/Math / 2010. 7. 1. 21:34

가볍게..

 

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 등의 적당한 크기를 말한다. 투영 좌표계에서 화면 좌표계로 변환하는 행렬을 스크린 행렬, 혹은 뷰포트 행렬 또는 뷰포트 스케일링 행렬이라 한다.


투영 좌표계와 화면 좌표계의 차이는 중심 좌표가 투영 좌표계에서는 한가운데에 있지만, 화면 좌표계에서는 좌측 상단에 있다고 하는 것.. 또 y축이 뒤집혀 있는 것도 큰 차이..

 

투영 좌표계와 화면 좌표계의 대응을 식으로 정리하면.. 디스플레이 해상도를 ( W, H )로 했을 때, 중심좌표는 화면 좌표계에서는 ( W/2, H/2 )위치가 된다. 또 투영 좌표계로 ( -1, 1 )인 점이 화면 좌표계에 서는 ( 0, 0)에 위치 한다. 이상의 관계로, 투영 좌표 (Px, Py)의 점은 화면 좌표계에서 다음과 같다.

 

X = W/2 ( 1 + Px )

Y = H/2 ( 1 - Py )

반응형

'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
Posted by blueasa
, |