ID gl New ListBOX GLCOMPILE Display List BOX
입력과 상호작용 디스플레이 리스트의 정의와 실행 정의 정수 ID 서버에 보내기만 함 gl. New. List(BOX, GL_COMPILE); // Display List의 시작. BOX는 List의 ID // 비교 : GL_COMPILE_AND_EXECUTE gl. Begin(GL_POLYGON); // Polygon의 정의 gl. Color 3 f(1. 0, 0. 0); // 색은 Red로. . gl. Vertex 2 f(-1. 0, -1. 0); // 4개의 좌표 정의 gl. Vertex 2 f( 1. 0, -1. 0); gl. Vertex 2 f( 1. 0, 1. 0); gl. Vertex 2 f(-1. 0, 1. 0); gl. End(); // Polygon 정의 끝 gl. End. List(); // List 정의 끝 호출 gl. Call. List(BOX); 19
입력과 상호작용 GLUT의 폰트 획 문자 출력 gl. Translatef(100. 0, 0. 0); glut. Stroke. Character(GLUT_STROKE_ROMAN, ‘A’); ‘A’ 문자 출력 래스터 문자 출력 gl. Raster. Pos 2 i(100, 100); glut. Bitmap. Character(GLUT_BITMAP_8_BY_13, ‘A’); 각각 몇 개의 서체가 제공됨 (GLUT 매뉴얼 참조) 23
입력과 상호작용 사각형 그리기 프로그램 예(square. c) int main (int argc, char **argv) { glut. Init (&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB); glut. Create. Window (“square”); myinit(); 윈도우 크기가 변할 경우 glut. Reshape. Func(my. Reshape); 호출 glut. Mouse. Func(mouse); glut. Motion. Func(draw. Square); 버튼을 누르고 마우스를 glut. Main. Loop(); 움직이면 사각형을 그림 } mouse (int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) draw. Square(x, y); if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) exit(0); } 26
입력과 상호작용 초기화 /* 전역 변수 */ GLsizei wh = 500, ww = 500; /* 초기 윈도우 크기 */ GLfloat size = 3. 0; /* 사각형의 한변의 절반크기 */ void myinit(void) { gl. Viewport (0, 0, ww, wh); gl. Matrix. Mode (GL_PROJECTION); gl. Load. Identity (); glu. Ortho 2 D (0. 0, (GLdouble) ww, 0. 0, (GLdouble) wh); gl. Matrix. Mode (GL_MODELVIEW); gl. Clear. Color (0. 0, 0. 0); gl. Clear (GL_COLOR_BUFFER_BIT); gl. Flush(); } 27
입력과 상호작용 사각형 그리기 void draw. Square( int x, int y) { y = wh -y; 마우스 좌표 : 좌 상단 (0, 0) 윈도우 좌표 : 좌 하단 (0, 0) gl. Color 3 ub( (char)rand()%256, (char) rand()%256); gl. Begin(GL_POLYGON); gl. Vertex 2 f (x+size, y+size); gl. Vertex 2 f (x-size, y-size); gl. Vertex 2 f (x+size, y-size); gl. End(); gl. Flush(); } 28
입력과 상호작용 윈도우 이벤트 (con’t) void my. Reshape (GLsizei w, GLsizei h) { gl. Matrix. Mode (GL_PROJECTION); gl. Load. Identity(); glu. Ortho 2 D (0. 0, (GLdouble)w, 0. 0, (GLdouble)h); gl. Matrix. Mode (GL_MODELVIEW); gl. Load. Identity(); gl. Viewport (0, 0, w, h); gl. Clear. Color ( 0. 0, 0. 0); gl. Clear(GL_COLOR_BUFFER_BIT); gl. Flush(); ww = w; wh = h; } 1. 객체를 다시 그리지 않음 2. 객체의 종횡비는 그대로 3. 기본요소의 크기, 속성 불변 30
입력과 상호작용 키보드 이벤트 키가 눌렸을 때 이벤트 발생 main() { … glut. Keyboard. Func(keyboard); … } void keyboard(unsigned char key, int x, int y) { if (key == ‘q’ || key == ‘Q’) exit(0); } 31
입력과 상호작용 메뉴 GLUT는 팝업 메뉴를 제공 glut. Create. Menu(demo_menu); // 메뉴 답신 함수 설정 glut. Add. Menu. Entry(“quit”, 1); // 메뉴 항목 정의 glut. Add. Menu. Entry(“Increase square size”, 2); // 메뉴 항목 정의 glut. Add. Menu. Entry(“Decrease square size”, 3); // 메뉴 항목 정의 glut. Attach. Menu(GLUT_RIGHT_BUTTON); // 메뉴를 마우스 오른쪽 버튼에 연결 void demo_menu(int id) // 메뉴 답신 함수 { if (id == 1) exit(); // Quit 메뉴를 눌렀을 경우 else if (id == 2) size = 2 * size; // Increase square size 메뉴를 눌렀을 경우 else if (size > 1) size = size / 2; // Decrease square size 메뉴를 눌렀을 경우 glut. Post. Redisplay(); // 메뉴호출 이전 상태를 다시 그림. } 34
입력과 상호작용 계층 메뉴 sub_menu = glut. Create. Menu(size_menu); // 부메뉴 답신 함수 설정 glut. Addmenu. Entry(“Increase square size”, 2); // 메뉴 항목 정의 glut. Add. Menu. Entry(“Decrease square size”, 3); // 메뉴 항목 정의 glut. Create. Menu(top_menu); // 주메뉴 답신 함수 설정 glut. Add. Menu. Entry(“quit”, 1); // 메뉴 항목 정의 glut. Add. Sub. Menu(“Resize”, sub_menu); // 부메뉴 항목 정의 glut. Attach. Menu(GLUT_RIGHT_BUTTON); // 마우스 오른쪽 버튼 연결 35
입력과 상호작용 함수 구성 void mouse(int btn, int state, int x, int y); // 마우스 답신 함수 void key(unsigned char c, int x, int y); // 키보드 답신 함수 void display(void); // Display 답신 함수 void draw. Square(int x, int y); // 4각형 함수 void my. Reshape(GLsizei, GLsizei); // Resizing 답신 함수 void myinit(void) // 초기화 함수 void screen_box(intx, int y, int s); // void right_menu(int id); // 각 메뉴의 답신 함수 void middle_menu(int id); void color_menu(int id); void pixel_menu(int id); void fill_menu(int id); int pick(int x, int y); // 편집 모드 선택 38
대화식 프로그램의 애니메이션 (con’t) 입력과 상호작용 정사각형 디스플레이 n n theta : 0 ~ 360도의 각도 thetar : radian 각도 ( 2 PI radian = 360도) void display(){ gl. Clear(GL_COLOR_BUFFER_BIT); gl. Begin(GL_POLYGON); thetar = (theta * (2 * 3. 14159)) / 360. 0; gl. Vertex 2 f(cos(thetar), sin(thetar)); gl. Vertex 2 f(-sin(thetar), cos(thetar)); gl. Vertex 2 f(-cos(thetar), -sin(thetar)); gl. Vertex 2 f(sin(thetar), -cos(thetar)); gl. End(); gl. Flush(); } 42
대화식 프로그램의 애니메이션 (con’t) 입력과 상호작용 애니메이션 void idle() { theta += 2; if (theta >= 360. 0) theta -= 360. 0; glut. Post. Redisplay(); } void mouse(int btn, int state, int x, int y) { if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN) glut. Idle. Func(idle); if(btn==GLUT_MIDDLE_BUTTON && state==GLUT_DOWN) glut. Idle. Func(NULL); } 43
대화식 프로그램의 애니메이션 (con’t) 입력과 상호작용 Main 함수 void main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB); glut. Create. Window("Rotating Rectangle"); myinit(); glut. Display. Func(display); glut. Idle. Func (idle); glut. Mouse. Func (mouse); glut. Main. Loop(); } 44
- Slides: 46