Post

Open Graphics Library 3

1. World Coordinates to Screen Coordinates (월드 좌표계에서 화면 좌표계로의 매핑)

  • Aspect Ratio:
    • 화면의 가로/세로 비율을 의미하며, 월드 좌표계와 화면의 비율이 다르면 화면에서 물체가 왜곡될 수 있습니다.
    • 왜곡을 방지하기 위해서 두 영역의 비율을 일치시키거나 Viewport를 사용합니다.
  • Viewport:
    • Viewport는 윈도우 화면에 그릴 일부 영역을 지정하는 직사각형 영역으로, glViewport(x, y, w, h) 함수를 사용해 설정합니다.
    • 이 함수를 통해 월드 좌표를 화면 좌표로 매핑할 때 특정 영역을 지정할 수 있습니다.

2. Viewport와 Viewing Rectangle 간의 매핑

  • glOrthoglViewport를 통해 월드 좌표에서 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, rightbottom, 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에서 사용하는 좌표계 변환 순서는 다음과 같습니다:
    1. Model Coordinate: 물체 자체의 로컬 좌표계
    2. World Coordinate: 물체가 월드 공간에 배치되는 좌표계
    3. Eye Coordinate: 카메라를 기준으로 물체를 바라보는 좌표계
    4. Clip Coordinate: 클리핑 과정을 위한 좌표계
    5. Normalized Device Coordinate: 클리핑된 좌표를 정규화한 좌표계
    6. 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.