Microsoft PowerPoint - lecture5-ch3.ppt [호환 모드]

Similar documents
Microsoft PowerPoint - lecture5-ch3

Microsoft PowerPoint - lecture5-ch3 [호환 모드]

(Microsoft PowerPoint - JXQEUPXIEBNZ.ppt [\310\243\310\257 \270\360\265\345])

UI TASK & KEY EVENT

UI TASK & KEY EVENT

PowerPoint Template

gnu-lee-oop-kor-lec10-1-chap10

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft PowerPoint - lecture4-ch2.ppt

UI TASK & KEY EVENT

제8장 자바 GUI 프로그래밍 II

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

LCD Display

PowerPoint 프레젠테이션

단국대학교멀티미디어공학그래픽스프로그래밍중간고사 (2011 년봄학기 ) 2011 년 4 월 26 일학과학번이름 중간고사 담당교수 : 단국대학교멀티미디어공학전공박경신 l 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤

슬라이드 1

금오공대 컴퓨터공학전공 강의자료

슬라이드 1

PowerPoint 프레젠테이션

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

Javascript

Week3

2005CG01.PDF

C++ Programming

슬라이드 1

슬라이드 1

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

tkinter를 이용한 계산기 구현

RVC Robot Vaccum Cleaner

PowerPoint Presentation

5.스택(강의자료).key

목차 제 1 장 inexio Touch Driver소개 소개 및 주요 기능 제품사양... 4 제 2 장 설치 및 실행 설치 시 주의사항 설치 권고 사양 프로그램 설치 하드웨

PowerPoint Presentation

API 매뉴얼

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

4장기본프로그래밍2

PowerPoint Presentation

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

00 SPH-V6900_....

03_queue

04_오픈지엘API.key

제품 특징 PC에서 마우스/키보드로 사용 Motion Ring은 사용자의 동작을 인식하는 3D 공간 인식 센서 가 장착되어 있어 정해진 제스처를 사용하여 마우스나 키보드 로 사용할 수 있습니다. - 일반적인 마우스와 키보드 없이 인터넷 웹 페이지를 사용하 거나 프레젠테

03장.스택.key

Microsoft PowerPoint - lecture2-opengl.ppt [호환 모드]

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

UI VoC Process 안

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

adfasdfasfdasfasfadf

Microsoft Word - cg09-midterm.doc

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

chap 5: Trees

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

PowerPoint Template

오버라이딩 (Overriding)

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

인켈(국문)pdf.pdf

윈도우시스템프로그래밍

MAX+plus II Getting Started - 무작정따라하기

Microsoft PowerPoint - Java7.pptx

Microsoft Word - FunctionCall

PowerPoint 프레젠테이션

Microsoft PowerPoint - 06-Body Data Class.pptx

Microsoft Word - cg07-midterm.doc

쉽게 풀어쓴 C 프로그래밍

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

자바로

Microsoft PowerPoint - gnu-w06-python_[실습]_day13-turtle-shape

<C6F7C6AEB6F5B1B3C0E72E687770>

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

이장에서다룰내용 테두리를제어하는스타일시트 외부여백 (Margin) 과내부여백 (Padding) 관련속성 위치관련속성 2

chap x: G입력

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

쉽게 풀어쓴 C 프로그래밍

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

Microsoft Word - cg12-midterm-answer

Ext JS À¥¾ÖÇø®ÄÉÀ̼ǰ³¹ß-³¹Àå.PDF

SMV Vending Machine Implementation and Verification 김성민 정혁준 손영석

MVVM 패턴의 이해

Chapter_06

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Javascript.pages

KEY 디바이스 드라이버

untitled

05-class.key

Modal Window

API 매뉴얼

K&R2 Reference Manual 번역본

Windows 8에서 BioStar 1 설치하기

Microsoft PowerPoint - IP11.pptx

# KM


<4D F736F F F696E74202D20C1A63138C0E520C0CCBAA5C6AE20C3B3B8AE28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

#KM-350AB..

PowerPoint 프레젠테이션

Open GL

Transcription:

