<4D F736F F F696E74202D20C1A63134B0AD202D20BBE7BFF8BCF6BFCD20C8B8C0FC>

Similar documents
슬라이드 1

슬라이드 1

슬라이드 1

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

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

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

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

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

<4D F736F F F696E74202D20C1A63137B0AD202D20C1F6C7FCC3E6B5B9C3B3B8AE>

슬라이드 1

<4D F736F F F696E74202D20C1A63037B0AD202D20B1A4BFF8B0FA20B1D7B8B2C0DA>

Microsoft PowerPoint - Week04_Rendering Pipeline.pptx

슬라이드 1

슬라이드 1

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

Microsoft Word - cg07-midterm.doc

슬라이드 1

<4D F736F F F696E74202D20C1A63130B0AD202D20C1F6C7FCB0FA20C7CFB4C3C0C720B7BBB4F5B8B5>

PowerPoint 프레젠테이션

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

'00 지역별분석.PDF

Microsoft PowerPoint - C++ 5 .pptx

UI TASK & KEY EVENT

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

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

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

Microsoft PowerPoint - GameProgramming16-Camera.ppt

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

Chap 6: Graphs

<4D F736F F D20BECBB1E220BDACBFEE20BAA4C5CD2C20C1C2C7A5B0E82C20C1C2C7A5BAAFC8AFC7E0B7C4>

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

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

PowerPoint 프레젠테이션

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

chap 5: Trees

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

Microsoft PowerPoint - ch02-1.ppt

PowerPoint 프레젠테이션

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

설계란 무엇인가?

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

Microsoft PowerPoint 상 교류 회로

EBhostW_SerialOutputProtocol_rev10b_ (2002).hwp

JUNIT 실습및발표

슬라이드 1

Microsoft PowerPoint - LA_ch6_1 [호환 모드]

제 1 장 기본 개념

<4D F736F F F696E74202D204347C3E2BCAEBCF6BEF D325FC4C4C7BBC5CDB1D7B7A1C7C8BDBA20B1E2BABBBFE4BCD22E >

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

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

Java ...

data

Vector Differential: 벡터 미분 Yonghee Lee October 17, 벡터미분의 표기 스칼라미분 벡터미분(Vector diffrential) 또는 행렬미분(Matrix differential)은 벡터와 행렬의 미분식에 대 한 표

Microsoft PowerPoint - chap06-2pointer.ppt

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

<B4EBC7D0BCF6C7D02DBBEFB0A2C7D4BCF62E687770>

Open methods

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

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

Microsoft PowerPoint - Java7.pptx

OCW_C언어 기초

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

PowerPoint Presentation

crazyflie2 code reading subak.io

Chapter 연습문제답안. y *sin-*cos*^ep-*/sqrt. y [ ; sinpi/ ; sin*pi ; ] 혹은 [ sinpi/ sin*pi ]. a ais[- ] b et.,., sin. c.. a A는주어진행렬 M의 번째열만을표시하는새로운행렬을나타낸다.

03_queue

이 장에서 사용되는 MATLAB 명령어들은 비교적 복잡하므로 MATLAB 창에서 명령어를 직접 입력하지 않고 확장자가 m 인 text 파일을 작성하여 실행을 한다

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

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

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

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

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

1 경영학을 위한 수학 Final Exam 2015/12/12(토) 13:00-15:00 풀이과정을 모두 명시하시오. 정리를 사용할 경우 명시하시오. 1. (각 6점) 다음 적분을 구하시오 Z 1 4 Z 1 (x + 1) dx (a) 1 (x 1)4 dx 1 Solut

실험 5

Microsoft PowerPoint - ch07 - 포인터 pm0415

슬라이드 1

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

슬라이드 1

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

실감미디어 제작 전문인 과정 1기 결과보고서

장연립방정식을풀기위한반복법 12.1 선형시스템 : Gauss-Seidel 12.2 비선형시스템 12.1 선형시스템 : Gauss-Seidel (1/10) 반복법은초기근을가정한후에더좋은근의값을추정하는체계적인절차를이용한다. G-S 방법은선형대수방정

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

슬라이드 1

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

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

adfasdfasfdasfasfadf

Let G = (V, E) be a connected, undirected graph with a real-valued weight function w defined on E. Let A be a set of E, possibly empty, that is includ

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - statics_vector_and_matrix(노트).ppt

PowerPoint 프레젠테이션

Chapter 4. LISTS

작용소의 행렬표현과 그 응용

Chapter 4. LISTS

슬라이드 1

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

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

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

Microsoft PowerPoint 세션.ppt

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - 06-Body Data Class.pptx

Transcription:

게임엔진 제 14 강사원수와회전 이대현교수 한국산업기술대학교게임공학과

학습목차 오일러회전의개념과특성의이해 사원수의개념 사원수를이용한회전실습 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+ yj+ zk 삼차원공간에서의회전을쉽게나타낼수있고, 여러조합의회전연산을쉽게할수있는특성을지님. Y Z 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 사원수회전실습

