12 1 Camera class Camera public enum Camera
12. 1 카메라 디자인 • Camera 클래스 선언 class Camera { public: enum Camera. Type { LANDOBJECT, AIRCRAFT }; Camera(); Camera(Camera. Type camera. Type); ~Camera(); void strafe(float units); // left/right void fly(float units); // up/down void walk(float units); // forward/backward void pitch(float angle); // rotate on right vector void yaw(float angle); // rotate on up vector void roll(float angle); // rotate on look vector 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 7
12. 1 카메라 디자인 //과제로 만들 함수 void mouse_motion(); //rotate up to mouse motion void get. View. Matrix(D 3 DXMATRIX* V); void set. Camera. Type(Camera. Type camera. Type); void get. Position(D 3 DXVECTOR 3* pos); void set. Position(D 3 DXVECTOR 3* pos); void get. Right(D 3 DXVECTOR 3* right); void get. Up(D 3 DXVECTOR 3* up); void get. Look(D 3 DXVECTOR 3* look); private: Camera. Type _camera. Type; D 3 DXVECTOR 3 _right; D 3 DXVECTOR 3 _up; D 3 DXVECTOR 3 _look; D 3 DXVECTOR 3 _pos; }; 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 8
12. 2. 1. 3 두 개의 파트를 조합하기 void Camera: : get. View. Matrix(D 3 DXMATRIX* V) { // Keep camera's axes orthogonal to each other D 3 DXVec 3 Normalize(&_look, &_look); D 3 DXVec 3 Cross(&_up, &_look, &_right); D 3 DXVec 3 Normalize(&_up, &_up); D 3 DXVec 3 Cross(&_right, &_up, &_look); D 3 DXVec 3 Normalize(&_right, &_right); // Build the view matrix: float x = -D 3 DXVec 3 Dot(&_right, &_pos); float y = -D 3 DXVec 3 Dot(&_up, &_pos); float z = -D 3 DXVec 3 Dot(&_look, &_pos); 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 15
12. 2. 3 -(1) Pitch void Camera: : pitch(float angle) { D 3 DXMATRIX T; D 3 DXMatrix. Rotation. Axis(&T, &_right, angle); // rotate _up and _look around _right vector D 3 DXVec 3 Transform. Coord(&_up, &T); D 3 DXVec 3 Transform. Coord(&_look, &T); } 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 20
12. 2. 3 -(2) Yaw void Camera: : yaw(float angle) { D 3 DXMATRIX T; // rotate around world y (0, 1, 0) always for land object if( _camera. Type == LANDOBJECT ) D 3 DXMatrix. Rotation. Y(&T, angle); // rotate around own up vector for aircraft if( _camera. Type == AIRCRAFT ) D 3 DXMatrix. Rotation. Axis(&T, &_up, angle); // rotate _right and _look around _up or y-axis D 3 DXVec 3 Transform. Coord(&_right, &T); D 3 DXVec 3 Transform. Coord(&_look, &T); } 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 21
12. 2. 3 -(3) Roll void Camera: : roll(float angle) { // only roll for aircraft type if( _camera. Type == AIRCRAFT ) { D 3 DXMATRIX T; D 3 DXMatrix. Rotation. Axis(&T, &_look, angle); // rotate _up and _right around _look vector D 3 DXVec 3 Transform. Coord(&_right, &T); D 3 DXVec 3 Transform. Coord(&_up, &T); } } 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 22
12. 2. 4(1) 걷기 void Camera: : walk(float units) { // move only on xz plane for land object if( _camera. Type == LANDOBJECT ) _pos += D 3 DXVECTOR 3(_look. x, 0. 0 f, _look. z) * units; if( _camera. Type == AIRCRAFT ) _pos += _look * units; } 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 24
12. 2. 4(2) 옆걸음질 void Camera: : strafe(float units) { // move only on xz plane for land object if( _camera. Type == LANDOBJECT ) _pos += D 3 DXVECTOR 3(_right. x, 0. 0 f, _right. z) * units; if( _camera. Type == AIRCRAFT ) _pos += _right * units; } 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 25
12. 2. 4(3) 날기 void Camera: : fly(float units) { // move only on y-axis for land object if( _camera. Type == LANDOBJECT ) _pos. y += units; if( _camera. Type == AIRCRAFT ) _pos += _up * units; } 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 26
12. 3 예제 애플리케이션: 카메라 bool Display(float time. Delta) { if( Device ) { // Update: Update the camera. if( : : Get. Async. Key. State('W') & 0 x 8000 f ) The. Camera. walk(4. 0 f * time. Delta); if( : : Get. Async. Key. State('S') & 0 x 8000 f ) The. Camera. walk(-4. 0 f * time. Delta); if( : : Get. Async. Key. State('A') & 0 x 8000 f ) The. Camera. strafe(-4. 0 f * time. Delta); if( : : Get. Async. Key. State('D') & 0 x 8000 f ) The. Camera. strafe(4. 0 f * time. Delta); 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 28
12. 3 예제 애플리케이션: 카메라 if( : : Get. Async. Key. State('R') & 0 x 8000 f ) The. Camera. fly(4. 0 f * time. Delta); if( : : Get. Async. Key. State('F') & 0 x 8000 f ) The. Camera. fly(-4. 0 f * time. Delta); if( : : Get. Async. Key. State(VK_UP) & 0 x 8000 f ) The. Camera. pitch(1. 0 f * time. Delta); if( : : Get. Async. Key. State(VK_DOWN) & 0 x 8000 f ) The. Camera. pitch(-1. 0 f * time. Delta); if( : : Get. Async. Key. State(VK_LEFT) & 0 x 8000 f ) The. Camera. yaw(-1. 0 f * time. Delta); if( : : Get. Async. Key. State(VK_RIGHT) & 0 x 8000 f ) The. Camera. yaw(1. 0 f * time. Delta); 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 29
12. 3 예제 애플리케이션: 카메라 if( : : Get. Async. Key. State('N') & 0 x 8000 f ) The. Camera. roll(1. 0 f * time. Delta); if( : : Get. Async. Key. State('M') & 0 x 8000 f ) The. Camera. roll(-1. 0 f * time. Delta); // Update the view matrix representing the cameras // new position/orientation. D 3 DXMATRIX V; The. Camera. get. View. Matrix(&V); Device->Set. Transform(D 3 DTS_VIEW, &V); 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 30
12. 3 예제 애플리케이션: 카메라 // Render Device->Clear(0, 0, D 3 DCLEAR_TARGET | D 3 DCLEAR_ZBUFFER, 0 x 0000, 1. 0 f, 0); Device->Begin. Scene(); d 3 d: : Draw. Basic. Scene(Device, 1. 0 f); Device->End. Scene(); Device->Present(0, 0, 0, 0); } return true; } 게임 프로그래밍-I 강의노트 © 2006 한성대학교 멀티미디어공학과 31
- Slides: 33