Implement of Input and Interaction

Slides:



Advertisements
Similar presentations
2 장 Initial Steps in Drawing Figures 창원대학교 정보통신공학과 박동규.
Advertisements

Chapter 3. 뷰잉(Viewing).
제6장 조건문.
Vision System Lab, Sang-Hun Han
2.1 The Sierpinski Gasket.
OpenGL 실습 12 로봇.
OpenGL Programming (III) 1. Drawing in 3D 2. Manipulating 3D Space
학습목표 5장. 오픈지엘 기본틀 논리적 입력장치를 설정하는 이유와 종류를 이해한다. 세 가지 입력모드의 차이점을 이해한다.
2016 ITA 1월 강의 C Programming -4일차- 포인터배열 및 이중포인터 정대진 ( )
C++ Espresso 제1장 기초 사항.
GTK+ 프로그래밍 (2) SNSLAB 발표 : 문동규.
OpenGL 실습 1주차.
OpenGL 시작하기.
HTML과 CGI 프로그래밍 PHP 웹 프로그래밍 (PHP Web Programming) 문양세
블렌딩 안티앨리어싱, 안개효과 그리고 폴리곤 오프셋
Lecture #7 제 4 장. 기하학적 객체와 변환 (2).
4장 기하학적 객체와 변환 – OpenGL 변환 학습목표 OpenGL 에서 어떻게 변환을 수행하는지 OpenGL 행렬모드 회전
Chapter 5. 라이팅(Lighting)
7장 디스플레이 리스트.
홈페이지 자동 구축 솔루션 K2 Web WIZARD 2.6 관리자 메뉴얼
축산 인식개선을 위한 농협의 추진 사례 ( ) 농협중앙회 축산지원단장 박인희.
Practice - texture mapping
01. Index StarPlayer API Guide 01. Index 02. 상수값 정의 03. API 정의
선 택 과 피 드 백.
Signal & Inter-Process Communication
1장 – 그래픽스 시스템과 모델 2장 – 그래픽스 프로그래밍 3장 – 입력과 상호작용 4장 – 기하학적 객체와 변환 5장 관측
학습목표 7장. 투상변환과 뷰포트변환 평행투상과 원근투상의 차이점을 이해한다. 가시부피 설정방식을 이해한다.
학습목표 7장. 투상변환과 뷰포트변환 평행투상과 원근투상의 차이점을 이해한다. 가시부피 설정방식을 이해한다.
이 름: 정홍도 (과장) 팀 명: 개발사업팀 일 자:
Department of Computer Engineering
OpenGL Programming (II) 3D Graphics Fundamentals
제 12장 I/O멀티플렉싱(Multiplexing)
Sang Il Park Sejong University
자료구조 김현성.
Department of Computer Engineering
아두이노 프로그래밍 2일차 – Part4 아날로그 키패드 활용하기 강사: 김영준 목원대학교 겸임교수.
4. OpenGL 상태들과 기본 도형들.
학습목표 5장. 오픈지엘 기본틀 논리적 입력장치를 설정하는 이유와 종류를 이해한다. 세 가지 입력모드의 차이점을 이해한다.
1장 그래픽스 시스템과 모델-이미지 형성, 모델, 구조
Hanyang University Jungsik Park
OpenGL PROJECT 우광식 성기영 서창수 이인주.
5장. 오픈지엘 기본틀 학습목표 논리적 입력장치를 설정하는 이유와 종류를 이해한다. 세 가지 입력모드의 차이점을 이해한다.
버퍼 (Buffer).
Computer Graphics OpenGL 설치 및 설정
Signal & Inter-Process Communication
핸드폰 시뮬레이션 김 형 도 송 미 경.
광원 제어 하기.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
Draw the basic Geometry Objects
Web & Internet [06] CSS3 응용과 레이아웃
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
Chapter 4 컬러( COLOR ).
제어문 & 반복문 C스터디 2주차.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
OpenGL Introduction 컴퓨터 그래픽스 김 창 헌.
OpenGL 프로젝트 김병욱 김상진 김성환.
3D Shapes 3개 핵심 Properties가 존재 1.Material 표면의 재질을 설정합니다.
Department of Computer Engineering
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
반복문의 기능 반복문 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 while문
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
2장 선과 글자 모양에 따른 분류 제품 제작을 하기 위한 도면에는 제품의 정보인 형상, 치수,
argc, argv 의 사용방법 #include <stdio.h>
“전자구매” 메뉴 접속을 위해 “전자입찰” 메뉴에서 공인인증서 등록
Signal & Inter-Process Communication
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
C.
Choi Younghwan CSE HUFS
PHP 기초문법 PHP를 공부하는데 있어 가장 기초가 되는 PHP기초문법에 대해서 배워 봅니다.
Presentation transcript:

