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

Similar documents
PowerPoint 프레젠테이션

Microsoft PowerPoint - lecture4-ch2.ppt

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

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

Microsoft PowerPoint - lecture5-ch3

PCServerMgmt7

6주차.key

Orcad Capture 9.x

Microsoft Word - cg09-midterm.doc

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

04_오픈지엘API.key

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

강의10

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

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

PowerPoint 프레젠테이션

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

Microsoft PowerPoint cg01.ppt

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

chapter2.hwp

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

슬라이드 1

Microsoft PowerPoint - lecture3-ch2.ppt

PowerPoint 프레젠테이션

T100MD+

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

untitled

UML

을 할 때, 결국 여러 가지 단어를 넣어서 모두 찾아야 한다는 것이다. 그 러나 가능한 모든 용어 표현을 상상하기가 쉽지 않고, 또 모두 찾기도 어 렵다. 용어를 표준화하여 한 가지 표현만 쓰도록 하여야 한다고 하지만, 말은 쉬워도 모든 표준화된 용어를 일일이 외우기는

Microsoft Word - cg07-midterm.doc

Remote UI Guide

Microsoft PowerPoint - [2009] 02.pptx

C# Programming Guide - Types

01-OOPConcepts(2).PDF

슬라이드 1

untitled

untitled

untitled

Open GL

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

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

UI TASK & KEY EVENT

컴퓨터그래픽스 소프트웨어

PowerPoint 프레젠테이션

(72) 발명자 이동희 서울 동작구 여의대방로44길 10, 101동 802호 (대 방동, 대림아파트) 노삼혁 서울 중구 정동길 21-31, B동 404호 (정동, 정동상 림원) 이 발명을 지원한 국가연구개발사업 과제고유번호 부처명 교육과학기술부

2005CG01.PDF

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C4C656D70656C2D5A69762E637070>

APOGEE Insight_KR_Base_3P11

chap7.key

PowerPoint 프레젠테이션

[ 융합과학 ] 과학고 R&E 결과보고서 뇌파를이용한곤충제어 연구기간 : ~ 연구책임자 : 최홍수 ( 대구경북과학기술원 ) 지도교사 : 박경희 ( 부산일과학고 ) 참여학생 : 김남호 ( 부산일과학고 ) 안진웅 ( 부산일과학고 )

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

4. #include <stdio.h> #include <stdlib.h> int main() { functiona(); } void functiona() { printf("hihi\n"); } warning: conflicting types for functiona

DE1-SoC Board

Microsoft Word - 1-차우창.doc

歯기구학

슬라이드 1

슬라이드 1

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 프레젠테이션


00 SPH-V6900_....

Microsoft Word - Installation and User Manual_CMD V2.2_.doc

Chapter 1

중간고사

(SW3704) Gingerbread Source Build & Working Guide

PowerPoint 프레젠테이션

chap 5: Trees

<353420B1C7B9CCB6F52DC1F5B0ADC7F6BDC7C0BB20C0CCBFEBC7D120BEC6B5BFB1B3C0B0C7C1B7CEB1D7B7A52E687770>

컴파일러

歯9장.PDF

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

03장.스택.key

thesis

Microsoft PowerPoint - lecture2-opengl.ppt

chap8.PDF

Microsoft Word - cg09-final-answer.doc

C++-¿Ïº®Çؼ³10Àå

Open GL

Structure and Interpretation of Computer Programs: Assignment 3 Seung-Hoon Na October 4, George (아래 3개의 문제에 대한 구현이 모두 포함된 george.rkt파일을 제출하시오.

Microsoft PowerPoint APUE(Intro).ppt

Interstage5 SOAP서비스 설정 가이드

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

untitled

Solaris Express Developer Edition

BMP 파일 처리

UI TASK & KEY EVENT

PowerPoint 프레젠테이션

chap x: G입력

Microsoft PowerPoint - 13prac.pptx

Deok9_Exploit Technique

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

歯이시홍).PDF

PowerPoint 프레젠테이션

DocsPin_Korean.pages

Modern Javascript

