C/C++ 그래픽 기하변환

2017.06.06 12:29

졸리운_곰 조회 수:989

 

기하변환

OpenGL 2011.10.05 02:05 posted by aesire

동차좌표는 3차원 좌표를 4개의 요소로 표현한다. 요소가 4개라는 점에서 이는 4차원 벡터로 간주할 수 있다.
마지막 요소의 값에 따라서 점은(x,y,z,1), 벡터는 (x,y,z,0)형태로 표현된다.

 

 

선형 대수학(Linear Algebra)에서 벡터를 행백터(Row Vector)또는 열백터(Column Vector)의 형태로 표시한다.
행벡터에서는 좌우로, 열벡터에서는 상하로 나열한다.

물체의 이동, 회전, 크기조절 등의 작업을 기하변환(Geometric Transformation), 변환(Transformation)이라 한다. 

1. 이동
강체(Rigid Body)를 이동하면 정점은 동일한 양만큼 움직인다. 이를
이동변환(Translational Transformation)이라 한다.

 

 

2차원이동을 생각해보면 x,y값에 이동한 값 T 만큼 더해주면 된다. 하지만 그래픽에서는 이러한 덧셈 표현은 일체 사용되지 않는다. 회전, 크기 조절등 모든 종류의 변환이 행렬의 곱셈으로 표시되고 따라서 그래픽 하드웨어도 행렬의 곱셈에 최적화되어있다.
2차원 이동을 행렬의 곱으로 나타내면 다음과 같이 표현할 수 있다.
 

 

2차원 점을 3차원 동차좌표로 나타낸 것이다.

3차원 이동을 표현하면 다음과 같다.

 

 

 

다각형을 이동하려면 그 다각형을 구성하는 정점들에 대해서만 변환을 가하면 된다.
새로운 점의 위치를 얻은 후, 다시 이들 점들을 연결하고 채우면 된다.
이렇게 함으로써 이동변환의 연산속도를 높일 수 있다.

2. 회전

원점을 중심으로 점 P가 반시계 방향으로 회전각 ɵ 만큼 회전한다고 하면, 다음같은 식이 나온다.

 

 


이 관계를 동차좌표로 표시하면 다음과 같다.

 

 

 

위 식은 2차원 회전변환(Rotation Transformation)을 의미한다.
 
3차원 회전은 항상
회전축(Axis of Rotation)을 기준으로 표현한다.
z축을 기준으로 하는 회전은 다음과 같은 변환행렬로 나타 낼 수 있다.

 

 

x,y축을 기준으로 하는 회전은 각각 다음과 같다.

 

 

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

 

회전변환에서 회전각 ɵ 는 항상 반 시계방향으로 명시해야한다.

 

 
3. 크기조절(Scaling Transformation)

 


Sx,Sy,Sz는 각각 x,y,z축 방향의 배율이다. 배율이 1보다 크면 확대, 작으면 축소에 해당한다.
모든 배율이 같은 경우를 균등 크기조절(Uniform Scaling), 하나라도 다르면 차등 크기조절(Differential Scaling)이라 한다.

4. 전단
전단(Shearing)은 물체를 한쪽 방향으로 밀어낸 모습이다. 

 

이 변환은 이동이나 회전 등 강체의 변환과는 달리 물체 자체를 변형(Deformation)시킨다.

 


Sh는 전단인수(shearing Factor)를 말한다. 위 식은 x-y평면을 따라서 가해진 전단변환을 표현한다.
크기 조절변환에서 x'은 x에만, y'는 y에만 영향을 받는 다는점에서 대조된다. 전단변환에서는 y값이 커질수록 x'이 커지는것을 볼수 있다.

