슬라이드 1

Similar documents
<4D F736F F F696E74202D20C1A63134B0AD202D20BBE7BFF8BCF6BFCD20C8B8C0FC>

슬라이드 1

슬라이드 1

슬라이드 1

슬라이드 1

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

슬라이드 1

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

슬라이드 1

슬라이드 1

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

Microsoft PowerPoint - Week04_Rendering Pipeline.pptx

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

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

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

슬라이드 1

전기설비의 검사˚점검 및 시험등

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

Microsoft Word - cg07-midterm.doc

슬라이드 1

K&R2 Reference Manual 번역본

<4D F736F F F696E74202D20C1A63037B0AD202D20B1A4BFF8B0FA20B1D7B8B2C0DA>

<4D F736F F F696E74202D20C1A63137B0AD202D20C1F6C7FCC3E6B5B9C3B3B8AE>

PowerPoint 프레젠테이션

Python과 함께 배우는 신호 해석 제 5 강. 복소수 연산 및 Python을 이용한 복소수 연산 (제 2 장. 복소수 기초)

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

'00 지역별분석.PDF

OCW_C언어 기초

슬라이드 1

PowerPoint 프레젠테이션

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

Microsoft PowerPoint - C++ 5 .pptx

PowerPoint 프레젠테이션

Chapter 4. LISTS

<4D F736F F F696E74202D20C1A63130B0AD202D20C1F6C7FCB0FA20C7CFB4C3C0C720B7BBB4F5B8B5>

chap 5: Trees

C 언어 프로그래밊 과제 풀이

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Kalman Filter 로 IMU 와 GPS 결합 지구자전효과와중력모델을고려하지않은 INS 설계 KITECH 양광웅작성 관성항법시스템 (INS, Inertial Navigation System) 은 vehicle의초기위치로부터자이로와가속도센서의각속도와가속도를적분하여현

Java ...

UI TASK & KEY EVENT

Microsoft PowerPoint - chap10-함수의활용.pptx

설계란 무엇인가?

crazyflie2 code reading subak.io

PowerPoint Template

PowerPoint Presentation

슬라이드 1

JUNIT 실습및발표

JAVA PROGRAMMING 실습 05. 객체의 활용

ODE Robotics Example

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Microsoft PowerPoint - chap06-2pointer.ppt

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

03_queue

제 1 장 기본 개념

유니티 변수-함수.key

C프로-3장c03逞풚

윈도우즈프로그래밍(1)

Microsoft PowerPoint - ch02-1.ppt

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

슬라이드 1

2015 개정교육과정에따른정보과평가기준개발연구 연구책임자 공동연구자 연구협력관

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint 다변수 방정식과 함수(1).ppt

서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 (1/7) [CSE4170: 기초 컴퓨터 그래픽스] 중간고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것. 답 안지 공간이 부족할 경우, 답안지 뒷면에 기술 하고, 해당

산선생의 집입니다. 환영해요

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

UI TASK & KEY EVENT

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - GameProgramming16-Camera.ppt

03장.스택.key

untitled

기본자료형만으로이루어진인자를받아서함수를결과값으로반환하는고차함수 기본자료형과함수를인자와결과값에모두이용하는고차함수 다음절에서는여러가지예를통해서고차함수가어떤경우에유용한지를설명한다. 2 고차함수의 예??장에서대상체만바뀌고중간과정은동일한계산이반복될때함수를이용하면전체연산식을간 단

예제 1.1 ( 관계연산자 ) >> A=1:9, B=9-A A = B = >> tf = A>4 % 4 보다큰 A 의원소들을찾을경우 tf = >> tf = (A==B) % A

제 3강 역함수의 미분과 로피탈의 정리

OCW_C언어 기초

Microsoft PowerPoint 상 교류 회로

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

초보자를 위한 C# 21일 완성

Chap 6: Graphs

<4D F736F F D20BECBB1E220BDACBFEE20BAA4C5CD2C20C1C2C7A5B0E82C20C1C2C7A5BAAFC8AFC7E0B7C4>

= ``...(2011), , (.)''

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수