Overview Input and Interaction 514780 2018 년가을학기 9/27/2018 단국대학교박경신 입력장치 (Input device) 물리적입력장치 (Physical input devices) Mouse, Keyboard, Trackball 논리적장치 String, Locator, Pick, Choice, Valuators, Stroke device 입력모드 Request mode, Sample mode, Event mode GLUT Devices & Event-driven programming 마우스, 키보드, 메뉴, 조이스틱, 테블렛,.. Interaction 컴퓨터기술의중요한발전가운데하나는사용자가컴퓨터화면을이용하여상호작용을할수있다는것이다. 상호작용 (Interaction) 사용자는마우스와같은대화식장치를통하여행동을취한다. 컴퓨터가사용자의입력을감지한다. 프로그램은이입력에반응하여상태를바꾼다. 프로그램은이새로운상태를디스플레이한다. 사용자는바뀐디스플레이를본다. 사용자가이변화에다시반응하는과정들이반복된다. Graphical Input 입력장치를두가지다른방법으로생각할수있다 물리적장치 Mouse, Keyboard, Trackball 논리적장치 물리적특성이아닌사용자프로그램과의상위인터페이스에의하여특징지어짐 입력모드 입력장치가응용프로그램에게입력을제공하는방식은측정과정 (Measure) 과장치트리거 (Trigger) 로설명될수있다 요구모드 (Request mode) 샘플모드 (Sample mode) 이벤트모드 (Event mode)

Physical Input Devices Physical Input Devices 물리적입력장치 (Physical input devices) 지시장치 (Pointing devices) 사용자가화면상의한위치를지시할수있게함 대부분의경우사용자가컴퓨터에신호즉, 인터럽트를보내기위해 1 이상의버튼을가지고있다. Mouse, trackball, tablet, lightpen, joystick, spaceball 키보드장치 (Keyboard devices) 프로그램에문자코드를반환하는장치 Keyboard mouse trackball light pen data tablet joy stick space ball Relative Positioning Device 데이터테블렛 (data tablet) 같은장치는절대위치를제공한다. 마우스, 트랙볼, 조이스틱같은장치는변화하는속도를적분하여위치정보가계산된다. Rotation of cylinders in mouse Roll of trackball 정확한절대위치를구하기어려움 장치를가변 - 감도입력으로사용할수있음 Logical Input Devices 문자열장치 (String device) - keyboard 사용자프로그램에 ASCII 문자열 (strings of characters) 을제공 위치장치 (Locator device) mouse, trackball 사용자프로그램에실세계좌표의위치 (position) 를제공 지적장치 (Pick device) mouse button, gun 사용자프로그램에객체의식별자 (ID) 를반환 선택장치 (Choice device) widgets, function keys, mouse button 사용자가선택사항들 (menu) 중하나를선택하도록함 벨류에이터장치 (Valuators) slide bars, joystick, dial 사용자프로그램에아날로그입력 (range of value) 을제공 획장치 (Stroke) mouse drag 위치들의배열 (array of positions) 을반환

X Window Input X Window System 모델은클라이언트와서버모델 (client-server model) 네트워크로구성. 그래픽스서버 (Graphics Server) 는래스터디스플레이, 키보드, 마우스를가진워크스테이션이다. 이서버는디스플레이에출력서비스를키보드와마우스를통한입력서비스를제공한다. 클라이언트 (Client) - OpenGL 프로그램은그래픽스서버를사용하는클라이언트이다. Input Modes 입력장치는 OS에신호를보내는트리거 (trigger) 를가지고있다. 마우스 버튼 키보드에서 리턴 / 엔터 키 입력장치는트리거시컴퓨터에게측정치 (measure) 를넘겨준다. 신호를주는데사용할수있는장치의물리적입력이다. 마우스는 위치정보 를준다. 키보드는 ASCII code 를준다. Request Mode 요구모드 (Request mode) 에서는장치가트리거될때까지측정치가프로그램으로반환되지않는다. 문자입력을요구하는전형적인비그래픽스적인응용프로그램의표준 예를들어 C 프로그램의scanf 함수가사용될때프로그램이단말기에서문자를칠때까지기다리면서정지한다. 그리고엔터키 (trigger) 를누르기까지타이핑과교정이가능하다. Sample Mode 샘플모드 (Sample mode) 에서는즉각적인입력을제공한다. 사용자프로그램에서함수의호출을만나는즉시측정치가반환된다. 따라서트리거가필요하지않다. 예 : C 프로그램의 getc

