슬라이드 1

Similar documents
슬라이드 1

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

슬라이드 1

슬라이드 1

슬라이드 1

(Microsoft PowerPoint - \301\24613\260\255 - oFusion \276\300 \261\270\274\272)

슬라이드 1

슬라이드 1

슬라이드 1

<4D F736F F F696E74202D20C1A63137B0AD202D20C1F6C7FCC3E6B5B9C3B3B8AE>

<4D F736F F F696E74202D20C1A63134B0AD202D20BBE7BFF8BCF6BFCD20C8B8C0FC>

<4D F736F F F696E74202D20C1A63037B0AD202D20B1A4BFF8B0FA20B1D7B8B2C0DA>

(Microsoft PowerPoint - \301\24615\260\255 - \303\346\265\271\303\263\270\256)

슬라이드 1

10장.key

슬라이드 1

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

<4D F736F F F696E74202D20C1A63130B0AD202D20C1F6C7FCB0FA20C7CFB4C3C0C720B7BBB4F5B8B5>

Open GL

슬라이드 1

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

(Microsoft PowerPoint - \301\24608\260\255 - \261\244\277\370\260\372 \300\347\301\372)

슬라이드 1

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

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

Microsoft PowerPoint - IP11.pptx

PowerPoint 프레젠테이션

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

UI TASK & KEY EVENT

JUNIT 실습및발표

UI TASK & KEY EVENT

쉽게 풀어쓴 C 프로그래밍

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

Lab 3. 실습문제 (Single linked list)_해답.hwp

<353120C0CCB8E9C0E72D4E504320C0CEB0F820C1F6B4C9C0BB20C0A7C7D120B9ABB8AEC1FEB1E220B1B8C7F62E687770>

쉽게 풀어쓴 C 프로그래밍

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

PowerPoint Presentation

Microsoft PowerPoint - 06-Chapter09-Event.ppt

PowerPoint Presentation

Microsoft PowerPoint - lecture11-ch5.ppt [호환 모드]

Chapter #01 Subject

chap 5: Trees

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

PowerPoint Presentation

PowerPoint 프레젠테이션

설계란 무엇인가?

(Microsoft PowerPoint - \301\24611\260\255 - \276\326\264\317\270\336\300\314\274\307)

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - ÀÚ¹Ù08Àå-1.ppt

제11장 프로세스와 쓰레드

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

<4D F736F F F696E74202D20C1A63138C0E520C0CCBAA5C6AE20C3B3B8AE28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

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

그래픽 프로그래밍

슬라이드 1

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

제 1 장 기본 개념

PowerPoint Template

슬라이드 1

Microsoft PowerPoint - polling.pptx

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

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

Microsoft PowerPoint - Chapter 6.ppt

유니티 변수-함수.key

; 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

PowerPoint Presentation

Microsoft Word - cg12-midterm-answer

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

UI TASK & KEY EVENT

JAVA PROGRAMMING 실습 08.다형성

4장기본프로그래밍2

윈도우시스템프로그래밍

adfasdfasfdasfasfadf

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

PowerPoint Presentation

Microsoft PowerPoint - 07-Data Manipulation.pptx

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

오버라이딩 (Overriding)

Microsoft PowerPoint - Chap12-OOP.ppt

Microsoft PowerPoint - chap11-포인터의활용.pptx

K&R2 Reference Manual 번역본

PowerPoint Template

쉽게 풀어쓴 C 프로그래밍

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

Chapter 4. LISTS

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

PowerPoint Template

Microsoft PowerPoint - 14주차 강의자료

Visual C++의 개요

PowerPoint Presentation

자바로

PowerPoint Presentation

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

KNK_C_05_Pointers_Arrays_structures_summary_v02

C++ Programming

Microsoft PowerPoint - additional07.ppt [호환 모드]

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

Transcription:

핚국산업기술대학교 제 7 강카메라와뷰포트 이대현교수

학습안내 학습목표 오우거엔짂의입력처리방식을종합적으로이해한다. 오우거엔짂의카메라의활용방법및뷰포트의활용방법을이해하고다양한방식으로게임화면을구성해본다. 학습내용 오우거엔짂의입력처리방식. 키입력밎마우스입력리스너인터페이스. 카메라의이동및회전. 시야절두체컬링의이해. 뷰포트를이용한 PIP의구현.

오우거엔진의입력처리방식 무버퍼입력 (unbuffered input) 방식 일종의폴링 (polling). 프레임리스너에서매번입력장치의상태를캡쳐한후, 그결과에따른처리. 버퍼입력 (buffered input) 방식 일종의인터럽트방식. 이벤트의발생및이에따른처리. 키리스너, 마우스리스너등의인터페이스를사용하여처리. 키가눌리면 KeyListener::keyPressed 이벤트발생. 키가떼어지면 KeyListener::keyReleased 이벤트발생. 마우스가움직이면 MouseListener::mouseMoved 이벤트발생.

KeyListener 인터페이스 키보드의입력을처리하는인터페이스클래스 키가눌렸다떼어질때마다, 두개의이벤트 : keypressed, keyreleased 가발생. 눌린키의정보는 KeyEvent 구조체에담겨있음. class _OISExport KeyListener public: virtual ~KeyListener() virtual bool keypressed( const KeyEvent &eve ) = 0; virtual bool keyreleased( const KeyEvent &evt ) = 0; ; 처리가끝나면반드시 true 를 return 해주어야함. false 를리턴하게되면, 입력버퍼에남아있는내용을제거함.

MouseListener 인터페이스 마우스의클릭입력을처리하는인터페이스클래스 class _OISExport MouseListener public: virtual ~MouseListener() virtual bool mousemoved( const MouseEvent &evt ) = 0; 마우스버튼 ID 는 MB_Left, MB_Right, MB_Middle ; virtual bool mousepressed( const MouseEvent &evt, MouseButtonID id ) = 0; virtual bool mousereleased( const MouseEvent &evt, MouseButtonID id ) = 0; evt.state.x.rel 에는마우스 x 위치의상대좌표 ( 원래위치와의차이 ) 값. evt.state.x.abs 에는마우스 x 위치절대좌표값 ( 렌더링윈도우기준 ). evt.state.y.rel, evt.state.y.abs evt.state.z.rel, evt.state.z.abs 마우스휠정보

키리스너및마우스리스너설정 class InputController : public FrameListener, public OIS::KeyListener, public OIS::MouseListener public: InputController(Root* root, OIS::Keyboard *keyboard, OIS::Mouse *mouse) : mroot(root), mkeyboard(keyboard), mmouse(mouse) 중략 keyboard->seteventcallback(this); mouse->seteventcallback(this); 마우스및키입력콜백함수등록 중략 bool mousemoved( const OIS::MouseEvent &evt ); bool mousepressed( const OIS::MouseEvent &evt, OIS::MouseButtonID id ); bool mousereleased( const OIS::MouseEvent &evt, OIS::MouseButtonID id ); bool keypressed( const OIS::KeyEvent &evt ); bool keyreleased( const OIS::KeyEvent &evt ); 후략 ; KeyLister, MouseListener 인터페이스사용

오우거엔진의카메라 Camera 클래스 씬을담아내어, 뷰포트에연결시켜주는클래스주요멤버함수 setposition(), lookat(), yaw(), roll(), pitch() 어떤장면을여러각도에서보고싶으면? 카메라홀더 라고불리는씬노드들을여러개만들고, 필요에따라씬노드에카메라를담으면된다.

실습 CameraControl WASD 키와마우스를이용한카메라조작

카메라조작씨나리오 키보드입력 W 키이 : 카메라의상향이동 S 키이 : 카메라의하향이동 A 키이 : 카메라의왼쪽이동 D 키이 : 카메라의오른쪽이동 마우스입력 마우스좌우이동 : 카메라의좌우회전 (Yaw) 패닝 (Panning) 마우스상하이동 : 카메라의상하회전 (Pitch) 피칭 (Pitching) 마우스휠이동 : 카메라의전짂후짂 주밍 (Zooming)

class InputController class InputController : public FrameListener, public OIS::KeyListener, public OIS::MouseListener public: InputController(Root* root, OIS::Keyboard *keyboard, OIS::Mouse *mouse) : mroot(root), mkeyboard(keyboard), mmouse(mouse) mcamera = mroot->getscenemanager("main")->getcamera("main"); mcameramovevector = Ogre::Vector3::ZERO; mcontinue = true; 실습 keyboard->seteventcallback(this); mouse->seteventcallback(this); bool framestarted(const FrameEvent &evt) mkeyboard->capture(); mmouse->capture(); mcamera->moverelative(mcameramovevector); return mcontinue;

class InputController bool keypressed( const OIS::KeyEvent &evt ) switch(evt.key) case OIS::KC_W: mcameramovevector.y += 1; break; case OIS::KC_S: mcameramovevector.y -= 1; break; case OIS::KC_A: mcameramovevector.x -= 1; break; case OIS::KC_D: mcameramovevector.x += 1; break; case OIS::KC_ESCAPE: mcontinue = false; break; 실습 return true; bool mousemoved( const OIS::MouseEvent &evt ) if (evt.state.buttondown(ois::mb_right)) mcamera->yaw(degree(-evt.state.x.rel)); mcamera->pitch(degree(-evt.state.y.rel)); mcamera->moverelative(ogre::vector3(0, 0, -evt.state.z.rel * 0.1f)); return true;

class LectureApp 실습 void go(void)... 중략... mkeyboard = static_cast<ois::keyboard*>(minputmanager->createinputobject(ois::oiskeyboard, true)); mmouse = static_cast<ois::mouse*>( minputmanager->createinputobject(ois::oismouse, true)); InputController* inputcontroller = new InputController(mRoot, mkeyboard, mmouse); mroot->addframelistener(inputcontroller);... 중략...

실행결과 WASD 키를이용핚카메라의상하좌우이동 마우스 ( 오른쪽버튼누른상태 ) 를이용핚패닝및피칭 마우스휠을이용핚카메라 Zoom-in / Zoom-out

버퍼입력 (Buffered Input) 설정 void go(void)... 중략... mkeyboard = static_cast<ois::keyboard*>(minputmanager->createinputobject(ois::oiskeyboard, true)); mmouse = static_cast<ois::mouse*>( minputmanager->createinputobject(ois::oismouse, true)); InputController* inputcontroller = new InputController(mRoot, mkeyboard, mmouse); mroot->addframelistener(inputcontroller);... 중략... 버퍼입력설정

콜백함수지정 InputController(Root* root, OIS::Keyboard *keyboard, OIS::Mouse *mouse) : mroot(root), mkeyboard(keyboard), mmouse(mouse) mcamera = mroot->getscenemanager("main")->getcamera("main"); mcameramovevector = Ogre::Vector3::ZERO; mcontinue = true; keyboard->seteventcallback(this); mouse->seteventcallback(this);

bool framestarted(const FrameEvent &evt) mkeyboard->capture(); mmouse->capture(); mcamera->moverelative(mcameramovevector); return mcontinue;

WASD 키를이용핚카메라이동벡터설정 bool keypressed( const OIS::KeyEvent &evt ) switch(evt.key) case OIS::KC_W: mcameramovevector.y += 1; break; case OIS::KC_S: mcameramovevector.y -= 1; break; case OIS::KC_A: mcameramovevector.x -= 1; break; case OIS::KC_D: mcameramovevector.x += 1; break; case OIS::KC_ESCAPE: mcontinue = false; break; return true; WSAD 키에따라, y 축또는 x 축으로이동값설정. bool keyreleased( const OIS::KeyEvent &evt ) switch(evt.key) case OIS::KC_W: mcameramovevector.y -= 1; break; case OIS::KC_S: mcameramovevector.y += 1; break; case OIS::KC_A: mcameramovevector.x += 1; break; case OIS::KC_D: mcameramovevector.x -= 1; break; case OIS::KC_ESCAPE: mcontinue = false; break; return true;

마우스입력에따른카메라조작 bool mousemoved( const OIS::MouseEvent &evt ) 오른쪽마우스가눌렸을때, 마우스 x, y 좌표의상대적이동량을이용하여, 카메라의회전을처리함. if (evt.state.buttondown(ois::mb_right)) mcamera->yaw(degree(-evt.state.x.rel)); mcamera->pitch(degree(-evt.state.y.rel)); mcamera->moverelative(ogre::vector3(0, 0, -evt.state.z.rel * 0.1f)); return true; 휠상태에따른카메라의 Zooming

마우스이동에따른카메라의회전 : yaw XZ 평면에서 Y 축을중심으로하는회전. 카메라의 + 회전방향과마우스의 x 의 + 방향이반대 화면 +x +y +x 캐릭터 + 회전 - 회전 카메라 +z

마우스이동에따른카메라의회전 : pitch YZ 평면에서 X 축을중심으로하는회전. 카메라의 + 회전방향과마우스의 y 의 + 방향이반대 + 회전 +y +z 카메라 - 회전 캐릭터 +x 화면 +y

Zoom-in 핛때, 실제로요구되는카메라의동작 +y 닌자 +x +z

move() 함수의경우, 카메라의이동 +y 닌자 +x 월드좌표계를기준으로카메라가이동한다!!! +z

moverelative() 함수의동작 +y 닌자 +x +z +x +z 카메라좌표계를기준으로카메라가이동한다!!!

실습 Frustrum 시야절두체설정

시야절두체 (Viewing Frustum) 3 차원의공간상에서카메라에의해보일수있는것들을담는범위 근클리핑거리 (near clipping distance): 카메라와근평면까지의거리원클리핑거리 (far clipping distance): 카메라와원평면까지의거리 근평면 (near plane) 원평면 (far plane)

절두체컬링 (Frustum Culling) 컬링방법 카메라로부터아주멀리있는물체는? 눈에안보인다 표시할필요가없다. 렌더링하지않는다. 계산량이줄어든다. 카메라로부터아주가까이있는물체는? 그물체를투과한다. 표시할필요가없다. 렌더링하지않는다. 계산량이줄어든다. 제거 표시 클리핑 제거

class LectureApp 실습 void go(void)... 중략... mcamera->setposition(0.0f, 100.0f, 500.0f); mcamera->lookat(0.0f, 100.0f, 0.0f); mcamera->setnearclipdistance(100); mcamera->setfarclipdistance(500);... 중략...

카메라줌인줌아웃에따른클리핑효과 Near clipping 거리에따른효과 Far clipping 거리에따른효과

실습 PictureInPicture PIP 의구현

뷰포트 카메라로잡은장면을실제로보여주는모니터 ( 렌더윈도우 ) 상의 2 차원평면

뷰포트생성 Viewport* Ogre::RenderTarget::addViewport ( Camera * cam, int ZOrder = 0, float left = 0.0f, float top = 0.0f, float width = 1.0f, float height = 1.0f) cam: 카메라객체 ZOrder: 뷰포트의계층순서 (0 이맨아래 ) left, top: 뷰포트의왼쪽위의좌표 (0-1 사이의값으로써렌더윈도우상에서비율값으로표시 ). width, height: 뷰포트의너비와높이 (0-1 사이의값으로써렌더윈도우상에서비율값으로표시 ).

class LectureApp void go(void)... 중략... 실습 mcamera = mscenemgr->createcamera("main"); mcamera->setposition(0.0f, 100.0f, 500.0f); mcamera->lookat(0.0f, 100.0f, 0.0f); mviewport = mwindow->addviewport(mcamera, 0); mviewport->setbackgroundcolour(colourvalue(0.0f,0.0f,0.5f)); mcamera->setaspectratio(real(mviewport->getactualwidth()) /Real(mViewport->getActualHeight())); mmapcamera = mscenemgr->createcamera("mapcamera"); mmapcamera->setposition(0.0f, 800.0f, 1.0f); mmapcamera->lookat(0.0f, 0.0f, 0.0f); mmapviewport = mwindow->addviewport(mmapcamera, 1, 0.79, 0.01, 0.2, 0.2); mmapviewport->setbackgroundcolour(colourvalue(0.0f,0.0f,1.0f)); mmapcamera->setaspectratio(real(mmapviewport->getactualwidth()) /Real(mMapViewport->getActualHeight()));... 중략...

실행화면 : PIP 구현 (Picture-In-Picture)

MapCamera 의설정 void go(void) mmapcamera = mscenemgr->createcamera("mapcamera"); mmapcamera->setposition(0.0f, 800.0f, 1.0f); mmapcamera->lookat(0.0f, 0.0f, 0.0f); mmapviewport = mwindow-> addviewport(mmapcamera, 1, 0.79, 0.01, 0.2, 0.2); mmapviewport->setbackgroundcolour(colourvalue(0.0f,0.0f,1.0f)); mmapcamera->setaspectratio(real(mmapviewport->getactualwidth()) /Real(mMapViewport->getActualHeight()));

학습정리 오우거엔진의입력처리방식 무버퍼입력방식 폴링. 버퍼입력방식 인터럽트. 키입력및마우스입력처리리스너 카메라 입력을 capture() 하면 OIS 는콜백함수의 keypressed(), keyreleased(), mousemoved() 등의함수를호출함. 3D 씬을담아서뷰포트에연결함. 주요멤버함수 setposition(), lookat(), yaw(), roll(), pitch() move() 와 moverelative() 기능차이. 절두체컬링 시야내에있는것만렌더링함으로써, 엔짂실행속도최적화. 뷰포트 카메라를통해서담아낸장면을표시하는사각영역. addviewport(), setbackgroundcolour(), setaspectratio()