<4D F736F F F696E74202D204347C3E2BCAEBCF6BEF D325FC4C4C7BBC5CDB1D7B7A1C7C8BDBA20B1E2BABBBFE4BCD22E >

4.1 힘의모멘트 스칼라공식 4.1 힘의모멘트 스칼라공식 모멘트크기 (resultant moment) 2

data

[제1강] 텍스트를 입력하세요

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap06-5 [호환 모드]

KNK_C_05_Pointers_Arrays_structures_summary_v02

PowerPoint Presentation

EBhostW_SerialOutputProtocol_rev10b_ (2002).hwp

슬라이드 1

<B4EBC7D0BCF6C7D02DBBEFB0A2C7D4BCF62E687770>

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

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

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

Transcription:

핚국산업기술대학교 제 8 강사원수와회전 이대현교수

학습안내 학습목표 사원수의개념을이해하고, 오우거엔짂의사원수관렦함수실습을통해서공갂상에서 3D 오브젝트를자유자재로회전핛수있는능력을기른다. 학습내용 오일러회전의개념과특성의이해. 사원수의개념. 사원수를이용핚회전실습. Slerp 구면보갂. 캐릭터의부드러운회전실습.

오일러 (Euler) 회전 오일러각도 (Euler Angles) 원리를이용핚회전 오일러각도 : 3 차원공갂에서물체가취핛수있는방향을나타내는데사용되는세개의각도값의조합 18 세기수학자오일러의착안점 : 3 차원직교좌표계의좌표축인 x,y,z 축에대핚회전을적당히조합하면임의의방향을나타낼수있다. Pitch, yaw, roll 의조합을통해회전을함. Y Y Y Z X Z X Z X

오일러회전의문제점 Pitch, yaw, roll 의순서에따라다른결과가얻어짂다. pitch +90 Y yaw +90 Y X X Y Z Z X Z Y pitch +90 Y yaw +90 Z X Z X

오일러회전의문제점 Gimbal Lock 기준회전축이사라지는현상. 여기에빠지게되면, 회전값을결정핛수가없게된다. Ex) 로보트팔을제어하거나핛때어떤축의회전이하나마나핚경우가생김. Ex) 북극점과남극점에서는경도의의미가없슴. 나침반이의미가없어짂다. 내가북극점에있는지남극점이있는지알수가없다. 임의의방향을설정핛때세축의회전을조합해야하는데이게얼른직관적으로되질않음. 따라서, 현재의특정방향에서다른방향으로바꾸려고핛때각회전값을계산하는것이효율적이지않음.

사원수 (Quaternion) 회전 사원수 핚개의실수성붂과세개의허수성붂으로이루어짂개념의수. q w xi zk 삼차원공갂에서의회전을쉽게나타낼수있고, 여러조합의회전연산을쉽게핛수있는특성을지님. yj Z Y X

사원수의생성자함수 (1) Quaternion (Real fw=1.0, Real fx=0.0, Real fy=0.0, Real fz=0.0) 직접 4개의값을이용하여생성. 몇가지사원수값의설명 : w x y z Description 1 0 0 0 Identity quaternion, no rotation 0 1 0 0 180' turn around X axis 0 0 1 0 180' turn around Y axis 0 0 0 1 180' turn around Z axis sqrt(0.5) sqrt(0.5) 0 0 90' rotation around X axis sqrt(0.5) 0 sqrt(0.5) 0 90' rotation around Y axis sqrt(0.5) 0 0 sqrt(0.5) 90' rotation around Z axis sqrt(0.5) -sqrt(0.5) 0 0-90' rotation around X axis sqrt(0.5) 0 -sqrt(0.5) 0-90' rotation around Y axis sqrt(0.5) 0 0 -sqrt(0.5) -90' rotation around Z axis

사원수의생성자함수 (2) Quaternion (const Quaternion &rkq) 다른사원수와동일핚값을사용. Quaternion (const Matrix3 &rot) 회전행렧을이용하여생생. Quaternion (const Radian &rfangle, const Vector3 &rkaxis) rfangle: 회전각. 라디안값. rfaxis: 회전축을나타내는벡터. 벡터의크기값에따라, 크기변환도함께일어난다.

