* 출처 : OpenGL로 배우는 3차원 컴퓨터 그래픽스, 한빛아카데미
일정한 시간 간격이 지나면 발생하는 이벤트가 타이머 이벤트이며, 타이머 콜백은 이 이벤트에 대응하는 콜백 함수다.
void glutTimerFunc(unsigned int msecs, void(*func)(int value), int value);
- unsigned int msecs : 얼마 후에 이벤트를 발생시킬 것인지, msec 단위
- void(*func)(int value) : 타이머 이벤트 발생 시에 호출되어야 할 함수명
- int value : 이벤트 발생 시에 콜백 함수에 넘겨줄 파라미터
예제를 통해 알아보자.
#include <glut.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include <time.h>
unsigned char PALETTE[16][3] = {
{ 255, 255, 255 }, // WHITE
{ 0, 255, 255 }, // CYAN
{ 255, 0, 255 }, // PURPLE
{ 0, 0, 255 }, // BLUE
{ 192, 192, 192 }, // LIGHT GRAY
{ 128, 128, 128 }, // DARK GRAY
{ 0, 128, 128 }, // DARK TEAL
{ 128, 0, 128 }, // DARK PURPLE
{ 0, 0, 128 }, // DARK BLUE
{ 255, 255, 0 }, // YELLOW
{ 0, 255, 0 }, // GREEN
{ 128, 128, 0 }, // DARK YELLOW
{ 0, 128, 0 }, // DARK GREEN
{ 255, 0, 0 }, // RED
{ 128, 0, 0 }, // DARK RED
{ 0, 0, 0 }, // BLACK
};
GLfloat Delta = 0.0;
GLint Index = 0;
GLfloat Red = 0.0;
GLfloat Green = 0.0;
GLfloat Blue = 0.0;
void MyDisplay() {
Red = PALETTE[Index][0] / 255.0f;
Green = PALETTE[Index][1] / 255.0f;
Blue = PALETTE[Index][2] / 255.0f;
glColor3f(Red, Green, Blue);
glBegin(GL_LINES);
glVertex3f(-1.0 + Delta, 1.0, 0.0);
glVertex3f(1.0 - Delta, -1.0, 0.0);
glVertex3f(-1.0, -1.0 + Delta, 0.0);
glVertex3f(1.0, 1.0 - Delta, 0.0);
glEnd();
glutSwapBuffers();
}
void MyTimer(int Value) {
if (Delta < 2.0f)
Delta = Delta + 0.01;
else {
Delta = 0.0;
if (++Index >= 15) {
Index = 0;
glClear(GL_COLOR_BUFFER_BIT);
}
}
glutPostRedisplay();
glutTimerFunc(10, MyTimer, 1);
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("OpenGL Timer Animation Sample");
glClearColor(0.0, 0.0, 0.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glutTimerFunc(10, MyTimer, 1);
glutDisplayFunc(MyDisplay);
glutMainLoop();
return 0;
}
1. PALETTE : 16가지의 기본색
2. MyTimer() : 팔레트의 인덱스 값 변경 -> 다시 그리기 위해 glClear함수를 사용해 화면을 지움, glutTimerFunc의 첫 파라미터인 10은 10msec를 의미하고 콜백이 동일한 시간 간격으로 계속 일어나게 하기 위해 MyTimer함수 내부에 다시 선언해준다.
3. MyDisplay() : 색을 바꾸기 위해 인덱스 값을 사용하여 1을 기준으로 부동 소수로 바꿔주어야 함. -> glColor3f에서 색 지정 -> glBegin(GL_LINES)는 Delta 변수를 사용하여 선을 회전시키는 부분이다.
'기타 > 컴퓨터 그래픽스 & OpenGL' 카테고리의 다른 글
OpenGL로 배우는 3차원 컴퓨터 그래픽스 연습문제 9장 / 2022.12.06 (0) | 2022.12.06 |
---|---|
[OpenGL] 평행 투상과 원근 투상 / 2022.10.24 (0) | 2022.10.24 |
[OpenGL] 아이들 콜백 / 2022.10.23 (0) | 2022.10.23 |
[OpenGL] 메뉴 콜백 / 2022.10.23 (0) | 2022.10.23 |
[OpenGL] 마우스 콜백 / 2022.10.23 (0) | 2022.10.23 |