5. 복합변환
일반적으로 변환은 연속적으로 가해진다. 물체에 대해 크기조절(S1)작업을 가한 후, 그 결과 물체를 회전(R1)한 후에 다시 크기조절(S2)이 가해진다면, 새로운 정점의 좌표는 P'=S2 ∙ R1 ∙ S1 ∙ P 라는 관계식으로 표현된다. 즉 작업이 가해진 순서의 역순(Reverse Order)으로 행렬이 곱해진다.이들 변환행렬을 하나로 나타내면 P'=C∙P가 되고 이 C를 복합행렬이라한다.
즉 연속된 변환행렬을 모두 곱하여 하나의 행렬로 표시한 것을 복합행렬(Composite Matrix)라 한다.
복합행렬을 사용하면 처리시간이 단축된다. 모든 정점에 일일이 변환행렬을 곱하는것보다 복합행렬을 계산후 모든 정점에 곱함으로써 연산속도가 빨라진다.
복합행렬로 대변되는 일련의 연속된 변환을 복합변환(Composite Transformation)이라 한다.
복합변환의 대표적인 예로 중심점 기준 회전(Pivot Point Rotation)을 들 수 있다.
1. 피벗이 좌표계 원점에 일치하도록 물체를 이동한다.
2. 물체를 원점 중심으로 기준 축 주위로 회전한다.
3. 회전된 물체를 1번에서 이동한 방향의 반대로 이동한다.

이를 복합행렬로 나타내면 다음과 같다.

 

 

 

 먼저 피벗을 (-Xp,-Yp,-Zp)만큼 이동해 원점과 일치시킨후, 회전변환을 가한후, 다시 원래 위치로 이동시킨다.

크기조절역시 원점이 아닌 임의 위치의 피벗을 중심으로 할 경우 위와 같은 순서를 따른다.

복합행렬을 만들 때 주의할 사항은 행렬의 곱셈은 교환법칙은 성립하지 않는다는 것이다.
그러므로 복합행렬의 순서에 주의해야한다.

그래픽 라이브러리에서 가져온 물체는 일반적으로 변형되어 사용된다. 변환된 물체 하나하나를 원래 물체의 인스턴스(Object Instance)라고 한다. 일반적으로 물체 인스턴스를 만들기위해서는 크기조절, 회전, 이동순으로 변환을 가한다. 물체 중심인 피벗과 원점이 일치한 상태이므로 이를 일치시키기 위한 변환이 불필요하므로 연산이 빠르게 진행되기 때문이다.
보통 C = T∙R∙S로 표시된다. 

6. 반사
축을 기준으로 물체를 대칭적으로 반사시키는 변환을 반사변환(Reflection Transformation)이라 한다.
반사변환은 오른손 좌표계 기준으로 표시된 정점좌표를 왼손 좌표계 기준으로 바꾸는 데에도 사용할 수 있다. 

 

 

 7. 구조 왜곡
구조왜곡 변환(Structure Deforming Transformation)은 x,y,z좌표에 대해 상수값의 크기 조절인수(Constant Scale Factor)를 곱하는게 일반적이지만, 이 값에 다양한 함수를 할당함으로써 여러 가지 효과를 시도한다.

8. 변환의 분류
물체변환은 변환의 성격에 따라 여러 가지로 분류된다.
이동변환, 회전변환을 합쳐서 강체변환(Rigid Body Transformaiton)이라 한다. 이 변환은 변환 전후에 내부 정점간의 거리가 그대로 유지된다는 특성이 있다.

강체변환에 균등 크기조절 변환과 반사변환을 추가한 것을 유사변환(Similarity Transformation)이라 한다. 이 변환은 변한 전후를 통해서 물체면 사이의 각이 유지되고, 또, 물체 내부의 정점간의 거리가 일정한 비율로 유지된다.

유사변환에 차등 크기조절 변환과 전단변환을 추가한 것을 어파인변환(Affine Transformation)이라한다. 이 변환은 유사변환보다 넓은 범주로서 물체의 타입이 유지된다는 특성을 지닌다.
어파인 변환의 가장 큰 특징은 행렬의 마지막 행이 항상(0,0,0,1)이라는 점이다.

원근변환(Perspective Transformation)은 직선이 직선으로 변환된다는 정도의 속성만 유지된다. 어파인 변환과 달리 마지막 행은 (0,0,0,1)이 아니다.

어파인 변환과 원근변환을 합쳐서 선형변환(Linear Transformation)이라 부른다. 변환행렬의 형태로 볼 때 행렬의 모든 요소가, 다른 변수의 함수가 아니고 상수이기만 하면 선형변환이다. 원근변환 역시 행렬 요소가 상수이기 때문에 선형변환에 속한다.

변환 사이의 관계를 나타내면 다음과 같다.

 


 
 변환행렬의 모습은 다음과 같다. 

 

 

 

 



출처: http://aesire.tistory.com/39 [My space]

출처: http://aesire.tistory.com/39 [My space]

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수

등록된 글이 없습니다.

대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED