블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

출처 - http://www.gamecode.org/bak/article.php3?no=3371&page=0&current=0&field=tip

 

작성자 : noerror
E 메일 : noerror@hitel.net
조회수 : 972
작성일 : 2006-07-22 16:53:55
목 : 손쉽게 카메라 흔들기

 

게임중에 충격등의 효과시 카메라를 흔들때 간단하게 sin 함수를 이용해서 그럴듯하게 처리하는 팁입니다. (약간은 감강적인 방식입니다만 - 이론적 근거가 별로 필요없다는 얘기죠. ^^ - 효과는 괜찮습니다.) 

결론부터 말씀드리자면 sin 함수를 여러개 합해서 사용하는 것입니다. 실제로 제어쪽에서는 충격(임펄스)를 가해서 그 응답 특성으로 시스템 특성이나 안정도등을 분석하기도 합니다. 보통 시간에 따른 주파수 특성을 분석하는데, 역으로 사인파로 어떤 특성을 가진 시스템을 만든다고 생각하면 될거 같네요. (구지 그럴듯하게 말을 붙이자면... ^^) 

기본적으로 사인파의 결과가 부드럽게 나타나기 때문에 자연스럽게 연속적인 모양으로 나옵니다. 충격에 따른 사인파의 특성 (진동하는 정도와 주파수, 충격이후 진폭이 서서이 줄어드는 특성)을 아래처럼 간단하게 사인함수로 구현할 수 있습니다. 

W = sin( 2 * 3.14159f * (t * freq) + phase ) * amp * (decaysec - t) / decaysec ; 

t 현재 시간, amp(const) 진폭, freq(const) 진동수, phase(const) 위상, decaysec(const) 선형감쇄시간 

사실상 특별한 이론이 있다기 보다는 상황에 따라 감각적으로 각 상수를 정해서 표현하게 됩니다.^^ 
* 진폭은 결과가 상하로 이동하는 정도가 되며 값이 클수록 더 크게 진동합니다. 
* 진동수는 초당 상하 운동하는 횟수로 값이 클수록 더 빨리 진동합니다. 
* 위상은 함수의 시작 포지션 정도로 실제로 값에 따른 느낌을 주는 것은 아니지만 함수들을 여러개 더할 때 좀 더 다양한 형태로 결과가 나옵니다. (사실상 주파수가 n 배로 할 경우 작은 주파수에서 항상 0가 되는 데, 위상을 주면 결과가 다르게 나옵니다. - 어차피 상수값을 감각적으로 넣는 데, 결과물에 다양함을 줄 수 있는 값 정도로 보면 될거 같습니다.) 
* 감쇄시간은 감쇄되는 함수모양에 따라 다른데, 어차피 모델링할 정확한 모양이 있는 게 아니므로 그냥 단순히 시간에 따라 감쇄한다고 설정하면 선형으로 하는 것도 별 문제는 없어 보입니다. (이 경우 t 가 decaysec 보다는 작거나 같아야 겠죠.) 

자 그럼 이걸로 어떻게 사용하냐 하면 

float t = (timeGetTime() - m_uWaveStartTime) * 0.001f; 

if (t < m_fDecayTime) 

    camera.pivot.y += (sin (2.0f * 3.14159f * t * 3) * 30.0f + 
        sin (2.0f * 3.14159f * t * 7 + 0.2f) * 10.1f + 
        sin (2.0f * 3.14159f * t * 15 + 0.5f) * 1.1f)) * ( m_fDecayTime - t) / m_fDecayTime; 


이런 식입니다. ^^ 

실제 주파수는 화면 갱신 타임에 영향을 주기 때문에 값이 크더라도 크게 의미가 없습니다. 
그리고 만약 60 hz로 갱신되는 모니터라면 화면이 흔들리지 않는 상황이 생깁니다. ^^ 
(여러번 해보면 주파수가 높은 사인파의 진폭에 대한 느낌이라던가, 파형수가 많을 때와 적을 때의 차이라던가하는 느낌이 옵니다.) 

그냥 적당히 감각적(!)으로 상수를 설정해서 사용해보고, 결과가 괜찮으면 OK!! 
(흔들기 뿐 아니라, 번쩍거리기 등 활용 예는 많겠죠 ?) 

이상 별 내용은 없지만, 너무 간단해서 별로 이슈화 안되는 내용을 함 적어봤습니다.

반응형

'Programming > C/C++' 카테고리의 다른 글

이름공간(namespace)의 함정.  (0) 2011.03.13
카메라 흔들기  (0) 2011.03.05
임의의 표면에 데칼 적용하기(소스포함)  (2) 2011.03.04
ifdef, if defined, ifndef, if !defined  (0) 2011.03.04
enum, 보다 나은 enum  (0) 2011.01.13
Posted by blueasa
, |