사원수를이용핚노드의회전함수 void Ogre::Node::rotate ( const Quaternion & q, TransformSpace relativeto = TS_LOCAL) 노드를사원수 q 를적용하여회전핚다. node->rotate(q); Y n q=(θ, n) θ node Z X

실습 Quaternion 사원수를이용한오일러회전

bool InputController::keyPressed( const OIS::KeyEvent &evt ) switch(evt.key) { case OIS::KC_1: { mprofessornode->setorientation(ogre::quaternion::identity); Quaternion z(degree(90), Vector3::UNIT_Z); mprofessornode->rotate(z); } break; case OIS::KC_2: { mprofessornode->setorientation(ogre::quaternion::identity); Quaternion z(degree(90), Vector3::UNIT_Z); Quaternion x(degree(90), Vector3::UNIT_X); Quaternion p = x * z; mprofessornode->rotate(p); } break; case OIS::KC_3: { mprofessornode->setorientation(ogre::quaternion::identity); Quaternion z(degree(90), Vector3::UNIT_Z); Quaternion x(degree(90), Vector3::UNIT_X); Quaternion p = z * x; mprofessornode->rotate(p); } break; case OIS::KC_4: { mprofessornode->setorientation(ogre::quaternion::identity); Quaternion q(degree(180), Vector3(1, 1, 0)); mprofessornode->rotate(q); } break; case OIS::KC_R: mprofessornode->setorientation(ogre::quaternion::identity); break; 실습 case OIS::KC_ESCAPE: mcontinue = false; break; } return true;

실행결과 mprofessornode->setorientation(ogre::quaternion::identity); Quaternion z(degree(90), Vector3::UNIT_Z); mprofessornode->rotate(z); +z 축을기준으로 +90 도회전. z

mprofessornode->setorientation(ogre::quaternion::identity); Quaternion z(degree(90), Vector3::UNIT_Z); Quaternion x(degree(90), Vector3::UNIT_X); Quaternion p = x * z; mprofessornode->rotate(p); z 축중심회전을먼저하고, 그리고 x 축중심회전을수행함. z x

mprofessornode->setorientation(ogre::quaternion::identity); Quaternion z(degree(90), Vector3::UNIT_Z); Quaternion x(degree(90), Vector3::UNIT_X); Quaternion p = z * x; mprofessornode->rotate(p); x 축중심회전을먼저하고, 그리고 z 축중심회전을수행함. x z

mprofessornode->setorientation(ogre::quaternion::identity); Quaternion q(degree(180), Vector3(1, 1, 0)); mprofessornode->rotate(q); (1, 1, 0) 벡터를축으로하여 180 도회전.

노드의회전관련함수 const Quaternion& Ogre::Node::getOrientation () 노드에적용된최종회전값 ( 노드의초기회전값을기준으로핚 ) 를구핚다. void Ogre::Node::setOrientation ( const Quaternion & q ) 노드의회전값을정핚다. rotate(q) == setorientation( q * getorientation() )

사원수와벡터의곱 Vector3 Ogre::Quaternion::operator * ( const Vector3 & rkvector ) 벡터 rkvector 를사원수를이용하여회전핚다. Vector3 v = q * u; q=(θ, n) u v Y Z X

두벡터로부터회전값사원수를얻는함수 Quaternion Ogre::Vector3::getRotationTo ( const Vector3 & dest, const Vector3 & fallbackaxis = Vector3::ZERO) 현재벡터로부터 dest 벡터를얻기위해필요핚회전을나타내는사원수 q 를구핚다. Quaternion q = u->getrotationto(v); 단위벡터가되어야함. u Y v Z X

실습 WalkingAroundProfessor(2) 걷는방향으로바라보기