Event Mode 대부분의시스템은여러개의입력장치가있으며각장치마다자신의트리거로측정과정을실행하는환경으로구성된다 입력장치가트리거 (trigger) 될때마다이벤트 (event) 가생성되고, 장치의측정치가장치식별자 (ID) 와더불어이벤트큐 (event queue) 에들어간다. 답신 (callback) 함수를특정이벤트와연결하여사용한다. Event Types Window 윈도우 resize, expose, iconify Keyboard 키를누름 (press) 와키에서뗌 (release) Mouse 마우스버튼을누름 Motion 마우스움직임 Idle 이벤트가없음 Programming Event-Driven Input 이벤트-구동 (Event-drive) 입력프로그래밍을위해이벤트에대응하는답신함수 (callback function) 을정의한다. 이벤트가발생시해당답신함수 (callback function) 이동작한다. 예를들어, GLUT에서마우스이벤트의답신함수는 main 함수내에서 glutmousefunc(mouse) 를통해서지정한다. 그리고 mouse 답신함수의형태는다음과같다. void mouse(int button, int state, int x, int y) GLUT Devices Keyboard normal keys special keys Mouse Position buttons Joystick Tablet Dial/button box Spaceball

GLUT Keyboard Functions glutkeyboardfunc(func) ACII character 키가눌려졌을때불려짐 glutspecialfunc(func) 특수 special 키가눌려졌을때불려짐 glutkeyboardupfunc(func) ACII character 키가떼어졌을때불려짐 glutspecialupfunc(func) 특수 special 키가떼어졌을때불려짐 glutgetmodifiers() 이벤트발생시 Shift, Control, Alt keys의상태를줌 glutignorekeyrepeat(val) GLUT에게자동키보드반복을무시하라고알려줌 GLUT Keyboard Event Callback void keyboard(unsigned char key, int x, int y) 키보드인터랙션에대한처리를지정. key 인자는 ACII character code 로지정 x, y 인자는키를눌렀을때의마우스의위치 void keyboard(unsigned char key, int x, int y) switch (key): /* q-key exits the program */ case q : exit(0); GLUT Special Key GLUT 특수키 (special key) 지정 GLUT_KEY_F1,F2..,F12 GLUT_KEY_UP,DOWN,LEFT,RIGHT 방향키 GLUT_KEY_PAGE_UP,PAGE_DOWN,HOME,END,INSERT void specialkey(int key, int x, int y) switch(key) case GLUT_KEY_F1: red = 1.0; green = 0.0; blue = 0.0; break; case GLUT_KEY_F2: GLUT Modifier Key CTRL, ALT, SHIFT modifier key 가눌려졌는지확인하려면 int glutgetmodifiers(void) 사용. GLUT_ACTIVE_SHIFT SHIFT 키 ( 혹은 Caps Lock 인상태 ) GLUT_ACTIVE_CTRL GLUT_ACTIVE_ALT void keyboard(unsigned char key, int x, int y) if (key == 27) /* ESC-key exits the program */ exit(0); else if (key == r ) int mod = glutgetmodifier(); if (mod == GLUT_ACTIVE_CTRL) red = 0.0; else red = 1.0;

