Open Graphics Library 5
1. OpenGL의 변환과 행렬
현재 변환 행렬 (Current Transformation Matrix, CTM)
- OpenGL은 상태 머신(State Machine)으로 동작하며, 현재 상태인 CTM이 4x4 행렬로 저장됩니다.
- CTM은 초기 상태로 단위 행렬이 설정되며, 새로운 변환이 추가될 때마다 CTM에 곱해져 최종 변환이 적용됩니다.
복합 변환 (Composite Transformations)
- 여러 변환이 연속으로 적용될 때 변환 순서에 따라 결과가 달라집니다.
- 변환 순서의 중요성:
- 회전을 먼저 한 후 이동을 적용하면 다른 위치에서 이동이 일어납니다.
- 이동을 먼저 한 후 회전하면 이동된 위치를 기준으로 회전합니다.
- 행렬곱을 생각했을 때, 곱해지는 행렬의 순서가 중요한 것과 마찬가지
- OpenGL에서 복합 변환은 역순으로 적용됩니다. 즉, 나중에 호출된 변환이 먼저 적용됩니다.
2. CTM (Current Transformation Matrix) 스택 구조
- CTM 스택: 변환 행렬을 저장하고 복구하는 Stack 구조입니다.
- 각 물체의 독립적인 변환을 수행하고 싶을 때, 이전에 사용한 CTM을 저장(백업)하였다가 다시 재사용하고자 할 때 사용합니다.
- glPushMatrix(): 현재 CTM을 스택에 저장.
- glPopMatrix(): 스택에서 이전 CTM을 복원.
- 이 구조를 사용하면 여러 물체에 다른 변환을 독립적으로 적용할 수 있습니다.
- 예시:
3. 애니메이션 (Animation)
- 애니메이션은 여러 정지된 프레임을 연속적으로 빠르게 렌더링하여 부드러운 동작을 표현하는 방법입니다.
- 애니메이션 제어 방법:
- 키보드 또는 마우스 입력을 통해 사용자가 직접 제어.
- glutIdleFunc()을 사용하여 자동으로 애니메이션을 실행.
- glutTimerFunc()를 사용해 특정 시간 간격으로 애니메이션을 실행.
더블 버퍼링 (Double Buffering)
- 더블 버퍼링은 화면의 깜빡임을 줄이고 애니메이션이 부드럽게 보이도록 합니다.
- Back buffer: 그 다음에 표시될 내용을 계산하고 렌더링하는 버퍼.
- Front buffer: 현재 화면에 표시되는 버퍼.
- 화면에 표시될 내용을 미리 Back buffer에서 계산한 후, Front buffer와 교체하여 시각적 결함을 최소화.
1 2 3
// 더블 버퍼링과 RGB 모드 설정 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // GLUT_DOUBLE를 GLUT_SINGLE로 바꾸면 뚝뚝 끊김
4. 벡터 (Vector)
- 벡터는 크기와 방향을 가진 기하학적 객체로, 컴퓨터 그래픽스에서 다양한 용도로 사용됩니다.
- 벡터의 중요성:
- 폴리곤의 앞면과 뒷면을 구분하는 데 사용.
- 조명 계산 시 광원의 반사를 계산하는 데 사용.
- 후면 제거(backface culling)에 사용.( 렌더링 처리 속도와 현실감 향상)
- 점
t(6,4)
에서 점s(2,1)
로 가는 벡터(-4,-3)
는s - t
로 계산한다. 즉 방향이 바뀌면 부호가 바뀐다.
벡터 연산
- 벡터의 내적 (Dot Product): 두 벡터 \( \mathbf{A} = (x_1, y_1, z_1) \)와 \( \mathbf{B} = (x_2, y_2, z_2) \)의 내적은 아래와 같이 계산합니다: \[ \mathbf{A} \cdot \mathbf{B} = x_1 \cdot x_2 + y_1 \cdot y_2 + z_1 \cdot z_2 \]
- 내적 결과가 0이면 두 벡터는
수직(직교)
입니다.
- 내적 결과가 0이면 두 벡터는
- 벡터의 외적 (Cross Product): 두 벡터 \( \mathbf{A} = (x_1, y_1, z_1) \)와 \( \mathbf{B} = (x_2, y_2, z_2) \)의 외적은 다음과 같습니다: \[ \mathbf{A} \times \mathbf{B} = \left( y_1 \cdot z_2 - z_1 \cdot y_2, \; z_1 \cdot x_2 - x_1 \cdot z_2, \; x_1 \cdot y_2 - y_1 \cdot x_2 \right) \]
- 외적은 두 벡터에
수직인 벡터(법선 벡터)
를 구할 때 사용됩니다.
- 외적은 두 벡터에
벡터의 정규화 (Normalization): 벡터 \( \mathbf{A} = (x, y, z) \)의 크기(길이)를 1로 만드는 과정으로, 아래와 같이 계산합니다: \[ \mathbf{A}_{\text{normalized}} = \frac{\mathbf{A}}{|\mathbf{A}|} = \left( \frac{x}{|\mathbf{A}|}, \frac{y}{|\mathbf{A}|}, \frac{z}{|\mathbf{A}|} \right) \] 여기서 \( |\mathbf{A}| = \sqrt{x^2 + y^2 + z^2} \)는 벡터의 크기입니다.
- 두 벡터의 사이각 구하기: 벡터 \( \mathbf{A} \)와 \( \mathbf{B} \) 사이의 각도 \( \theta \)는 내적을 통해 구할 수 있습니다: \[ \cos \theta = \frac{\mathbf{A} \cdot \mathbf{B}}{|\mathbf{A}| |\mathbf{B}|} \] \( \theta = \cos^{-1} \left( \frac{\mathbf{A} \cdot \mathbf{B}}{|\mathbf{A}| |\mathbf{B}|} \right) \)
법선 벡터 (Normal Vector)
- 정의: 평면에 수직인 벡터로, 면이 바라보는 방향을 나타내며 조명 계산에서 면의 방향을 파악하는 데 필수적입니다.
- 방향: 오른손 법칙을 통해 법선 벡터의 방향을 정의할 수 있으며, 벡터의 순서를 기준으로 바깥쪽 또는 안쪽 방향을 설정할 수 있습니다.
- 폐곡면(Closed Surface): 구나 큐브와 같은 폐곡면에서는 법선 벡터를 바깥 방향으로 설정하여 물리적 현실감을 더하는 표준적인 방법을 사용합니다. 이는 빛이 외부 표면과만 상호작용하도록 하여, 자연스러운 그래픽 효과를 제공합니다.
This post is licensed under CC BY 4.0 by the author.