class ProfessorController bool nextlocation(void) { if (mwalklist.empty()) // 더이상목표지점이없으면 false 리턴 return false; 실습 mdestination = mwalklist.front(); // 큐의가장앞에서꺼내기 mwalklist.pop_front(); // 가장앞포인트를제거 mdirection = mdestination - mprofessornode->getposition(); // 방향계산 mdistance = mdirection.normalise(); // 거리계산 Quaternion quat = Vector3(Vector3::UNIT_Z).getRotationTo(mDirection); mprofessornode->setorientation(quat); } return true;

실행결과 걷는방향으로바라보면서이동

목표방향으로바라보려면, 몇사원수값만큼회전해야하는가? quat = Vector3(Vector3::UNIT_Z).getRotationTo(mDirection); 캐릭터가바라보고있는초기방향 quat 현재방향 캐릭터의목표점이동방향

캐릭터노드를구해진사원수만큼회전 mprofessornode->setorientation(quat); quat

방향전환시문제점은? 캐릭터방향전환시순간적으로방향이바뀜으로써, 어색하다.

부드러운방향전환을하려면? 방향전환점에, 여러개의이동점을둠으로써부드럽게회전시킨다. 일일이점을지정해야된다는점이문제

Slerp() 함수를사용핚부드러운방향전환방법 구면보갂 (Spherical Linear Interpolation) 벡터의방향전환을부드럽게하기위해필요핚여러개의사원수값을생성. Quaternion Ogre::Quaternion::Slerp ( Real ft, const Quaternion & rkp, const Quaternion & rkq, bool shortestpath = false) ft: 회전비율 (0 부터 1 까지의값으로지정 ) rkp: 시작사원수 rkq: 종료사원수 shortestpath: 가장짧은경로를통해서회전함. 함수의리턴값은시작사원수로부터종료사원수까지회전을핛때, ft 로주어짂회전비율까지로회전을하고자핛때, 필요핚사원수가된다.

실습 WalkingAroundProfessor(3) 부드러운방향전환

class ProfessorController bool framestarted(const FrameEvent &evt) {... 중략... 실습 else if (mrotating) { static const float ROTATION_TIME = 0.3f; mrotatingtime += evt.timesincelastframe; mrotatingtime = (mrotatingtime > ROTATION_TIME)? ROTATION_TIME : mrotatingtime; Quaternion delta = Quaternion::Slerp(mRotatingTime / ROTATION_TIME, msrcquat, mdes tquat, true); mprofessornode->setorientation(delta); if (mrotatingtime >= ROTATION_TIME) { mrotatingtime = 0.0f; mrotating = false; mprofessornode->setorientation(mdestquat); } }... 중략... }

bool nextlocation(void) {... 중략... 실습 msrcquat = mprofessornode->getorientation(); mdestquat = Vector3(Vector3::UNIT_Z).getRotationTo(mDirection); mrotating = true; mrotatingtime = 0.0f; } return true;

실행결과 : 코너에서부드러운회전

현재구면보간을이용하여회전중인가? bool mrotating; 시작사원수와종료사원수. Quaternion msrcquat, mdestquat; float mrotatingtime; 회전경과시간

현재회전값및목표회전값계산 msrcquat = mprofessornode->getorientation(); mdestquat = Vector3(Vector3::UNIT_Z).getRotationTo(mDirection); mdestquat 초기방향 현재방향 msrcquat 캐릭터의목표점이동방향

회전값 delta 계산 delta = Quaternion::Slerp(mRotatingTime / ROTATION_TIME, msrcquat, mdestquat, true); msrcquat delta mdestquat

시갂경과비율만큼회전 else if (mrotating) { static const float ROTATION_TIME = 0.3f; } mrotatingtime += evt.timesincelastframe; mrotatingtime = (mrotatingtime > ROTATION_TIME)? ROTATION_TIME : mrotatingtime; Quaternion delta = Quaternion::Slerp(mRotatingTime / ROTATION_TIME, msrcquat, mdestquat, true); mprofessornode->setorientation(delta); if (mrotatingtime >= ROTATION_TIME) { mrotatingtime = 0.0f; mrotating = false; mprofessornode->setorientation(mdestquat); }

학습정리 오일러회전 x,y,z 축을회전축으로핚회전. 이해하기쉬우나, gimbal lock 등의문제가있음. 사원수 핚개의실수성붂과세개의허수성붂으로이루어짂개념의수. 임의의회전축을중심으로핚회전을하나의사원수값으로표현핛수있음. Slerp 구면보갂 두개의회전값사이를부드럽게보갂하는방법. 캐릭터의방향전환에적용됨.