GLUT Mouse Functions glutmousefunc(void(*func)(int button, int state, int x, int y)) 마우스버튼이눌려졌을때불려짐 glutmotionfunc(void(*func)(int x, int y)) 마우스가버튼이눌려진상태에서움직일때불려짐 glutpassivemotionfunc(void (*func)(int x, int y)) 마우스버튼이눌려지지않은상태에서움직일때불려짐 GLUT Mouse Event Callback void mouse(int button, int state, int x, int y) button 인자에는 GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON state 인자에는 GLUT_DOWN ( 마우스버튼이눌려졌을때 ) GLUT_UP ( 마우스버튼이떼어졌을때 ) x, y 인자는마우스버튼이눌렸거나떼어졌을때마우스의위치 (in GLUT window coordinates) void mouse(int button, int state, int x, int y) GLUT Motion Event Callback void motion(int x, int y) x, y 인자는마우스의새로운위치 (in GLUT window coordinates) void motion(int x, int y) GLUT Mouse Enter/Leave the Window void glutentryfunc(void(*func)(int state)); void entry(int state) state 인자는 GLUT_LEFT, GLUT_ENTERED X-window에서는정확히윈도우에마우스가들어오고나갈때의이벤트를발생시킴. Windows OS에서는마우스를현재윈도우에클릭해야 window focus가바뀌게되므로이함수가정확히작동되지않음. void entry(int state)

Mouse Positioning GLUT screen coordinate 은원점을왼쪽위쪽 (top-left corner) 으로하고 x+ 는오른쪽, y+ 는아래쪽으로 1 pixel 단위로증가한다. OpenGL 은 2D drawing coordinate 은원점이왼쪽아래쪽 (bottom-left corner) 으로하고, x+ 는오른쪽, y+ 는위쪽으로증가한다. (0,0) h w (0,0) -5 5 5-5 Drawing geo at cursor location void mouse(int button, int state, int x, int y) if(button==glut_right_button && state==glut_down) exit(0); if(button==glut_left_button && state==glut_down) g_mousemove = true; else if(button==glut_left_button && state==glut_up) g_mousemove = false; void motion(int mx, int my) int w = glutget(glut_window_width); int h = glutget(glut_window_height); float x = (float) 10 * (mx - w*0.5) / w; // 0~600(x+right) => -5~5(x+ right) float y = (float) 10 * (h*0.5 - my) / h; // 0~600(y+down) => x -5~5(y+ up) if (g_mousemove) geo->setposition(glm::vec3(x, y, 0)); glutpostredisplay(); If both a mouse button and ALT key are pressed void mouse(int button, int state, int x, int y) specialkey = glutgetmodifiers(); if((state==glut_down)&&(specialkey == GLUT_ACTIVE_ALT)) if (button == GLUT_LEFT_BUTTON) red = 1.0; green = 0.0, blue = 0.0; else if (button = GLUT_MIDDLE_BUTTON) red = 0.0; green = 1.0, blue = 0.0; GLUT Device Functions glutjoystickfunc(func) 조이스틱의상태를매 t milliseconds 단위로호출 gluttabletmotionfunc(func) 테블렛 puck이움직였을때호출 gluttabletbuttonfunc(func) 테블렛버튼이눌렸거나떼어졌을때호출 glutdialsfunc(func) 다이얼이돌려졌을때호출 glutbuttonboxfunc(func) 다이얼 / 버튼박스의버튼이눌렸거나떼어졌을때호출

