[게임코드]손쉽게 카메라 흔들기
Programming/C/C++ / 2011. 3. 4. 23:24
출처 - http://www.gamecode.org/bak/article.php3?no=3371&page=0¤t=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 |