Open Graphics Library 3
1. World Coordinates to Screen Coordinates (월드 좌표계에서 화면 좌표계로의 매핑)
- Aspect Ratio:
- 화면의 가로/세로 비율을 의미하며, 월드 좌표계와 화면의 비율이 다르면 화면에서 물체가 왜곡될 수 있습니다.
- 왜곡을 방지하기 위해서 두 영역의 비율을 일치시키거나 Viewport를 사용합니다.
- Viewport:
- Viewport는 윈도우 화면에 그릴 일부 영역을 지정하는 직사각형 영역으로,
glViewport(x, y, w, h)
함수를 사용해 설정합니다. - 이 함수를 통해 월드 좌표를 화면 좌표로 매핑할 때 특정 영역을 지정할 수 있습니다.
- Viewport는 윈도우 화면에 그릴 일부 영역을 지정하는 직사각형 영역으로,
2. Viewport와 Viewing Rectangle 간의 매핑
glOrtho
와glViewport
를 통해 월드 좌표에서 Viewport로 매핑되는 선형 함수가 만들어집니다.- 매핑은 다음의 선형 함수 형태로 표현됩니다:
sx = A * x + c
,sy = B * y + D
- 여기서
A
,B
,c
,D
는 각 좌표의 변환 비율을 나타내는 값입니다.
1
2
3
4
5
6
7
gluOrtho2D(0.0, 2.0, 0.0, 1.0); // 가시 공간 설정
// Viewing Rectangle (세계 좌표)
// left, right, bottom, top
glutInitWindowSize(500, 400); // 윈도우 크기 설정 (너비, 높이)
glViewport(40, 60, 360, 240); // 뷰포트 설정
//x, y, w, h (x, y에서 시작되는 w, h 너비 사각형)
𝑺𝒙 = 𝟏𝟖𝟎𝒙 + 𝟒𝟎, 𝑺𝒚 = 𝟐𝟒𝟎𝒚 + 𝟔
3. Polyline과 OpenGL
- Polyline:
- 직선의 연속으로 구성된 선분의 집합입니다. 곡선을 근사화할 때도 사용됩니다.
- OpenGL에서는
GL_LINE_STRIP
으로 구현할 수 있습니다.
- 예제 (Dinosaur 그리기):
dino.dat
파일에 저장된 데이터를 불러와GL_LINE_STRIP
을 사용해 그리는 예제가 있습니다.glViewport
함수를 여러 번 사용하여 화면을 여러 개의 Viewport로 분할하는 방법을 활용할 수 있습니다.
4. Tiling
- Tiling은 화면을 여러 개의 작은 Viewport로 나누고 각 Viewport에 동일한 이미지를 그려내는 방식입니다.
- 반복문을 활용하여 여러 번의
glViewport
설정을 통해 효과적으로 여러 개의 이미지를 그릴 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void render() {
glClear(GL_COLOR_BUFFER_BIT);
setWindow(0, 640.0, 0, 480.0); // set a fixed window
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
glViewport(128*i, 96*j, 128, 96);
drawPolyLineFile("dino.dat");
}
}
glFlush();
}
5. 원근 투영 (Perspective Projection)의 필요성
- 직교 투영(Orthogonal Projection) 은 이해하기는 쉽지만, 현실적이지 않습니다. 물체가 멀어져도 크기가 변하지 않기 때문입니다.
- 원근 투영(Perspective Projection) 에서는 물체가 멀어질수록 작아지기 때문에 현실감 있게 표현됩니다.
OpenGL에서 원근 투영을 위해
glFrustum(left, right, bottom, top, near, far)
함수를 사용합니다.- Viewing Frustum(뷰잉 프러스텀)
- 원근 투영에서 물체를 볼 수 있는 가상의 영역이며, 절두체(truncated pyramid) 형태를 가집니다.
- 물체는 이 프러스텀 안에 있어야 화면에 표시됩니다.
glFrustum()
함수를 통해 이 프러스텀을 정의할 수 있습니다.- 카메라는 기본적으로 -z축 방향을 바라본다고 가정합니다.
- Synthetic Camera Model(가상 카메라 모델, 눈 역할)
- 가상의 camera의 위치는 (0, 0, 0) 이고 이를 center of projection (COP, apex)라고 합니다.
- 카메라는 기본적으로 –z축 방향을 바라본다고 가정합니다.
6. OpenGL에서의 Perspective Projection
- glFrustum 함수의 매개변수:
left
,right
: near 평면의 왼쪽과 오른쪽 x 좌표bottom
,top
: near 평면의 아래쪽과 위쪽 y 좌표near
: 카메라에서 near 평면까지의 거리(양수여야 함)far
: 카메라에서 far 평면까지의 거리(양수여야 함)left
,right
와bottom
,top
는 크기는 같고 부호가 반대여야 시점의 장면의 중심을 향한다.
- GLM 라이브러리:
- OpenGL에서 자주 사용되는 수학적 연산을 지원하는 C++ 라이브러리로, Frustum에 필요한 벡터 및 행렬 연산을 쉽게 수행할 수 있습니다.
7. Perspective Projection의 원리
- 투영되는 위치 계산:
- 원근 투영에서는 멀리 있는 물체일수록 축소되어 보입니다.
- 물체의 좌표
(x, y, z)
를 viewing face에 투영할 때, 투영된 좌표는(x' = (x/z) * d, y' = (y/z) * d, z' = d)
로 나타납니다. - 이때
d
는 viewing face의 z 좌표(glFrustum의 near)입니다. z 값이 클수록 물체가 작아 보이는 것이 원근 투영의 원리입니다.
1
2
3
glFrustum(0, 100, 0, 100, 5, 50);
glVertex3f(20, 80, -10) // 5/10 만큼 축소 (20, 40, -10)
glVertex3f(20, 80, -20) // 5/20 만큼 축소 (10, 20, -20)
8. OpenGL에서의 좌표계 변환 순서
- OpenGL에서 사용하는 좌표계 변환 순서는 다음과 같습니다:
- Model Coordinate: 물체 자체의 로컬 좌표계
- World Coordinate: 물체가 월드 공간에 배치되는 좌표계
- Eye Coordinate: 카메라를 기준으로 물체를 바라보는 좌표계
- Clip Coordinate: 클리핑 과정을 위한 좌표계
- Normalized Device Coordinate: 클리핑된 좌표를 정규화한 좌표계
- Screen Coordinate: 최종적으로 화면에 표시되는 2D 좌표계
9. Modeling Transformation (모델링 변환)
- Modeling Transformation의 역할:
- 물체의 이동, 크기 변환, 회전 등을 포함하여 물체의 모양과 위치를 변경하는 변환입니다.
- View Transformation은 카메라의 위치와 방향을 설정하는 변환입니다.
- 예시:
- 2D 변환: 물체를 회전, 이동, 크기 변환 등을 통해 다양한 형태로 구성할 수 있습니다.
- 3D 변환: 물체를 3차원 공간에서 이동시키거나 크기를 조정할 수 있습니다.
- 눈송이 예제: 기본적인 형태를 여러 번 회전, 이동, 반사하여 만들어진 복잡한 물체의 경우가 대표적입니다.
This post is licensed under CC BY 4.0 by the author.