Widgets 대부분의윈도우시스템은그래픽사용자인터페이스 (Graphical User Interface) 위제트 (widgets) 을제공 그래픽디스플레이에입력기능을제공하는고수준인터페이스 (Higher-level interface) 물리적입력장치가제공하는대부분의기능을제공한다. 위제트의예 Menus Push Buttons Radio buttons Sliders Scroll bars Dials GLUT Menus Functions GLUT 는간단한팝업메뉴 (pop-up menus) 기능을제공한다. 먼저메뉴안에항목들을정의한후, 이팝업메뉴를특정마우스버튼과연결해야한다 ( 이마우스버튼을눌렀을때나타날수있도록 ). 각메뉴항목에해당하는답신함수를정의해야함. 주 menus 아래 sub-menus 를만들수있다. id = glutcreatemenu(func); /* starts defining a new menu */ glutaddmenuentry(label, value); /* adds an entry to the menu */ glutaddsubmenu(label, id); /* adds a submenu to the menu */ glutattachmenu(button); /* defines mouse buttons to pop-up the menu */ Menus 는실행중에아래와같은함수를써서바꿀수도있다. glutsetmenu, glutremovemenuitem, glutchangetomenuentry, glutchangetosubmenu Menus 는실행중에아래와같은함수를써서버튼에 attach 혹은 detach 가가능하다. glutdetachmenu Defining a simple menu int glutcreatemenu(void (*func)(int value)); void glutaddmenuentry(char *name, int value); name 인자는메뉴에나타나는이름 value인자는메뉴엔트리가선택됐을때답신함수에보내지는값 void glutattachmenu(int button); button인자에는 GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON menu_id = glutcreatemenu(menu); clear screen glutaddmenuentry( clear screen, 1); gluaddmenuentry( exit, 2); exit glutattachmenu(glut_right_button); Menu actions Menu callback void menu(int id) if(id == 1) glclear(); if(id == 2) exit(0); 각각의메뉴는생성시 ID를갖는다. glutaddsubmenu(char *submenu_name, submenu id) 를사용하여 sub-menus 추가

Hierarchical Menus sub_menu = glutcreatemenu(size_menu); glutaddmenuentry( Increase Size, 2); glutaddmenuentry( Decrease Size, 3); glutcreatemenu(top_menu); glutaddmenuentry( Quit, 1); glutaddsubmenu( Resize, sub_menu); glutattachmenu(glut_right_button); Quit Resize Increase Size Decrease Size Idle Callback glutidlefunc(void (*func)(void)) 의답신함수는다른이벤트가없을때실행됨. Idle 은애니메이션움직임에사용함, e.g. rotating square void idle() /* change something */ t += dt glutpostredisplay(); void display() glclear(); /* draw something that depends on t */ glutswapbuffers(); Idle 의 default 답신함수 (callback function) 는 NULL. The display callback glutpostredisplay 디스플레이답신함수는 GLUT 에서윈도우가새로그리기 (window refresh) 를요할때불려진다. 윈도우가처음으로열렸을때 윈도우가재구성이필요할때 윈도우가 expose 됐을때 사용자프로그램에서디스플레이가바뀌길원할때 glutdisplayfunc(display) 는모든 GLUT 프로그램에서반드시불리는 display callback 이다. void glutpostredisplay() 함수는윈도우가새로그려져야할필요가있는경우를표시하는일을한다. 일반적으로 display callback 함수를직접호출하는것보다, 이함수를사용하면디스플레이가다시그리기지시플래그를 GLUT 메인루프내에설치해서, 과다하거나불필요한화면그리기를방지한다. glutpostredisplay를사용하면이프로그램이이벤트루프를처리할때마다디스플레이가한번실행되도록한다.

Animating a Display Display callback 함수내에서디스플레이를새로그릴때 glclear() 를사용하여먼저윈도우를 clear 한다. 그러나, 프레임버퍼에서의그림정보는그림내용의디스플레이와분리되어있다. 따라서반쪽만그리게되는디스플레이를보게됨. single_double_buffer.cpp 참고 rotating cube 예제 Double Buffering 2개의 color buffer를사용 Front Buffer 화면에출력 Back Buffer 그래픽스랜더링으로래스터이미지생성 Double Buffer 더블버퍼를초기화 glutinitdisplaymode(glut_double GLUT_RGB) display callback에서버퍼를지움 glclear(gl_color_buffer_bit ) display callback에서마지막으로스왑버퍼를부름 glutswapbuffers() The Reshape callback glutreshapefunc(reshape) 는재구성이벤트답신함수를호출한다. void reshape(int w, int h) 윈도우의넓이 (width) 와높이 (height) 를반환한다. 이답신함수는자동적으로 redisplay를부른다. Reshape callback 함수는윈도우가처음열렸을때호출되므로관측함수를넣기에좋은곳이다. Example Reshape void reshape(int w, int h) g_aspectratio = (float) (w/h); g_projection = glm::perspective(g_fovy, g_aspect, g_near, g_far); glviewport(0, 0, w, h); glutpostredisplay();