1. 출력 기본 객체란?
OpenGL에서 화면에 무엇인가를 그릴 때 가장 작은 단위는 점(Point), 선(Line), 그리고 다각형(Polygon)입니다. 이들을 출력 기본 객체 (Primitive)라고 부릅니다.
✅ 점, 선, 다각형
- 점 (GL_POINTS): 하나의 위치를 표시하는 단일 정점
- 선 (GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP): 두 정점을 잇거나 연속적인 선형 구조를 만듦
- 다각형 (GL_POLYGON, GL_TRIANGLES 등): 여러 정점을 연결하여 면을 구성
✅ 앞면과 뒷면 (Face)
- 다각형에는 앞면(front face)과 뒷면(back face) 개념이 있습니다.
- OpenGL은 이 정보를 바탕으로 면을 표시하거나 생략할 수 있습니다.
- 법선 벡터(Normal Vector): 정점을 나열한 방향으로 오른손을 말아쥐었을 때, 엄지 방향이 법선 방향이 됩니다.
2. OpenGL로 도형을 그리는 기본 구조
OpenGL은 glBegin()
과 glEnd()
사이에 도형을 정의합니다. 각 정점은 glVertex*()
함수를 통해 지정합니다.
glBegin(GL_LINES);
glVertex2i(50, 100);
glVertex2i(75, 150);
glEnd();
✅ glVertex*() 함수 종류
glVertex[차원][데이터형][v]
형식을 따릅니다.
요소 | 가능한 값 | 설명 |
---|---|---|
차원 | 2, 3, 4 | 2D, 3D, 4D 좌표 지정 |
데이터형 | i, s, f, d | 정수(int), short, float, double |
v | (없음), v | 개별 인자 또는 배열 입력 방식 |
예시 함수 | 의미 |
---|---|
glVertex2i(x, y) |
2차원 정수 좌표 |
glVertex3f(x, y, z) |
3차원 실수 좌표 |
glVertex2iv(p) |
정수형 2D 배열 입력 |
3. 선(Line) 도형 그리기
각기 다른 선 도형을 OpenGL로 어떻게 표현하는지 그림으로 함께 살펴봅시다.
🔹 GL_LINES
각 두 정점을 하나의 선으로 인식합니다.
void draw_lines() {
// 🔹 GL_LINES
glColor3d(1, 0, 0); // 빨강
glBegin(GL_LINES);
glVertex2iv(p1); glVertex2iv(p2);
glVertex2iv(p3); glVertex2iv(p4);
glVertex2iv(p5); glVertex2iv(p1);
glEnd();
// 🔹 GL_LINE_STRIP
glColor3d(0, 0, 1); // 파랑
glBegin(GL_LINE_STRIP);
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glEnd();
// 🔹 GL_LINE_LOOP
glColor3d(0, 0.5, 0); // 초록
glBegin(GL_LINE_LOOP);
glVertex2iv(p1);
glVertex2iv(p2);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glEnd();
}
- 연결: (p1-p2), (p3-p4), (p5, p1)
🔹 GL_LINE_STRIP
첫 정점부터 마지막 정점까지 연결된 선
- 연결: p1-p2-p3-p4-p5
🔹 GL_LINE_LOOP
GL_LINE_STRIP
+ 마지막과 처음 정점을 다시 연결
- 연결: p1-p2-p3-p4-p5-p1
💡 각 선 도형은 점의 순서에 따라 전혀 다른 결과를 만듭니다.
4. 다각형(Polygon) 도형 그리기
다각형 계열 도형은 점을 세 개 이상 연결하여 면을 구성합니다. OpenGL은 삼각형을 기본 단위로 여러 방식의 도형을 생성할 수 있습니다.
🔸 GL_POLYGON
void draw_polygon() {
glColor3d(1, 0, 0); // 빨강
glBegin(GL_POLYGON);
glVertex2i(-8, 6);
glVertex2i(-6, 8);
glVertex2i(-4, 7);
glVertex2i(-4, 5);
glVertex2i(-6, 4);
glVertex2i(-8, 5);
glEnd();
}
- 정점들을 모두 연결하여 하나의 다각형 생성
- 단점: 삼각형이 아닌 복잡한 형태는 잘못 그려질 수 있음
🔸 GL_TRIANGLES
void draw_triangles() {
glColor3d(0, 0.6, 0); // 초록
glBegin(GL_TRIANGLES);
glVertex2i(2, 6); glVertex2i(4, 8); glVertex2i(6, 6);
glVertex2i(2, 5); glVertex2i(3, 3); glVertex2i(6, 4);
glEnd();
}
- 3개의 정점을 묶어 독립된 삼각형 생성
🔸 GL_TRIANGLE_STRIP
void draw_triangle_strip() {
glColor3d(0, 0, 1); // 파랑
glBegin(GL_TRIANGLE_STRIP);
glVertex2i(-8, 2);
glVertex2i(-6, 3);
glVertex2i(-7, 0);
glVertex2i(-4, -1);
glEnd();
}
- 이전 삼각형의 마지막 두 점과 새로운 점으로 삼각형 구성
🔸 GL_TRIANGLE_FAN
void draw_triangle_fan() {
glColor3d(1, 0.5, 0); // 주황
glBegin(GL_TRIANGLE_FAN);
glVertex2i(5, 1); // 중심점
glVertex2i(6, 3);
glVertex2i(8, 2);
glVertex2i(8, 0);
glVertex2i(6, -1);
glVertex2i(4, -1);
glVertex2i(3, 1);
glVertex2i(6, 3); // 다시 첫 점으로 닫기
glEnd();
}
- 첫 점을 중심으로 부채꼴로 삼각형 구성
🔸 GL_QUADS
// 🔸 GL_QUADS: 왼쪽 아래
void draw_quads() {
glColor3d(0.5, 0.5, 0.5); // 회색
glBegin(GL_QUADS);
glVertex2i(-8, -4); glVertex2i(-6, -4);
glVertex2i(-6, -6); glVertex2i(-8, -6);
glVertex2i(-5, -4); glVertex2i(-3, -4);
glVertex2i(-3, -6); glVertex2i(-5, -6);
glEnd();
}
- 4개의 정점으로 하나의 사각형 생성 (OpenGL 최신 버전에서는 비권장)
🔸 GL_QUAD_STRIP
void draw_quad_strip() {
glColor3d(0.3, 0.3, 0.8); // 파랑 계열
glBegin(GL_QUAD_STRIP);
glVertex2i(5, -4); glVertex2i(3, -8);
glVertex2i(7, -4); glVertex2i(7, -6);
glEnd();
}
- 두 개의 점 쌍을 연결해서 사각형 스트립 생성
5. 실습 코드 예제: 타원과 호(Arc) 그리기
이제 OpenGL 기본 도형을 활용하여 타원과 호를 직접 그려보는 실습 예제를 살펴보겠습니다.
🔧 타원 그리기
void draw_ellipse(double cx, double cy, double sx, double sy, double r, double g, double b, int snum) {
glColor3d(r, g, b); // 색상 지정
glBegin(GL_TRIANGLE_FAN); // 중심을 기준으로 삼각형 팬 시작
glVertex2d(cx, cy); // 중심 점
for (int i = 0; i < snum; ++i) {
double theta = i / (double)(snum - 1) * 2.0 * 3.141592; // 각도 계산
double x = cx + sx * cos(theta); // 타원의 x 좌표
double y = cy + sy * sin(theta); // 타원의 y 좌표
glVertex2d(x, y);
}
glEnd(); // 도형 그리기 종료
}
이 함수는 중심을 기준으로 원을 따라 정점을 배치하고, 이 점들을 삼각형으로 연결하여 타원 형태를 만듭니다.
🔧 호(Arc) 그리기
void draw_arc(double cx, double cy, double radius, double start_angle, double end_angle, double r, double g, double b, int snum) {
glColor3d(r, g, b); // 색상 설정
glBegin(GL_TRIANGLE_FAN); // 삼각형 팬 시작
glVertex2d(cx, cy); // 중심 점
for (int i = 0; i < snum; i++) {
double theta = start_angle + (end_angle - start_angle) * (i / (double)snum);
theta = theta * 2.0 * 3.141592 / 360; // 각도를 라디안으로 변환
double x = cx + radius * cos(theta); // 호 위의 x 좌표
double y = cy + radius * sin(theta); // 호 위의 y 좌표
glVertex2d(x, y);
}
glEnd(); // 도형 그리기 종료
}
이 함수는 특정 각도 범위 안에서만 정점을 계산해 부채꼴(Arc)을 만듭니다.
6. 전체 요약
도형 | OpenGL 상수 | 특징 |
---|---|---|
점 | GL_POINTS | 단일 정점 |
선 | GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP | 정점 연결 방식 차이 |
삼각형 | GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN | 다양한 구성 방식 제공 |
사각형 | GL_QUADS, GL_QUAD_STRIP | 정점 4개 기반 도형 |
- 도형 그리기는
glBegin()
과glEnd()
사이에 작성 glVertex*()
함수로 정점 지정- 복잡한 도형도 결국 삼각형 조합으로 그릴 수 있음
'프로그래밍 > 컴퓨터그래픽스' 카테고리의 다른 글
합성 변환과 해석 (0) | 2025.04.05 |
---|---|
어파인 변환의 해석 (0) | 2025.04.05 |
동차 좌표, 어파인 공간, 어파인 변환: 이동, 회전, 스케일, 밀림 변환 (0) | 2025.04.04 |
OpenGL 기본 출력 객체 속성 정리 (0) | 2025.04.04 |
Hello OpenGL 예제 분석: Freeglut 기반 기초 코드 설명 (0) | 2025.04.04 |