PlayState.cpp void PlayState::enter() { 중략 실습 Quaternion z(degree(90), Vector3::UNIT_Z); mninjanode->rotate(z); 후략 +z 축을기준으로 +90 도회전. z

PlayState.cpp void PlayState::enter() { 중략 실습 Quaternion z(degree(90), Vector3::UNIT_Z); Quaternion x(degree(90), Vector3::UNIT_X); Quaternion p = x * z; mninjanode->rotate(p); 후략 z 에의한회전을먼저하고, 그리고 x 에의한회전을수행함. z x

PlayState.cpp void PlayState::enter() { 중략 실습 Quaternion z(degree(90), Vector3::UNIT_Z); Quaternion x(degree(90), Vector3::UNIT_X); Quaternion p = z * x; mninjanode->rotate(p); 후략 x z

PlayState.cpp void PlayState::enter() { 중략 실습 Quaternion q(degree(180), Vector3(1, 1, 0)); mninjanode->rotate(q); 후략 (1, 1, 0) 벡터를축으로하여 180도회전. 벡터의크기 = 2 2 2 만큼확대됨. 1 + 1 + 0 = 2

PlayState.cpp void PlayState::enter() { 중략 실습 Vector3 r = Vector3(1, 1, 0); r.normalise(); Quaternion q(degree(180), r); mninjanode->rotate(q); 후략 벡터의크기를 1 로정규화함.

노드의회전관련함수 const Quaternion& Ogre::Node::getOrientation () 노드에적용된회전 ( 다시말하면사원수 ) 를구한다. void Ogre::Node::setOrientation ( const Quaternion & q ) 노드의초기방향을기준으로하여, 사원수 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

실습 WalkAroundNinja 임의방향회전실습

bool PlayState::frameStarted(GameManager* game, const FrameEvent& evt) {.. 중략 실습 Vector3 src = mninjanode->getorientation() * Vector3::NEGATIVE_UNIT_Z; Quaternion quat = src.getrotationto(mdirection); mninjanode->rotate(quat); 중략 후략 } Vector3 src = mninjanode->getorientation() * (-Vector3::UNIT_Z); Quaternion quat = src.getrotationto(mdirection); mninjanode->rotate(quat);

닌자이동시바라보는방향을바꾸려면? v r u r (1) 현재로봇이바라보고있는방향을가리키는벡터 u 를구한다. (2) u 벡터를 v 벡터방향으로회전하기위한사원수를구한다. (3) 닌자노드에사원수를적용하여회전시킨다.

(1) 현재닌자가바라보고있는방향구하기 메쉬자체의바라보고있는방향. -z Vector3 src = mninjanode->getorientation( )* Vector3::NEGATIVE_UNIT_Z; 현재까지로봇노드에적용된회전.

(2) u 를회전하여 v 를만들기위한사원수계산 Quaternion quat = src.getrotationto(mdirection); src 벡터를회전하여 mdirection 벡터를만들게하는사원수를구한다.

(3) 로봇노드에사원수적용하여회전 mninjanode->rotate(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 로주어진회전비율까지로회전을하고자할때, 필요한사원수가된다.

실습 SlerpRotation 부드러운닌자의회전실습

PlayState.h class PlayState : public GameState { 실습.. 중략 bool mrotating; Ogre::Quaternion morientsrc, morientdest; Ogre::Real mrotprogress; Ogre::Real mrotfactor; 후략 }

PlayState.cpp bool PlayState::frameStarted(GameManager* game, const FrameEvent& evt) {.. 중략 Quaternion delta; if (mrotating) { mrotprogress += mrotfactor; if (mrotprogress > 1) { mrotating = false; } else { delta = Quaternion::Slerp(mRotProgress, morientsrc, morientdest); mninjanode->setorientation(delta); } } 중략 Vector3 src = mninjanode->getorientation() * (-Vector3::UNIT_Z); Quaternion quat = src.getrotationto( mdirection ); mrotating = true; mrotfactor = 1.0f/5; morientsrc = mninjanode->getorientation(); morientdest = quat * morientsrc; mrotprogress = 0; 후략 } 실습

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

현재구면보간을이용하여회전중인가? bool mrotating; 시작사원수와종료사원수. Quaternion morientsrc, morientdest; Real mrotprogress, mrotfactor; 프레임당회전을몇 % 를진행시킬것인가? 구면보간이용한회전이진행된정도 (0-1 사이의값 )

bool framestarted(const FrameEvent &evt) { Quaternion delta; if (mrotating) { mrotprogress += mrotfactor; if (mrotprogress > 1) { mrotating = false; } else { 회전비율을진행. 노드를 mrotprogress 비율반큼회원하기위한사원수를구함. delta = Quaternion::Slerp(mRotProgress, morientsrc, morientdest); mninjanode->setorientation(delta); } }

} else { Real move = mwalkspeed * evt.timesincelastframe; // 이동량계산 mdistance -= move; // 남은거리계산 if (mdistance <= 0.0f) { // 목표지점에다왔으면 mninjanode->setposition( mdestination ); // 목표지점에로봇을위치 mdirection = Vector3::ZERO; // 정지상태로들어간다. if (! nextlocation( ) ) { manimationstate = ninjaentity->getanimationstate( "Idle1" ); manimationstate->setloop( true ); manimationstate->setenabled( true ); } else { Vector3 src = mninjanode->getorientation() * (-Vector3::UNIT_Z); Quaternion quat = src.getrotationto( mdirection ); mrotating = true; mrotfactor = 1.0f/5; morientsrc = ninjanode->getorientation(); morientdest = quat * morientsrc; mrotprogress = 0; } } else

정리 오일러회전 x,y,z 축을회전축으로한회전. 이해하기쉬우나, gimbal lock 등의문제가있음. 사원수 한개의실수성분과세개의허수성분으로이루어진개념의수. 임의의회전축을중심으로한회전을하나의사원수값으로표현할수있음. Slerp 구면보간 두개의회전값사이를부드럽게보간하는방법.