K&R2 Reference Manual 번역본

PowerPoint 프레젠테이션

Transcription:

Input and Interaction

3.1 Interaction

Input 기능의처리 input : 사용자와의대화 O/S 와밀접한관계 문제점 : portability 에심각한장애 MS Windows 용으로작성하면, 거기서만작동 OpenGL approach OpenGL 은 portability 를중시 input 은 OpenGL 기능에서되도록제거 GLUT : 기본적인 input 기능을제공 portability 보장 X window, MS window, Macintosh 에서공통적인기능만제공 2

3.2 Input Devices

Physical device & Logical device input device를보는 2가지관점 physical device : hardware 관점에서 logical device : user / programmer가보는관점 C program 에서의예제 user logical device printf( ) program hardware physical device printer terminal disk file 4

Physical Input Devices primary types of physical devices pointing device : 2D / 3D 좌표를 return relative-positioning : mouse, track ball absolute-positioning : tablet 3D : space ball variable-sensitivity : joystick keyboard device : string 처리 5

Logical Devices 표준분류 :six classes of logical devices string 문자열 (character string) locator 하나의좌표 pick 여러개중에서고르기 choice 선택사항들중에서고르기 (menu) dial 숫자하나 (= valuator) stroke 연속된좌표들 widget : a graphical interactive device window system 에서제공하는 menu, button, logical device 들을 software 로구현한예제들 6

Measure and Trigger input device 의처리단계 measure : program 에 return 할값을측정 trigger : 현재의값을 program 에 return mouse click mouse 좌표 (x, y) input modes : input device 작동방법 measure / trigger 의작동방법에따라 request mode sample mode event mode 7

Input Modes request mode program 에서요청 (request) 하면, measure & trigger mouse click mouse 좌표 (x, y) sample mode program에서직접 measure trigger 는필요없음 mouse 좌표 (x, y) 8

Input Modes event mode 사용자가 program flow 를 control 하는경우에는 request / sample 로는어려움 사용자가 action을할때마다 event queue 에등록 program 은 event queue 에서하나씩처리 새로운 event? mouse click mouse 좌표 (x, y) 첫번째좌표부터처리 callback function : 특정 event 를처리하도록등록 9

3.3 Clients and Servers

Client-Server Model network, multi-user 환경의산물 client : 어떤일을요청하기만한다 server : 실제로그일을수행한다 print server (networked printer) print client (PC, workstation) 11

Client-Server Model in Graphics X window system 에서시초 graphics server : graphics output / input service 제공 raster display + keyboard + mouse graphics client (display 요청 ) graphics server (display 실행 ) 12