Implement of Input and Interaction Hanyang University

Objective Viewport and Ortho Callback Programming Reshape Callback Keyboard Callback SpecialKey Callback Mouse Callback Menu Callback

Viewport and ortho glViewport 윈도우 상에서 그림이 그려질 영역을 설정한다. glViewport(GLint x, GLint y, GLsizei width, GLsizei height); x : 영역의 좌 하단 x 좌표 y : 영역의 우 하단 y 좌표 width : 영역의 너비 height : 영역의 높이 EX ) … glutInitWindowSize(400, 300); glViewport(100, 80, 160, 100); Viewport 400 (window width) 300 (window height) 원점 y = 80 x = 100 width = 160 height = 100

3차원의 OpenGL 공간을 2차원의 윈도우에 어떻게 투영할 것인가? 가시부피 설정 glOrtho( 직교투영(PROJECTION) 함수 3차원의 OpenGL 공간을 2차원의 윈도우에 어떻게 투영할 것인가? 가시부피 설정 glOrtho( GLdouble left, GLdouble right, // x축 범위 GLdouble bottom, GLdouble top, // y축 범위 GLdouble near, GLdouble far // z축 범위 ); Default 설정 glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); (right, top, far) (left, bottom, near) view

Example source #include <gl/glut.h> void MyDisplay() { glClear(GL_COLOR_BUFFER_BIT); glViewport(100, 100, 200, 200); glBegin(GL_QUADS); // 그리기 색 (Red, Green, Blue) (적색) glColor3f(1.0, 0.0, 0.0); glVertex3f(0, 0, 0.0); glVertex3f(640, 0, 0.0); glVertex3f(640, 480, 0.0); glVertex3f(0, 480, 0.0); // 그리기 색 (Red, Green, Blue) (회색) glColor3f(0.5, 0.5, 0.5); glVertex3f(160, 120, 0.0); glVertex3f(480, 120, 0.0); glVertex3f(480, 360, 0.0); glVertex3f(160, 360, 0.0); glEnd(); glFlush(); } int main(int argc, char** argv) { glutInitDisplayMode(GLUT_RGB); glutInitWindowSize(640, 480); // 윈도우창 크기 설정 (width, height) glutInitWindowPosition(0, 0); // 윈도창의 시작 위치 (x, y) glutCreateWindow("OpenGL Drawing Example"); // 윈도우 바탕 색 (Red, Green, Blue, Alpha) (흰색) glClearColor(1.0, 1.0, 1.0, 1.0); // Ortho 설정을 위해서는 다음 두 함수가 선행 되어져야 함. glMatrixMode(GL_PROJECTION); // 투영좌표계설정 glLoadIdentity(); //좌표계초기화 glOrtho(0.0, 640.0, 0.0, 480.0, -1.0, 1.0); glutDisplayFunc(MyDisplay); glutMainLoop(); return 0; }

Reshape Callback 윈도우의 크기나 모양이 바뀔 때 GLUT가 호출하는 콜백 함수를 등록 void glutReshapeFunc(void(*func)(int width, int height)); width : 윈도우의 새로운 너비 height : 윈도우의 새로운 높이 //reshape 콜백 함수 선언 void MyReshapde(int NewWidth, int NewHeight) { … } int main(int argc, char** argv) glutReshapeFunc(MyReshapde); //reshape 콜백 함수 등록

Example Source #include <gl/glut.h> void MyDisplay() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.5, 0.5, 0.5); glBegin(GL_POLYGON); glVertex3f(-0.5, -0.5, 0.0); glVertex3f(0.5, -0.5, 0.0); glVertex3f(0.5, 0.5, 0.0); glVertex3f(-0.5, 0.5, 0.0); glEnd(); glFlush(); } void MyReshapde(int NewWidth, int NewHeight) glViewport(0, 0, NewWidth, NewHeight); //뷰포트 크기를 변경된 윈도우 크기와 일치 시킨다. GLfloat WidthFactor = (GLfloat)NewWidth / (GLfloat)300; GLfloat HeightFactor = (GLfloat)NewHeight / (GLfloat)300; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1.0 * WidthFactor , 1.0 * WidthFactor, -1.0 * HeightFactor, 1.0 * HeightFactor, -1.0, 1.0); int main(int argc, char** argv) glutInitWindowSize(300, 300); glutCreateWindow("OpenGL Drawing Example"); glClearColor(1.0, 1.0, 1.0, 1.0); glutDisplayFunc(MyDisplay); glutReshapeFunc(MyReshapde); glutMainLoop(); return 0;

Keyboard Callback 키보드 입력이 일어날 때마다 GLUT가 호출하는 콜백 함수를 등록 void glutKeyboardFunc(void(*func)(unsigned char key, int x, int y)); key : 키보드의 눌려진 키 x : 마우스의 x 좌표 y : 마우스의 y 좌표 //키보드 콜백 함수 선언 void MyKeyboard(unsigned char KeyPressed, int X, int Y) { … } int main(int argc, char** argv) glutKeyboardFunc(MyKeyboard); //키보드 콜백 함수 등록

Example Source #include <gl/glut.h> void MyDisplay() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.5, 0.5, 0.5); glBegin(GL_POLYGON); glVertex3f(-0.5, -0.5, 0.0); glVertex3f(0.5, -0.5, 0.0); glVertex3f(0.5, 0.5, 0.0); glVertex3f(-0.5, 0.5, 0.0); glEnd(); glFlush(); } void MyKeyboard(unsigned char KeyPressed, int X, int Y) switch(KeyPressed) case 'Q' : exit(0); break; case 'q' : exit(0); break; case 27 : exit(0); break; // ESC 키 int main(int argc, char** argv) glutInitWindowSize(300, 300); glutCreateWindow("OpenGL Drawing Example"); glClearColor(1.0, 1.0, 1.0, 1.0); glutDisplayFunc(MyDisplay); glutKeyboardFunc(MyKeyboard); glutMainLoop(); return 0;

SpecialKey Callback 특수키 입력이 일어날 때마다 GLUT가 호출하는 콜백 함수를 등록 기능키(F1~F12), 방향키, insert, home, end, page up, page down void glutSpecialFunc(void(*func)(int key, int x, int y)); key : 키보드의 눌려진 특수키 x : 마우스의 x 좌표 y : 마우스의 y 좌표 사용법은 keyboard callback과 비슷함.

SpecialKey Callback 기능키 값 방향키 값 그 외 GLUT_KEY_F1 ~ GLUT_KEY_F12 GLUT_KEY_LEFT GLUT_KEY_UP GLUT_KEY_RIGHT GLUT_KEY_DOWN 그 외 GLUT_KEY_PAGE_UP GLUT_KEY_PAGE_DOWN GLUT_KEY_HOME GLUT_KEY_END GLUT_KEY_INSERT //특수키 콜백 함수 선언 void MySpecialKey(int KeyPressed, int X, int Y) { ... switch (KeyPressed) case GLUT_KEY_LEFT: } int main(int argc, char** argv) … glutSpecialFunc(MySpecialKey); //특수키 콜백 함수 등록

Mouse Callback(click) 마우스 이벤트가 발생할 때마다 GLUT가 호출하는 마우스 클릭 콜백 함수를 등록 void glutMouseFunc(void(*func)(int button, int state, int x, int y)); button : 버튼의 종류를 뜻하는 상수값 버튼의 종류 : GLUT_LEFT_BUTTON GLUT_RIGHT_BUTTON GLUT_MIDDLE_BUTTON State : 해당 버튼이 눌러진 상태인지 아닌지를 알려주는 상수값 버튼의 상태 : GLUT_DOWN, GLUT_UP x : 마우스의 x좌표 y : 마우스의 y좌표

Mouse Callback(click) 마우스 클릭 콜백 함수 등록 //마우스 클릭 콜백 함수 선언 void MyMouseClick(GLint Button, GLint State, GLint X, GLint Y) { if(Button == GLUT_LEFT_BUTTON && State == GLUT_DOWN) … } int main(int argc, char** argv) glutMouseFunc(MyMouseClick); //마우스 클릭 콜백 함수 등록

Mouse Callback(motion) 버튼을 누른 상태에서 마우스를 움직일 때 호출되는 마우스 움직임 콜백 함수를 등록 void glutMotionFunc(void(*func)(int x, int y)); x : 마우스의 x 좌표 y : 마우스의 y 좌표 //마우스 움직임 콜백 함수 선언 void MyMouseMove(GLint X, GLint Y) { … } int main(int argc, char** argv) glutMotionFunc(MyMouseMove); //마우스 움직임 콜백 함수 등록

Example Source 마우스 왼클릭 후 드래그한 영역에 사각형을 그리는 예제 #include <gl/glut.h> GLint TopLeftX, TopLeftY, BottomRightX, BottomRightY; void MyDisplay() { glViewport(0, 0, 300, 300); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.5, 0.5, 0.5); glBegin(GL_POLYGON); glVertex3f(TopLeftX / 300.0, (300 - TopLeftY) / 300.0, 0.0); glVertex3f(TopLeftX / 300.0, (300 - BottomRightY) / 300.0, 0.0); glVertex3f(BottomRightX / 300.0, (300 - BottomRightY) / 300.0, 0.0); glVertex3f(BottomRightX / 300.0, (300 - TopLeftY) / 300.0, 0.0); glEnd(); glFlush(); } 마우스 왼클릭 후 드래그한 영역에 사각형을 그리는 예제

void MyMouseClick(GLint Button, GLint State, GLint X, GLint Y) { if(Button == GLUT_LEFT_BUTTON && State == GLUT_DOWN) TopLeftX = X; TopLeftY = Y; } void MyMouseMove(GLint X, GLint Y) BottomRightX = X; BottomRightY = Y; glutPostRedisplay(); // 그림을 새로 그려줌 int main(int argc, char** argv) glutInitWindowSize(300, 300); glutCreateWindow("OpenGL Drawing Example"); glClearColor(1.0, 1.0, 1.0, 1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); glutDisplayFunc(MyDisplay); glutMouseFunc(MyMouseClick); glutMotionFunc(MyMouseMove); glutMainLoop(); return 0;

glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); => => <= 좌표변환 필요 : Window 좌표계를 OpenGL좌표계로 매핑시킨다. 윈도우 x좌표에서 OpenGL x좌표로 변환 = 윈도우 X좌표 / 300 윈도우 y좌표에서 OpenGL y좌표로 변환 = (300 - 윈도우 Y좌표) / 300 v1x = TopLeftX / 300; v1y = (300 - TopLeftY) / 300; v2x = TopLeftX / 300; v2y = (300 - BottomRightY) / 300; v3x = BottomRightX / 300; v3y = (300 - BottomRightY) / 300; v4x = BottomRightX / 300; v4y = (300 - TopLeftY) / 300;

Menu Callback 메뉴 선택시 호출되는 메뉴 콜백 함수를 등록하는 함수 - int glutCreateMenu(void(*func)(int value)); 리턴값 : 해당 메뉴의 고유 아이디값 value : 엔트리 아이디 값 void MyMainMenu(int entryID) { if(entryID == 1) … else if(entryID == 2) } int main(int argc, char** argv) GLint MyMainMenuID = glutCreateMenu(MyMainMenu);

Menu Callback Id에 해당하는 메뉴를 이용한다. - int glutSetMenu(int id) id : glutCreateMenu()에 리턴되는 값 void MyMainMenu1(int entryID) { … } void MyMainMenu2(int entryID) int main(int argc, char** argv) GLint MyMainMenuID1 = glutCreateMenu(MyMainMenu1); GLint MyMainMenuID2 = glutCreateMenu(MyMainMenu2); glutSetMenu(MyMainMenuID2);

Menu Callback 메뉴 항목을 추가한다. - int glutAddMenuEntry(char *name, int value); name : 항목의 이름 value : 해당 항목이 선택될 때 메뉴 콜백함수에게 전달되는 정수값 void MyMainMenu(int entryID) { if(entryID == 1) … //Draw Sphere 선택 else if(entryID == 2) … //Draw Torus 선택 } int main(int argc, char** argv) … GLint MyMainMenuID = glutCreateMenu(MyMainMenu); glutAddMenuEntry(“Draw Sphere”, 1); glutAddMenuEntry(“Draw Torus”, 2);

Menu Callback 지정한 마우스 버튼에 메뉴가 적용된다. - int glutAttachMenu(int button); GLUT_LEFT_BUTTON : 마우스 왼쪽 버튼 GLUT_RIGHT_BUTTON : 마우스 오른쪽 버튼 GLUT_MIDDLE_BUTTON : 마우스 가운데 버튼 int main(int argc, char** argv) { … GLint MyMainMenuID = glutCreateMenu(MyMainMenu); glutAttachMenu(GLUT_RIGHT_BUTTON); }

Menu Callback 서브 메뉴가 있는 메뉴를 추가한다 - int glutAddSubMenu(char *name, int menu); name : 서브 메뉴 항목의 이름 menu : glutCreateMenu()에 의해 해당 서브메뉴를 만들 때 리턴된 메뉴 아이디 값 void MySubMenu(int entryID) { } int main(int argc, char** argv) … GLint MySubMenuID= glutCreateMenu(MySubMenu); glutAddSubMenu("Change Size", MySubMenuID);

Example Source #include <gl/glut.h> GLboolean IsSphere = true; GLboolean IsSmall = true; void MyDisplay() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.5, 0.5, 0.5); if((IsSphere) && (IsSmall)) glutWireSphere(0.2, 15, 15); // 작은 Wire(선으로 이루어진) Sphere(구(球)) else if((IsSphere) && (!IsSmall)) glutWireSphere(0.4, 15, 15); // 큰 Sphere else if((!IsSphere) && (IsSmall)) glutWireTorus(0.1, 0.3, 40, 20); // 작은 Wire Torus(도넛형 고리) else glutWireTorus(0.2, 0.5, 40, 20); // 큰 Torus glFlush(); } void MyMainMenu(int entryID) if(entryID == 1) IsSphere = true; // Draw Sphere 선택 else if(entryID == 2) IsSphere = false; // Draw Torus 선택 else if(entryID == 3) exit(0); // Exit 선택 glutPostRedisplay();

void MySubMenu(int entryID) { if(entryID == 1) IsSmall = true; //Small One선택 else if(entryID == 2) IsSmall = false; //Big One선택 glutPostRedisplay(); } int main(int argc, char** argv) glutInitWindowSize(300, 300); glutCreateWindow("OpenGL Drawing Example"); glClearColor(1.0, 1.0, 1.0, 1.0); GLint MySubMenuID = glutCreateMenu(MySubMenu); //서브 메뉴 등록 glutAddMenuEntry("Small One", 1); glutAddMenuEntry("Big One", 2); GLint MyMainMenuID = glutCreateMenu(MyMainMenu); //메인 메뉴 등록 glutAddMenuEntry("Draw Sphere", 1); glutAddMenuEntry("Draw Torus", 2); glutAddSubMenu("Change Size", MySubMenuID); glutAddMenuEntry("Exit", 3); glutAttachMenu(GLUT_RIGHT_BUTTON); glutDisplayFunc(MyDisplay); glutMainLoop(); return 0;