03 입력과 상호 작용
Download
Report
Transcript 03 입력과 상호 작용
제 3 장. 입력과 상호 작용
창원대학교
박동규
강의 개요
• 강의 내용
– 상호 작용을 위한 입력 장치
• 물리적 입력 장치
• 논리적 입력 장치
– 클라이언트-서버 그래픽스
• 이벤트- 구동 입력 프로그래밍
– 페인트 프로그램 소개
대화식 프로그램 개발
IVIS Lab, Changwon National University
2
3.1 상호 작용
• 상호 작용(Interaction)
– 화면상의 이미지에 사용자가 마우스와 같은 입력 장치로 반응하고
다시 이미지는 사용자의 입력에 반응하여 변화하는 과정의 반복.
– Ivan Sutherland의 스케치패드
• OpenGL에서의 상호 작용
– 이식성을 높이기 위해 상호 작용을 직접 지원하지 않는다.
• GL 라이브러리에 포함되어 있지 않다는 의미
– 상호작용은 윈도우 시스템마다 다름.
– GLUT 라이브러리에서 지원
• 윈도우 생성
• 마우스 및 키보드 등의 입력 장치의 입력 처리
• 팝업 메뉴 생성 및 처리 등
IVIS Lab, Changwon National University
3
3.2 입력 장치
• 물리적 입력 장치
– 마우스, 키보드와 같은 입력 장치의 하드웨어적 기능에 대한 관점
• 논리적 입력 장치
– 응용프로그램 관점에서 특성을 명시
• 사용자 프로그램과의 상위 인터페이스에 의해 특징지어 진다
– 프로그래머는 대부분 물리적 입력 장치의 특성까지 알 필요가 없
다
– C언어의 printf 함수
• 출력이 나오는 물리적 입력 장치가 프린터, 모니터, 디스크 파일 등일 수 있다
• 이는 응용 프로그램 작성자의 관심사항이 아니다.
– 컴퓨터 그래픽스에서 논리적 입력 장치의 사용이 좀 더 복잡
IVIS Lab, Changwon National University
4
물리적 입력 장치 (1)
• 지시 장치
– 상대위치 지정 장치
• 볼 마우스, 광학 마우스, 트랙볼 등
• 장치의 움직임에 따라 x, y 방향의 두 값을 생성
– 절대 위치 지정 장치
• 데이터 태블릿, 터치 스크린
• 도면 트레이싱, 정교한 그림 편집 작업에 적합
IVIS Lab, Changwon National University
5
물리적 입력 장치 (2)
• 조이스틱
– 가변-감도 장치
– 사용자에게 저항력을 줄 수 있어 시뮬레이션이나 게임
에 적합
• 3차원 입력 장치
– 스페이스 볼(space ball) : 6-자유도를 가짐
• 세가지 힘 : 상하, 좌우, 전후 압력 감지
• 세가지 비틀림
IVIS Lab, Changwon National University
6
물리적 입력 장치
• 커서 위치 지정
IVIS Lab, Changwon National University
7
논리적 입력 장치
• 입력 장치 분류
–
–
–
–
–
–
문자열장치
위치장치
지적장치 : 객체의 식별자를 제공
선택장치 : 선택사양중의 하나를 선택
밸류에이터 장치 : 아날로그 입력 제공
획(stroke) 장치 : 위치의 배열을 제공
IVIS Lab, Changwon National University
8
측정치와 트리거
• 논리적 입력 장치가 응용 프로그램에게 입력을 제
공하는 방식을 설명
• 측정치
– 사용자 프로그램으로 장치가 반환하는 값
예) 지적(pick) 장치 : 객체의 식별자 + 상태 정보
키보드 : 문자열
• 트리거
– 사용자가 컴퓨터에게 신호를 주게 하는 입력
예) 위치 장치 : 버튼
키보드 : Enter 키
IVIS Lab, Changwon National University
9
입력 모드
• 이벤트 모드
– 입력 장치가 트리거되면 이벤트가 생성되어 입력 장치
의 측정치와 식별자가 이벤트 큐에 저장된다
– GLUT API를 통해 지원
• 이벤트 처리
– 답신(callback) 함수를 이벤트에 연결
• 이벤트 발생시에 답신 함수가 자동적으로 수행된다
IVIS Lab, Changwon National University
10
3.3 클라이언트와 서버
• 분산 환경과 네트워크 환경에 적합한 모델
IVIS Lab, Changwon National University
11
3.4 디스플레이 리스트
• 초기의 간편한 그래픽스 구조
• 디스플레이 처리기
IVIS Lab, Changwon National University
디스플레이 리스트의 정의와 실행
• 정의
정수 ID
서버에 보내기만 한다
glNewList(BOX, GL_COMPILE);
// Display List의 시작. BOX는 List의 ID
// 비교 : GL_COMPILE_AND_EXECUTE
glBegin(GL_POLYGON);
// Polygon의 정의
glColor3f(1.0, 0.0, 0.0); // 색은 Red로..
glVertex2f(-1.0, -1.0);
// 4개의 좌표 정의
glVertex2f( 1.0, -1.0);
glVertex2f( 1.0, 1.0);
glVertex2f(-1.0, 1.0);
glEnd();
// Polygon 정의 끝
glEndList();
// List 정의 끝
• 호출
glCallList(BOX);
IVIS Lab, Changwon National University
13
다중 리스트
• 연속적인 식별자를 갖는 여러 개의 디스플레이 리
스트
– glGenLists(number)
• number 개의 연속된 리스트 ID를 확보하고 첫 ID를 반환
– glNewList() / glEndList()
• 확보된 리스트 ID를 이용하여 다중 리스트를 새성
– glCallLists()
• 여러 디스플레이 리스트를 실행
IVIS Lab, Changwon National University
14
Example
• 출처
– http://www.songho.ca/opengl/gl_displaylist.html
IVIS Lab, Changwon National University
15
속성 및 행렬 (1)
• 속성, 모델-관측 행렬, 투영 행렬 등의 시스템의
현재 상태의 적용을 받는다
glMatrixMode(GL_PROJECTION);
for (I=1; I < 5; I++)
{
glloadidentity();
gluOrtho2D(-2.0*I, 2.0*I, -2.0*I, 2.0*I);
glCallList(BOX);
}
// View 설정
// Matrix의 초기화
// 절단 사각형 변경
• 디스플레이 리스트로 들어가기 전에 속성과 행렬
을 저장하고 나올 때 복원하는 것이 좋다
IVIS Lab, Changwon National University
16
속성 및 행렬 (2)
• 속성 및 행렬 저장 & 복원
– 디스플레이 리스트 내에서 상태 변환이 가능
디스플레이 리스트로 들어가기 전에 속성과 행렬을
저장하고 나올 때 복원하는 것이 좋다
– 스택을 사용하여 저장
glPushAttrib(GL_ALL_ATTRIB_BITS);
glPushMatrix();
…
glPopAttrib();
glPopMatrix();
IVIS Lab, Changwon National University
17
GLUT의 폰트
• 획 문자 출력
glTranslatef(100.0, 100.0, 0.0);
glutStrokeCharacter(GLUT_STROKE_ROMAN, ‘A’);
‘A’ 문자 출력
• 래스터 문자 출력
glRasterPos2i(100,100);
glutBitmapCharacter(GLUT_BITMAP_8_BY_13, ‘A’);
• 각각 몇 개의 서체가 제공된다
– GLUT 매뉴얼 참조
IVIS Lab, Changwon National University
18
3.5 디스플레이 리스트와 모델링
• 디스플레이 리스트는 다른 디스플레이의 리스트
를 부를수 있다.
– 모델 부품간의 관계를 설정
– 계층적 모델을 구축할수 있다.
#define EYE 1
glNewList(Eye);
…
glEndList()
.. .
#define FACE 2
glNewList(FACE);
…
glTranslatef(…);
glCallList(EYE);
glTranslatef(…);
glCallList(EYE);
…
glEndList();
IVIS Lab, Changwon National University
19
디스플레이 리스트와 모델링
• Consider model of a car
- Create display list for chassis
- Create display list for wheel
glNewList( CAR, GL_COMPILE );
glCallList( CHASSIS );
glTranslatef( … );
glCallList( WHEEL );
glTranslatef( … );
glCallList( WHEEL );
…
glEndList();
Angel: Interactive Computer Graphics 5E © Addison-Wesley 2009
IVIS Lab, Changwon National University
이벤트-구동 입력의 프로그래밍
• 지시장치 사용
– 이벤트 종류
• 이동 이벤트
– 버튼 중에 하나를 눌린 채로 이동 시
– 답신 함수 : glutMotionFunc(callback_func)
• 비활성 미동이벤트
– 버튼을 누르지 않고 이동 시
– 답신 함수 : glutPassiveMotionFunc(callback_func)
• 마우스 이벤트
– 버튼 중 하나가 눌려지거나 떼어졌을 때
– 답신 함수 : glutMouseFunc(callback_func)
• 키보드 장치 사용
– 키보드 이벤트
IVIS Lab, Changwon National University
21
사각형 그리기 프로그램 예(square.c)
#include <gl\glut.h>
void myinit(void);
void mouse(int, int, int, int);
Void drawSquare(int, int);
int main (int argc, char **argv)
{
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutCreateWindow (“square”);
윈도우 크기가
myinit();
변할 경우호출
glutReshapeFunc(myReshape);
glutMouseFunc(mouse);
glutMotionFunc(drawSquare);
버튼을 누르고 마우
glutMainLoop();
스를 움직이면 사각
}
형을 그림
IVIS Lab, Changwon National University
22
사각형 그리기 프로그램 - 초기화
/* 전역 변수 */
GLsizei wh = 500, ww = 500;
/* 초기 윈도우 크기 */
GLfloat size = 3.0;
/* 사각형의 한변의 절반크기 */
void myinit(void)
{
glViewport (0, 0, ww, wh);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluOrtho2D (0.0, (GLdouble) ww, 0.0, (GLdouble) wh);
glMatrixMode (GL_MODELVIEW);
glClearColor (0.0, 0.0, 0.0, 0.0);
glClear (GL_COLOR_BUFFER_BIT);
glFlush();
}
IVIS Lab, Changwon National University
23
사각형 그리기 프로그램
- 마우스 이벤트
void mouse (int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
drawSquare(x, y);
if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)
exit(0);
}
IVIS Lab, Changwon National University
24
사각형 그리기 프로그램
- 사각형 그리기
void drawSquare( int x, int y)
{
마우스 좌표 : 좌상단이 (0,0) :MS windows system
y = wh -y;
윈도우 좌표 : 좌하단이 (0,0) : OpenGL window
glColor3ub( (char)rand()%256, (char)rand()%256, (char) rand()%256);
glBegin(GL_POLYGON);
glVertex2f (x+size, y+size);
glVertex2f (x-size, y+size);
glVertex2f (x-size, y-size);
glVertex2f (x+size, y-size);
glEnd();
glFlush();
}
IVIS Lab, Changwon National University
25
사각형 그리기 프로그램
- 윈도우 이벤트 (1)
• 재구성 이벤트 (Reshape Event)
– 윈도우 크기가 변화되는 경우
– 답신 함수 : glutReshapeFunc()
– 고려 사항
• 윈도우 내의 객체를 다시 그릴 것인가?
• 종횡비가 달라지는 경우 어떻게 해야 하는가?
• 기본 요소의 크기나 속성을 변화시켜야 하는가?
IVIS Lab, Changwon National University
26
사각형 그리기 프로그램
- 윈도우 이벤트 (2)
void myReshape (GLsizei w, GLsizei h)
{
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (0.0, (GLdouble)w, 0.0, (GLdouble)h);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
glViewport (0, 0, w,h);
glClearColor ( 0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
ww = w;
wh = h;
}
IVIS Lab, Changwon National University
1.
2.
3.
객체를 다시 그리지 않음
객체의 종횡비는 그대로
기본요소의 크기,속성 불변
27
사각형 그리기 프로그램
- 키보드 이벤트
• 키보드 이벤트
– 키가 눌렸을 때 이벤트 발생
– 예제:
void main() {
…
glutKeyboardFunc(keyboard);
…
}
void keyboard(unsigned char key, int x, int y)
{
if (key == ‘q’ || key == ‘Q’)
exit(0);
}
IVIS Lab, Changwon National University
28
사각형 그리기 프로그램
- 디스플레이 /휴지(idle) 이벤트
• 디스플레이 답신
– 윈도우가 다시 디스플레이되어야 할 떄
예) 윈도우가 맨 처음 열릴 때
– 사용자와의 상호작용을 필요로 하지 않는 단순히 정보를 디스플레
이 할 경우 사용
– 답신 함수 : glutDisplayFunc()
– 이 답신 함수는 반드시 포함 되어야 함
• 다른 이벤트가 없을 때 발생
– 디폴트 : null 함수
– 답신 함수 : glutIdleFunc(idle_func)
IVIS Lab, Changwon National University
29
메뉴
• GLUT는 팝업 메뉴를 제공
• 단순 팝업 메뉴 사용 예:
glutCreateMenu(demo_menu);
// 메뉴 답신 함수 설정
glutAddMenuEntry(“quit”, 1);
// 메뉴 항목 정의
glutAddMenuEntry(“Increase square size”, 2); // 메뉴 항목 정의
glutAddMenuEntry(“Decrease square size”, 3); // 메뉴 항목 정의
glutAttachMenu(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 메뉴를 눌렀을 경우
glutPostRedisplay();
// 메뉴호출 이전 상태를 다시 그림.
}
IVIS Lab, Changwon National University
30
계층 메뉴
sub_menu = glutCreateMenu(size_menu);
// 부메뉴 답신 함수 설정
glutAddmenuEntry(“Increase square size”, 2); // 메뉴 항목 정의
glutAddMenuEntry(“Decrease square size”, 3); // 메뉴 항목 정의
glutCreateMenu(top_menu);
// 주메뉴 답신 함수 설정
glutAddMenuEntry(“quit”, 1);
// 메뉴 항목 정의
glutAddSubMenu(“Resize”, sub_menu); // 부메뉴 항목 정의
glutAttachMenu(GLUT_RIGHT_BUTTON); // 마우스 오른쪽 버튼 연결
IVIS Lab, Changwon National University
31
간단한 페인트 프로그램
편집 모드
시계
왼쪽 버튼 : 편집 모드 선택, 정점 입력
IVIS Lab, Changwon National University
32
간단한 페인트 프로그램 - 함수 구성
void mouse(int btn, int state, int x, int y); // 마우스 답신 함수
void display(void);
void idle(void);
void drawSquare(int x, int y);
// Display 답신 함수
// Idle 답신 함수
// 4각형 함수
void myReshape(GLsizei, GLsizei);
void myinit(void)
void screen_box(intx, int y, int s);
// Resizing 답신 함수
// 초기화 함수
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);
// 각 메뉴의 답신 함수
long time(int t);
int pick(int x, int y);
// 시간출력 함수
// 편집 모드 선택
IVIS Lab, Changwon National University
33
간단한 페인트 프로그램 - 함수의 기능
main()
: 메뉴 및 답신 함수들을 정의
display() : 화면을 흰색으로 초기화 뒤, 버튼을 출력
idle()
: 화면 상단에 "시 : 분 : 초" 형식의 시계를 출력
myReshape() : 3.5절에서 설명한 Reshape 답신 함수 이용
myinit() : 윈도우를 지우고, 전역변수 및 Time Clock의 초기화, 128
문자의 디스플레이 리스트를 생성
mouse() : 그림 그리기 작업 수행
pick()
: 주어진 X, Y 좌표에 대응하는 스크린상의 영역을 결정
그리기 영역 = 0, 버튼 = 1, 2, 3, 4
메뉴 답신 함수 : 각 메뉴의 기능을 수행
IVIS Lab, Changwon National University
34
간단한 페인트 프로그램 - myinit()
void myinit(void)
{
/* set up a font in display list */
int i;
baset = time(0);
base = glGenLists(128);
for(i=0;i<128;i++)
{
glNewList(base+i, GL_COMPILE);
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, i);
glEndList();
}
glListBase(base);
glViewport(0,0,ww,wh);
/* Pick 2D clipping window to match size of X
window. This choice avoids having to scale
object coordinates each time window is resized
*/
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
IVIS Lab, Changwon National University
35
glOrtho(0.0, (GLdouble) ww , 0.0,(GLdouble) wh , -1.0, 1.0);
/* set clear color to black and clear window */
glClearColor (0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
IVIS Lab, Changwon National University
36
간단한 페인트 프로그램 - display()
void screen_box(int x, int y, int s )
{
glBegin(GL_QUADS);
glVertex2i(x, y);
glVertex2i(x+s, y);
glVertex2i(x+s, y+s);
glVertex2i(x, y+s);
glEnd();
}
void display(void)
{
glPushAttrib(GL_ALL_ATTRIB_BITS);
glutIdleFunc(NULL);
glClearColor (0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
screen_box(0,wh-ww/10,ww/10);
IVIS Lab, Changwon National University
glColor3f(1.0, 0.0, 0.0);
screen_box(ww/10,wh-ww/10, ww/10);
glColor3f(0.0, 1.0, 0.0);
screen_box(ww/5,wh-ww/10,ww/10);
glColor3f(0.0, 0.0, 1.0);
screen_box(3*ww/10,wh-ww/10,
ww/10);
glColor3f(0.0, 0.0, 0.0);
screen_box(ww/10+ww/40,
wh-ww/10+ww/40,
ww/20);
37
간단한 페인트 프로그램 - display()
glBegin(GL_LINES);
glPointSize(3.0);
glVertex2i(wh/40,wh-ww/20);
glBegin(GL_POINTS);
glVertex2i(wh/40+ww/20,
glVertex2i(3*ww/10+ww/20,
wh-ww/20);
wh-ww/20);
glEnd();
glEnd();
glBegin(GL_TRIANGLES);
glutIdleFunc(idle);
glVertex2i(ww/5+ww/40,
glFlush();
wh-ww/10+ww/40);
glVertex2i(ww/5+ww/20,wh-ww/40);
glPopAttrib();
}
glVertex2i(ww/5+3*ww/40,
wh-ww/10+ww/40);
glEnd();
IVIS Lab, Changwon National University
38
간단한 페인트 프로그램 - idle()
void idle(void)
{
char out[]="00:00:00";
long t, time();
int min, sec, hr;
glPushAttrib(GL_ALL_ATTRIB_BITS);
t=time(0)-baset;
hr=t/3600;
min = (t - 3600*hr) /60;
sec = (t - 3600*hr - 60*min);
hr = hr%24;
out[0]='0'+hr/10;
}
out[1]='0'+hr%10;
out[3]='0'+min/10;
out[4]='0'+min%10;
out[6]='0'+sec/10;
out[7]='0'+sec%10;
IVIS Lab, Changwon National University
glRasterPos2i(ww-80, wh-15);
glColor3f(0.0,0.0,0.0);
glBegin(GL_QUADS);
glVertex2i(ww-80, wh-15);
glVertex2i(ww, wh-15);
glVertex2i(ww, wh);
glVertex2i(ww-80, wh);
glEnd();
glColor3f(1.0,1.0,1.0);
glCallLists( strlen(out) , GL_BYTE, out);
glFlush();
glPopAttrib();
39
간단한 페인트 프로그램 - mouse()
void mouse(int btn, int state, int x, int y)
{
static int draw_mode = 0;
static int count;
int where;
static int xp[2],yp[2];
if(btn==GLUT_LEFT_BUTTON &&
state==GLUT_DOWN)
{
glPushAttrib(GL_ALL_ATTRIB_BITS);
glutIdleFunc(NULL);
where = pick(x,y);
glColor3f(r, g, b);
if(where != 0) {
count = 0;
draw_mode = where;
}
IVIS Lab, Changwon National University
else if(draw_mode == 1 && count == 0) {
count = 1;
xp[0] = x;
yp[0] = y;
}
else if(draw_mode == 1 && count != 0) {
glBegin(GL_LINES);
glVertex2i(x,wh-y);
glVertex2i(xp[0],wh-yp[0]);
glEnd();
draw_mode=0;
count=0;
}
40
간단한 페인트 프로그램 - mouse()
else if(draw_mode==2 && count==0) {
count = 1;
xp[0] = x;
yp[0] = y;
}
else if(draw_mode==2 && count !=0)
{
if(fill) glBegin(GL_POLYGON);
else glBegin(GL_LINE_LOOP);
glVertex2i(x,wh-y);
glVertex2i(x,wh-yp[0]);
glVertex2i(xp[0],wh-yp[0]);
glVertex2i(xp[0],wh-y);
glEnd();
draw_mode=0;
count=0;
}
IVIS Lab, Changwon National University
else if(draw_mode==3 && count==0)
{
count = 1;
xp[0] = x;
yp[0] = y;
}
else if(draw_mode==3 && count==1)
{
count = 2;
xp[1] = x;
yp[1] = y;
}
41
간단한 페인트 프로그램 - mouse()
else if(draw_mode==3 && count==2)
{
if(fill) glBegin(GL_POLYGON);
else glBegin(GL_LINE_LOOP);
glVertex2i(xp[0],wh-yp[0]);
glVertex2i(xp[1],wh-yp[1]);
glVertex2i(x,wh-y);
glEnd();
draw_mode=0;
count=0;
}
IVIS Lab, Changwon National University
else if(draw_mode == 4 )
{
drawSquare(x,y);
count++;
}
glutIdleFunc(idle);
glPopAttrib();
glFlush();
}
}
42
간단한 페인트 프로그램 - pick()
int pick(int x, int y)
{
y = wh - y;
if(y < wh-ww/10) return 0;
else if(x < ww/10) return 1;
else if(x < ww/5) return 2;
else if(x < 3*ww/10) return 3;
else if(x < 2*ww/5) return 4;
else return 0;
}
IVIS Lab, Changwon National University
43
대화식 프로그램 설계
•
좋은 대화식 프로그램의 조건
1) 디스플레이할 때에 깜빡거림없이 부드럽게 출력되어
야 한다
2) 화면상에 다양한 대화식 장치
3) 정보의 입력과 표시의 다양한 방법
4) 사용하기 쉬운 사용자 인터페이스
5) 사용자로의 피드백
6) 사용자에 대한 오류 허용성
7) 인간의 시각과 운동 특성이 고려된 설계
IVIS Lab, Changwon National University
44
이중 버퍼링 (1)
• 페인트 프로그램에서 시계의 깜박임
– 화면 재생 : 초당 50-75번
프레임 버퍼의 내용을 초당 50-75번 화면에 표시
– 재생하는 동안 프레임 버퍼의 내용이 변경되면 문제 발
생
• 화면 한 영역을 반복적으로 지우고 그리는 경우
• 화면이 복잡하여 한 재생주기 내에 그려질 수 없는 경우
이중 버퍼링으로 문제 해결
IVIS Lab, Changwon National University
45
이중 버퍼링 (2)
• 두개의 버퍼 사용
– 전면 버퍼 : 화면에 보여주는 부분
– 후면 버퍼 : 화면에 보이기 전에 미리 그리는 부분
전면 버퍼
디스플레이
glutSwapBuffers()
모니터
후면 버퍼
처리기
디스플레이
후면 버퍼
처리기
전면 버퍼
IVIS Lab, Changwon National University
모니터
46
툴킷, 위제트, 프레임 버퍼 (1)
• 툴킷
– GLUT에서 제공하는 메뉴이외에도 슬라이드바, 다이얼,
텍스트 입력 상자, 버튼, 아이콘 등 다양한 그래픽 도구
들이 필요
– 직접 만드는 것 보다 이들을 제공해주는 또 다른 툴킷
을 사용하는 것이 바람직
– FLTK 같은 툴킷이 있음
IVIS Lab, Changwon National University
47
툴킷, 위제트, 프레임 버퍼 (2)
• 프레임 버퍼에 대한 조작이 필요한 경우
– 메뉴 표시한 후 화면을 원래대로 복구
– 고무줄 기법(rubberbanding)
• XOR 연산을 사용할 수 있음
• OpenGL에서는 레이어(layer)를 사용하여 구현 가능
IVIS Lab, Changwon National University
48
Rubber band
IVIS Lab, Changwon National University
49
Q&A
50