기하 변환
기하변환 (Geometric Transformation)
-
물체 변환 또는 좌표계 변환의 기본
- 행렬로 표현됨
- 이동, 회전, 크기 조절 등
- 기하 변환(geometric transformation)은 3차원 공간 상에 있는 도형의 모양이나 위치를 바꾸는 변환(transformation) 기술. 예를 들어, 도형을 회전, 이동, 확대/축소하거나 기울이는 등의 변환을 통해 다양한 모양을 만들어 낼 수 있음.
- OpenGL에서 모델뷰 변환(Modelview ransformation)과 투영 변환 (Projection transformation)으로 구분됨. 모델뷰 변환은 객체의 위치, 크기, 방향 등을 조절하며, 투영 변환은 화면에 어떻게 보일지를 결정함.
- 모델뷰 변환 : glTranslatef(), glRotatef(), glScalef()
- 투영 변환 : glOrtho()와 glFrustum() 함수를 사용하여 원근 투영(perspective projection)과 직교 투영(orthographic projection)을 구현.
2차원 이동 (Translation)
x′=1Xx+0Xy+TxX1y′=0Xx+1Xy+TyX1


물체를 구성하는 다각형 정점이 동일한 양만큼 움직이는 것을 이동 변환 (Translational Transformation)이라고 함.
2차원 평면에서 사각형 정점 P'를 P로 이동하는 과정 : 강체 변환 (Rigid Body Transformation)
2차원 이동은 행렬 곱셈으로 표현됨.
Tx와 Ty는 각각 x축과 y축으로 이동할 양을 나타내는 값임. 이동 변환을 수행하기 위해서는 이 행렬을 기존의 변환 행렬에 곱해주면 됨.
3차원 이동 (Translation)



3차원 이동은 오브젝트의 위치를 변화시키는 기하 변환 중 하나로 오브젝트의 위치를 새로운 위치로 이동시킴. 3차원 이동은 3x3 행렬과 3차원 벡터를 이용하여 구현 가능. 벡터는 이동할 양과 방향을 정의하고, 행렬은 이동 변환을 적용.
Tx, Ty, Tz는 각각 x, y, z 축으로 이동할 양을 나타냄
2차원 회전 (Rotation)



3차원 회전 (Rotation)
- 회전축 기준의 회전으로 정의
- 반 시계 방향의 회전각



크기 조절 (Scaling)
- 균등 크기조절(Uniform Scaling) vs. 차등 크기조절(Non-Uniform Scaling)



Sx, Sy, Sz는 x, y, z 축에 대한 크기 조절 비율임. 변환 행렬을 적용하면 물체의 크기를 조절할 수 있음.
Sx, Sy, Sz의 값이 모두 2인 경우, 물체의 크기가 2배로 확대됨. 0.5이면 0.5배로 축소됨.
- 균등 스케일링 : 모든 축에 대하여 같은 비율로 크기가 바뀌는 조절
- 차등 스케일링 : 어느 한 축에 대해서라도 비율이 다른 조절
전단 (Shearing)
-
예: x-y 평면에서의 전단



전단 변환은 x, y, z 축 각각에 대해 수행할 수 있음. x축으로 전단 변환을 하면 객체가 yz 평면을 따라 이동하게 됨. y축으로 전단 변환을 하면 객체가 xz 평면을 따라 이동하게 되고, z축으로 전단 변환을 하면 객체가 xy 평면을 따라 이동하게 됨.
shx, shy, shz는 x, y, z축 방향으로의 전단 계수이다. 전단 계수를 증가시키면, 해당 축 방향으로 전단 변환의 정도가 증가함
복합 변환 (Composite Transformation)
- 크기조절(S1) 후, 결과 물체를 회전(R1)한 후, 다시 크기조절(S2)
- P' = S2ㆍR1ㆍS1ㆍP
- 행렬 곱셈의 순서에 유의
- P' = CㆍP 복합행렬 C는 한번만 계산. 모든 정점에 적용
-
원점 기준 회전(Origin Rotation) versus 중심점 기준 회전(Pivot Point Rotation)

- 중심점 기준 회전
- 피벗이 좌표계 원점에 일치하도록 물체를 이동한다.
- 물체를 원점 기준으로 축 주위로 회전한다.
- 회전된 물체를 ①번에서 이동한 방향의 반대 방향으로 이동한다.