Client-Server Model in Graphics 현재의 graphics 환경 (OpenGL 포함 ) application program : client 로작동 OpenGL server : server 역할 1대의 computer 가 server, client 모두수행가능 graphics client (OpenGL application #1) network graphics client (OpenGL application #2) internal communication (IPC) graphics server (OpenGL server) 13

3.4 Display Lists

Display List 의유래 DPU model display processor display list 에저장된내용을반복해서 display host 에서는한번만저장하면된다 한번저장 반복 display 15

Display List 현재의환경 : DPU model 은사라짐 server : frame buffer + GPU model client : application program immediate mode 단순출력만제공 화면을반복해서그려야한다 retained mode object 정의를 display list 에저장 GPU 가반복해서 display display list object 정의를저장하는, GPU 용의 memory video card 내의 RAM 에위치 16

Display List frame buffer + GPU model application program GPU memory 일부에 display list 저장 17

Display List in OpenGL display list 의설정 #define BOX 1 glnewlist(box, GL_COMPLLE); glbegin(gl_polygon); glvertex2f( 1.0, 1.0); glvertex2f( 1.0, 1.0); glvertex2f( 1.0, 1.0); glvertex2f( 1.0, 1.0); glend( ); glendlist( ); 18

Display List in OpenGL display list 의사용 glmatrixmode(gl_projection); for (i = 1; i < 5; i++) { glloadidentity( ); gluortho2d( 2.0 * i, 2.0 * i, 2.0 * i, 2.0 * i); glcolor3f(i / 5.0, i / 5.0, i / 5.0); glcalllist(box); } 19

Attribute 의저장, 복원 display list 내에서 attribute, matrix 가바뀔수있다. glcalllist( ) 전에 save, 나중에 restore 필요 해결책 glpushattribute(gl_all_attrib_bits); glpushmatrix( ); // matrix, attribute 변경가능 glcalllist(box); glpopmatrix( ); glpopattribute( ); 20

Example: Stroke Fonts stoke font 를작성한다. void OurFont(char ch) { switch (ch) { case a : gltranslate(0.5, 0.5, 0.0); // move to center glbegin(gl_quad_strip); break; for (i = 0; i <= 12; i++) { case A : angle = (2 * M_PI / 12) * i; glvertex2f(0.4 * cos(angle), 0.4 * sin(angle)); case O : glvertex2f(0.5 * cos(angle), 0.5 * sin(angle)); } glend( ); } gltranslate(0.5, -0.5, 0.0); // move to next } break; 21

Example: Stroke Fonts display list 256 개를동시에만든다. GLuint base = glgenlists(256); for (int i = 0; i < 256; i++) { glnewlist(base + i, GL_COMPILE); OurFont(i); glendlist( ); } glgenlists(glsizei range) : display list 를 range 개만큼미리확보 [base.. base + range 1] 22

Example: Stroke Fonts display list 를한꺼번에사용한다. char* text_string = Hello, World! ; gllistbase(base); glcalllists(strlen(text_string), GL_BYTE, text_string); text_string 의길이만큼, 반복해서 glcalllist( ) 수행 아래와같은의미 for (int i = 0; i < strlen(text_string); i++) { glcalllist(base + text_string[i]); } 23

Fonts in GLUT void glutstrokecharacter(void* font, int character); 글자하나를출력 int glutstrokewidth(void* font, int character); 해당글자의폭을 return font == GLUT_STROKE_ROMAN proportionally spaced Roman (times-roman) font == GLUT_STROKE_MONO_ROMAN mono-spaced Roman ( 모두같은폭 ) 24

Fonts in GLUT void glutbitmapcharacter(void* font, int character); int glutbitmapwidth(void* font, int character); font : GLUT_BITMAP_8_BY_13, GLUT_BITMAP_9_BY_15, example glrasterpos2i(rx, ry); glutbitmapcharacter(glut_bitmap_8_by_13, k); rx += glutbitmapwidth(glut_bitmap_8_by_13, k); 25

glrasterpos*( ) world coordinate 를주고, 해당되는 raster position 으로이동 glrasterpos3f(x, y, z); (x, y, z) raster position A OpenGL window camera position 26

3.5 Programming Event-Driven Input

Event-driven Program Model event : program 에서발생할수있는모든상황 main loop : 필요한 event 를처리하는무한 loop callback : 해당 event 발생시, 처리할함수 event 발생 callback 함수정의 callback 함수등록 (2) main loop if (event? ) { call CallBack } (3) (5) (1) callback list mycallback (4) callback 함수가처리 28

GLUT event model 기본철학 모든 window system 에서공통인 event 만처리 pointing device events (mouse events) motion event (button downed) passive motion evnet (button released) mouse event (button press / release) passive motion event mouse event (button pressed) motion event mouse event (button released) passive motion event 29

Pointing Device Events callback 형태 void mousecallback(int button, int state, int x, int y) { } if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) exit(0); void motioncallback(int x, int y) { } 등록하기 void glutmousefunc(mousecallback); void glutmotionfunc(motioncallback); void glutpassivemotionfunc(motioncallback); 30

Keyboard Event keyboard 의키를누르는순간 event 발생 callback 형태 void keyboardcallback(unsigned char key, int x, int y) { // mouse 가 (x, y) 에있는상황에서 key 누름 } int glutgetmodifiers(void); keyboard event 시의 modifier 상황 Shift, Ctrl, Alt 키가눌려졌나? 등록하기 void glutkeyboardfunc(keyboardcallback); 31

Reshape Event window 의크기가변했을때 callback 형태 보통, 화면을새로그려야함 void reshapecallback(int width, int height) { // window size is changed to width height } 등록하기 void glutreshapefunc(reshapecallback); 32

Display Event window 를새로그려야할필요가있을때 event 발생 예 : window 가처음화면에뜨는순간, 가려졌던 window 가위로올라오는순간, void glutpostredisplay(void); 강제로 display event 발생 callback 형태 void displaycallback(void) { } 등록하기 void glutdisplayfunc(displaycallback); 33

Main Loop, Idle Callback void glutmainloop(void); 무한 loop 상황에서 event 처리 callback 중의하나가 exit( ) 를해야함! idle callback : 처리할 event 가없는경우에 call void idlecallback(void); 등록하기 void glutidlefunc(idlecallback); 주의 : 빠른시간내로처리가끝나야한다. 34

Main 함수의예 int main(int argc, char* argv) { glutinit(&argc, argv); glutinitdisplaymode(glut_single GLUT_RGB); glutcreatewindow( Sqaure ); myinit( ); glutreshapefunc(myreshape); glutmousefunc(mouse); glutdisplayfunc(display); glutmainloop( ); } 35

Multi-window 환경 int glutcreatewindow(char* name); 새로운 window 1 개를생성 void glutsetwindow(int id); 지금부터출력에사용될 window 를지정 int glutgetwindow(void); 지금출력중인 window 를 return callback 에서는? glutgetwindow( ) 로각 window 마다다른일가능! 36

3.6 Menus

GUI 개발 GUI : graphical user interface toolkit : UI 용도구모음 widget : visually appealing and effective graphical devices 실제로는 GUI 용의조그만 unit GLUT : GUI 에취약함 : slide why? window system 과분리 해결책 : 1. mouse event 로직접구현 2. pop-up menus 38

GLUT Pop-up Menus void menucallback(int id) { if (id == 1) exit(0); else if (id == 2) size *= 2; else if (id == 3) size /= 2; glutpostredisplay( ); } int glutcreatemenu(menucallback); pop-up menu 를생성 39

GLUT Pop-up Menus void glutaddmenuentry(char* label, int value); 현재 pop-up menu에 entry 첨가 화면표시는 label callback 에들어가는값은 value void glutaddsubmenu(char* label, int submenu); menu 에 submenu 첨가 void glutattachmenu(int button); button = GLUT_{LEFT,MIDDLE,RIGHT}_BUTTON 현재 pop-up menu를마우스버튼에연결 40

Example Menu sub_menu = glutcreatemenu(menucallback); glutaddmenuentry( increase, 2); glutaddmenuentry( decrease, 3); glutcreatemenu(menucallback); glutaddmenuentry( quit, 1); glutaddsubmenu( resize, sub_menu); glutattachmenu(glut_right_button); quit resize sub_menu increase decrease 41

3.7 Picking

Picking an input operation that allows the user to identify an object on the display mouse click 시에, 어느 object 인지찾는방법 상당히까다롭다 3D world coordinates (x, y, z) 3D world coordinates (x, y, z) 1. 2D 3D mapping 방법? 2. 여러개중의어느 object? mouse click : 2D device coordinate (x, y) 43

Picking 해결책 2D 3D mapping 방법 camera setting 에서계산한다! chap 4 에서 mapping 계산식이나온다 여러개중의어느 object bounding rectangle 사용 제일앞에오는것을고른다 bounding rectangle 이안에들어와야 click 될가능성이있다. 44

3.8 A Simple Paint Program

A Simple Paint Program 간단한 CAD 프로그램 2D-based : picking 문제를피한다 위쪽 : 그림그리기위한 icon 들 46

A Simple Paint Program menu 구조 왼쪽 button : 그림을그린다 가운데, 오른쪽 button : menu 할당 47

A Simple Paint Program 자세한프로그램은교재참고 OpenGL function, GLUT function 은 manual 참고 RTFM : Read The Fine Manual 48

3.9 Animating Interactive Programs

Rotating Square 2차원평면상에서, 각도θ 에따라, 정사각형돌리기 정해진θ 에대응되는정사각형그리기? display callback θ를어떻게증가시킬것인가? idle callback (ww, wh) ( sin θ, cos θ) (cos θ, sin θ) center point : (ww/2, wh/2) ( cos θ, sin θ) (sin θ, cos θ) (0,0) 50

Rotating Square init function int ww = 400; /* window width */ int wh = 400; /* window height */ void myinit(void) { glviewport(0, 0, ww, wh); glmatrixmode(gl_projection); glloadidentity(); glortho(0.0, (GLdouble)ww, 0.0, (GLdouble)wh, -1.0, 1.0); glclearcolor(0.0, 0.0, 0.0, 1.0); glclear(gl_color_buffer_bit); glflush(); } 51

Rotating Square display function : 교재의수식은일부틀렸음! int radius = 150; double theta = 0.0; /* in degree */ void display(void) { double radian = theta * 2 * 3.141592 / 360.0; /* in radian */ glclear(gl_color_buffer_bit); glbegin(gl_polygon); glvertex2f(ww / 2 + radius * cos(radian), wh / 2 + radius * sin(radian)); glvertex2f(ww / 2 + radius * -sin(radian), wh / 2 + radius * cos(radian)); glvertex2f(ww / 2 + radius * -cos(radian), wh / 2 + radius * -sin(radian)); glvertex2f(ww / 2 + radius * sin(radian), wh / 2 + radius * -cos(radian)); glend(); glflush(); } 52

Rotating Square idle function #include <time.h> void usleep(clock_t wait) { /* UNIX system 에서는불필요 */ clock_t goal; goal = wait + clock(); while (goal > clock()) ; } void idle(void) { usleep(10); theta += 2.0; if (theta >= 360.0) theta = 360.0; glutpostredisplay(); } 53

Rotating Square mouse callback left button : animation 작동 right button : animation 중지 void mouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) glutidlefunc(idle); if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) glutidlefunc(null); } 54

Rotating Square main function #include <stdlib.h> #include <GL/glut.h> int main(int argc, char** argv) { glutinit(&argc,argv); glutinitdisplaymode (GLUT_SINGLE GLUT_RGB); glutinitwindowsize(ww, wh); glutcreatewindow("rotate"); myinit( ); glutdisplayfunc(display); glutmousefunc (mouse); glutmainloop( ); } 55

Double Buffering animation program 의문제점 화면이깜빡일수있다. 왜? 각 frame 을완전히그리기전에화면에그려야되는상황이생겼다. 해결책 : double buffering 2 개의 buffer 에서교대로그림 front buffer : 화면에현재나오는그림 back buffer : 화면에나오지않는버퍼새로운그림은여기에그린다. 56

Double Buffering 설정하기 glutinitdisplaymode(glut_rgb GLUT_DOUBLE); 실제사용 front buffer front buffer glutswapbuffers( ); back buffer back buffer 그리기 그리기 57

3.10 Design of Interactive Programs

HCI good interactive programs smooth display : no flicker variety of interactive devices variety of methods for entering/displaying information easy-to-use interface feedback to the user tolerance for user errors consideration of the human factor 해결책 : HCI (human-computer interaction) 새로운학문분야 59

GUI 를위한지원책 현재는 H/W 로주로해결 overlay 기능 : pop-up menu 가지우는부분을자동복구 rubber-banding : 마우스이동에따라자동추적 60

Assignment #1 오목을둘수있는 graphics 환경을 implement 하라. 9 9 크기의바둑판이화면에떠야한다. 왼쪽마우스버튼을누를때마다바둑돌이검정 / 흰색으로교대로놓인다. 바둑돌은바둑판의정확한위치에놓여야한다. 이미바둑돌이놓인곳에놓으려고하면, 무시하고다른위치에놓을때까지기다린다. 누가이겼는지 check 할필요는없다. 오른쪽마우스버튼을누르면, quit ( 종료 ), reset ( 처음부터다시시작 ) 기능을위한 pop-up menu 가떠야한다. 61