본문 바로가기

예전/3D

모델변환과 시점변환


어파인 공간

동차좌표

이동, 회전, 크기조절의 기하변환과 변환행렬의 차이

모델 좌표계, 전역 좌표계, 시점 좌표계

좌표계 변환과 변환 행렬과의 관계

기하 변환 순서와 함수 호출 순서의 상관관계


Chapter 6. 모델변환과 시점변환

01. 좌표계

02. 기하변환

03. GL의 모델변환

04. GL의 시점변환



그래픽스 파이프라인에서 물체 좌표는 모델좌표, 전역좌표, 시점좌표 순으로 변환된다. 이 경우 좌표계 사이의 변환은 행렬로 표현된다. 물체의 설계는 모델 좌표계(지역 좌표계)에서 행해진다. 이 과정에서 물체에 이동, 화전 크기 조절등 다양한 기하학적 변환이 가해지며 이 역시 행렬로 표현된다. 


내가 아는 말로 바꾸면 로컬 스페이스, 월드 스페이스, 뷰 스페이스로 볼 수 있겠다. 



01. 좌표계


3D에서 물체를 표현하는 방법은 물체 표면만 표현하는 방법과 물체 내부까지 표현하는 방법으로 나눌 수 있다. (물체 내부 표현은 나중에~) 


3D에서 물체들은 여러 폴리곤으로 표현된다. 육면체가 평면 폴리곤으로 표현된 것처럼 곡면 물체 역시 훨씬 더 많은 수의 평면 폴리곤으로 표현되 있을 뿐이다. 이렇게 폴리곰의 수가 늘어남에 따라 그래픽 처리량이 늘어나고, 연산 시간이 증가하게 된다. 

폴리곤은 정점으로 구성된다. 따라서 물체를 설계하는 작업 == 모델링은 정점의 위치를 정의하는 작업이라 볼 수 있다. 


3차원 공간에서 물체의 위치는 좌표계를 기분으로 표시된다. 여러 좌표계가 있지만, 가장 많이 사용되는 것은 직교 좌표계이다. 직교 좌표계는 원점 위치, 축 방향, 축 눈금의 길이 등에 의해 정의된다. 또, 점의 좌표는 기준이 되는 좌표계에 따라서 달라진다. 즉, 물체마다 자신의 지역 좌표계가 있다는 말로도 표현할 수 있을 것이다. 


DirectX 는 왼손 좌표계(+z의 방향이 안쪽), OpenGL은 오른손 좌표계(+z의 방향이 화면을 뚫고 나오는 바깥쪽) 사용한다. )


좌표계 내에는 벡터가 존제한다.

자신의 합성에 의해 다른 모든 벡터를 표시할 수 있는 벡터를 기반 벡터(Basic Vector)라고 한다.

기반 벡터는 그들끼리 선형 독립(Linear Independence)여야 한다. 만약 어떤 벡터가 다른 벡터의 선형 조합(Linear Combination)으로 표현된다면 이는 선형 독립이 아니다. 

예를 들어, v1, v2, v3를 기반 벡터 후보로 잡았을 때, v3= 12v1 + 3v2가 성립된다면 v3는 다른 벡터의 선형 조합이기 때문에 기반벡터가 될 수 없다. (이는 선형대수에서 배운다.)

시각적으로 말하자면, 공간상에서 서로 직각으로 교차하는 벡터는 선형독립이고, 이 점의 위치를 표현하기 위한 기반 벡터의 수가 바로 차원(dimension) 이다. 


점의 좌표는 이러한 기반벡터를 기준으로 나타낸 것이고, 각각의 기반벡터에 곱해지는 계수가 바로 좌표이다. 이경우 기반 벡터는 좌표축에 해당한다. 

하지만, 점의 좌표를 기반벡터의 계수(좌표) 만으로 표현하는 데는 무리가 있다. 


왜냐하면 벡터는 크기와 방향을 지닌 것으로 위의 벡터는 모두 같은 벡터이기 때문이다. 때문에 벡터에 점을 추가한 어파인 공간 ( http://showmiso.tistory.com/248 ) 이 필요하다. 


어파인 공간에서는 기반 벡터를 서로 흩어 놓을 것이 아니라, 시작 위치를 한 점에 고정할 필요가 생긴다. 이것이 바로 원점이다.

이렇게 함으로써 각각의 점이 좌표에 의해 구분될 수 있다. 



3차원 정점 좌표를 나타내기 위해서는 원점과 3개의 기반벡터가 필요하다.

따라서 3차원의 좌표계는 (r, v1, v2, v3) 와 같고, 점과 벡터는 아래와 같이 표현될 수 있다.


vector = 4v1 + 2v2 + v3          

point = r + 4v1 + 2v2 + v3           


vector의 경우 방향과 크기만 같으면 동일한 것이므로 원점의 위치에 영향을 받지 않는다. 하지만, point의 경우 원점 r의 위치에 따라 다른 좌표를 갖는다. (즉, 원점 r의 영향을 받는다.)



그러나, 이렇게 되면 벡터냐 점이냐에 따라서 표현방식이 달라져야 한다. 

원점 r에 관한 정보를 제외시켜 버리면 위의 vector와 point가 모두 좌표 (4, 2, 1)로 같아지기 때문이다. 


이러한 것을 해결하기 위한 것이 바로 동차좌표(Homogeneous Coordination)이다. 이는 3차원의 좌표를 3개의 요소로 표시할 것이 아니라, 차원을 하나 올린 4개의 요소로 표현하지는 것이다. 


vector  =  4v1 + 2v2 + v3 + 0 * r          

point    =  4v1 + 2v2 + v3 + 1 * r         


위처럼 정의하면, vector는 (4, 2, 1, 0)으로 point는 (4, 2, 1, 1)로 표시할 수 있다.

마지막 요소가 0이면 벡터, 1이면 점을 의미하도록 한것이다.

이렇게 함으로서 벡터와 점을 동일한 방법으로 표현할 수 있다. (동차좌표계를 사용하는 이유는 투영을 통해 알아보자.)


2차원 좌표로 설명해 볼게요.

2차원 평면상의 점 (1, 2)를 동차좌표로 표시하면, (1, 2, 1)이 된다. 이것은 3차원으로 말하면, z축의 높이 1에 있는 점에 해당한다. 엄밀히 말하면 2차원 평면상의 점을 3차원 공간상의 직선으로 사상한 것이 동차좌표이다.

다시 말해 원점에서 출발하여 (1, 2, 1) 을 통과하는 직선상에 높인 모든 3차원 좌표가 동일한 2차원 점 (1, 2)를 의미한다.

(1, 2, 1) = (2, 4, 2) = (3, 6, 3) = ... 이다. 따라서 동차좌표의 마지막 요소로 앞 요소를 나눈 값이 실제 좌표가 된다. 


같은 맥락에서 3차원 동차좌표를 4차원 (x, y, z, w) 좌표로 표시하면 3차원의 실제 좌표는 (x/w, y/w, z/w, 1)이 된다. 








개인적인 공부 목적으로 OpenGL로 배우는 컴퓨터 그래픽스 책을 보고 정리했습니다. 문제시 댓글남겨주세요.



'예전 > 3D' 카테고리의 다른 글

동차 좌표ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ  (0) 2014.12.09
어파인 공간  (0) 2014.12.09
동차좌표  (0) 2014.12.05
D3D11 wireframe  (0) 2014.05.23
Direct3D의 그리기 2. 정점 버퍼  (0) 2014.04.06