- 복합 행렬(Composite Matrix)를 사용한 일련의 연속된 변환을 복합 변환(Composite Transformation)이라고 함. 두 개 이상의 변환을 결합하여 새로운 변환을 만들어내는 방법
- 작업이 가해진 순서의 역순으로 행렬이 곱해진다. 연속된 변환 행렬을 모두 곱해 하나의 행렬로 표시한 것을 복합 행렬이라고 함. 변환은 모든 정점에 대해 동일하게 가해짐. 모든 정점에 대해서 쭉쭉 계산하는 것보다 복합 행렬을 곱하면 연산 속도가 빨라짐.
- 복합 변환할 때, 복합 변환 행렬을 구할 때는 복합 변환 순서의 역순으로 곱셈이 가해짐. 복합 변환에서 여러 개의 행렬을 곱해 복합 행렬을 만들 때, 행렬의 곱셈 순서는 바뀌어도 되지만, 행렬이 줄을 선 순서는 바뀌면 안됨.
- 원점 기준 회전 : 원점을 중심으로 회전하는 것. 즉, 객체의 중심이 원점에 위치한 경우, 객체는 자기 자신을 중심으로 회전.
- 중심점 기준 회전 : 객체의 중심점을 중심으로 회전하는 것. 이 경우, 회전 변환 매트릭스를 계산할 때 중심점을 원점으로 옮긴 다음 회전시키고 다시 원래 위치로 옮기는 과정이 필요함. 이를 통해 객체는 중심점을 중심으로 회전.
#include <GL/freeglut.h>
void MyDisplay() {
glClear(GL_COLOR_BUFFER_BIT); //컬러버퍼에 초기화 색을 가함
glViewport(0, 0, 300, 300); //뷰포트 설정
glColor3f(1.0, 0.0, 0.0); //그리는 도형의 색상 설정
glMatrixMode(GL_MODELVIEW); //모델뷰 행렬을 사용하도록 설정
glLoadIdentity(); //모델뷰 행렬을 단위 행렬로 초기화함.
glRotatef(45.0, 0.0, 0.0, 1.0); //z축을 기준으로 45도 회전
glTranslatef(0.6, 0.0, 0.0); //x축으로 0.6만큼 이동
glutSolidCube(0.3); //크기가 0.3인 육면체 그리기
glFlush(); //그리기 명령 실행
}
int main(int argc, char** argv) {
glutInit(&argc, argv); //GLUT 라이브러리를 초기화함
glutInitDisplayMode(GLUT_RGB); //디스플레이 모드를 RGBA 색상 모드로 설정함
glutInitWindowSize(300, 300); //윈도우 크기 설정
glutInitWindowPosition(0, 0); //윈도우 위치 설정
glutCreateWindow("OpenGL Sample Drawing"); //윈도우 생성
glClearColor(1.0, 1.0, 1.0, 1.0); //초기화 색은 백색
glMatrixMode(GL_PROJECTION); //행렬 모드를 GL_PROJECTION으로 설정
glLoadIdentity(); //현재의 행렬 상태 초기화함.
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); //좌표계 설정
glutDisplayFunc(MyDisplay); //디스플레이 콜백 함수 등록
glutMainLoop(); //이벤트 루프 실행
return 0;
}



복합 변환 - 이동 후 회전 과 회전 후 이동
-
교환법칙이 성립하지 않음
- RㆍT와 TㆍR은 일반적으로 서로 다른 결과

- 물체 인스턴스
- C = TㆍRㆍS

- 그래픽 라이브러리에서 가져온 물체는 일반적으로 변형하여 사용하는데, 변환된 물체 하나하나를 물체의 인스턴스(Object Instance)라 한다.
- 물체 인스턴스를 만들기 위해서는 크기 조절, 회전, 이동순으로 변화를 가한다. 크기 조절이나 회전을 먼저 가하는 이유는, 물체 중심인 피벗과 원점이 일치한 상태이므로 이를 일치하기 위한 변환이 불필요하고, 따라서 연산이 빠르게 진행되기 때문이다.
반사 (Reflection)



구조왜곡 변환 (Structure Deforming Transformation)
- y=x 기준의 반사 - 복합변환


변환의 분류
-
강체변환(Rigid Body Transformation)
- 이동변환, 회전변환
- 물체 자체의 모습은 불변
- 정점간의 거리가 유지된다는 특성이 있음.
-
유사변환(Similarity Transformation)
- 강체변환 + 균등 크기조절 변환, 반사변환
- 물체면 사이의 각이 유지됨.
- 물체내부 정점 간의 거리가 일정한 비율로 유지됨.
- 어파인 변환 (Affine Transformation)
- 유사변환 + 차등 크기조절 변환, 전단변환
- 물체의 타입이 유지
- 직선은 직선으로, 다각형은 다각형으로, 곡면은 곡면으로
- 평행선이 보존
- 변환행렬의 마지막 행이 항상 (0, 0, 0, 1)
-
원근변환(Perspective Transformation)
- 평행선이 만남.
- 직선이 직선으로 유지
- 변환행렬의 마지막 행이 (0, 0, 0, 1) 아님
-
선형변환(Linear Transformation)
- 어파인 변환 + 원근 변환
- 선형 조합 (Linear Combination)으로 표시되는 변환
- x' = ax + by + cz에서 x'는 x, y, z 라는 변수를 각각 상수 배 한 것을 더한 것임
- 예 :




'전공 > 컴퓨터 그래픽스' 카테고리의 다른 글
모델변환과 시점변환 (4)지엘의 시점변환 & (5)3차원 회전 (0) | 2023.04.23 |
---|---|
모델변환과 시점변환 (3)지엘의 모델변환 (0) | 2023.04.22 |
모델변환과 시점변환 (1)좌표계 (0) | 2023.04.11 |
OpenGL 기본 틀 : 정점배열 (1) | 2023.04.11 |
OpenGL 기본틀 : Callback 프로그래밍 (2)Menu Callback, Idle Callback, Timer Callback (0) | 2023.04.11 |
댓글