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

카테고리

분류 전체보기 (2809)
Unity3D (865)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (234)
협업 (61)
3DS Max (3)
Game (12)
Utility (140)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (16)
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

카메라를 흔들려면 카메라를 흔드는 폭을 알아야 한다.

그런데 이 폭을 생각처럼 이쁘게 얻기 힘들다.

그래서 이쁜 공식에 대한 화두를 던저볼까 한다.

 

1. y = sin(x)

 

 

먼저 생각해 볼 수 있고 만만한 공식은 바로 sin 이다.

sin 특성상 파형을 나타낸다. 오르락 내리락 하는것이 단순하면서도

직선적이지 않아 카메라 흔들때 딱이라는 느낌이 온다.

하지만.. 너무 단조롭지 않은가? 점점 감쇄할수 있다면 좋을것 같다.

 

 

2. y = powf(0.5f, x) : 흔히 말하는 y=(1/2)^x 그래프 이다.

 

 

감쇄하는 모양이 아주 이쁘다. 특히나 5 정도를 지나면 0이 아니라 0에 수렴하는 곡선이다.

이 그래프의 감쇄 정도를 상수를 이용해서 수정한다면 아주 이쁜 상쇄 그래프가 나올것이다.

 

 

3. y = sin(x) * powf(0.5f, x)

 

그냥 단순히 곱해봤다. x 축의 값이 time이랑 맞지 않아 이런 결과가 나왔다.

만약 sin 파장을 줄인다면 뭔가 이쁜 그래프가 나올것 같다.

 

 

4. y = sin(x*10.0f) * powf(0.5f, x)

 
그래프가 아주 이뻐졌다.
두 함수의 속성을 이용해서만이라도 훌륭한 카메라 흔들기를 구현할수 있지 않을까?
여러가지 실험을 통해서 이쁜 상수들(일명 매직넘버)을 구하기 바란다.
또한 다른 그래프와의 간섭이 일어난다면 더욱 이쁜 그래프가 나올수도 있다.

[출처] 카메라 흔들기|작성자 시퍼렁새
반응형
Posted by blueasa
, |

출처 - 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
, |




Game Programming Gems 2권에 나와있는 데칼알고리즘을 이용해서 데칼을 만들어보았다.

흠... 만들어보긴했는데... 아직 실전에 응용을 하지않아 효용성이 얼마나

있는지는 모르겠다.

 

탄젠트 벡터를 구하는데... GPG에서 사용해보라고하는 (1.0f, 0.0f, 0.0f)를 넣으니까

데칼이 이상하게 박힌다.  해당 벡터가 법선과 수직이 아니라서 발생하는 문제인듯하다.

지형에서만 사용가능한건지는 모르겠지만..

 

처음에는 픽킹된 폴리곤의 한정점과 픽킹된 점을 구해 탄젠트 벡터를 만들었다.

탄젠트 벡터가 테칼이 그려지는 방향에 영향을 주는 요소라.. 픽킹할때마다

그림의 방향이 바뀌게 된다.

 

그래서 탄젠트 벡터를 지정포지션과 법선벡터(0.0f, 1.0f, 0.0f)와 지정포지션을 정점으로

갖는 평면으로 지정포지션을 가지고있는 폴리곤을 분할해 충돌점을 구하고

지정포지션과 충돌점 사이의 벡터를 탄젠트 벡터로 주었다. 그러니까

나름대로 잘 나오는듯 한것 같다 ^^;

 

원래는 비공개로 할까 했는데... 어노인팅님이 저를 불사르시는군요..

ㅋ 그래서 공개자료로 전환합니다.

 

이소스는  NET2005 그리고 DX9.0c SDK를 필요로 합니다.

가져가실때 출처를 꼭 밝혀주세요.


출처 : http://blog.naver.com/swoosungi/90017269111

반응형

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

카메라 흔들기  (0) 2011.03.05
[게임코드]손쉽게 카메라 흔들기  (0) 2011.03.04
ifdef, if defined, ifndef, if !defined  (0) 2011.03.04
enum, 보다 나은 enum  (0) 2011.01.13
IME 소스 (한글)  (2) 2010.11.26
Posted by blueasa
, |


자존심님 이야기를 듣고 FreeType에 관해 찾아보았습니다.

일단 참고 홈페이지는 http://www.freetype.org/ 여기더군요...

프리타입에 관해 인터넷에서 자료를 찾아보니...

윈도우 보다는 리눅스에서 트루타입 폰트 레스터라이져를 위해

사용하는 라이브러리 같더군요... 그래서 링크를 찾아보니

리눅스용 라이브러리가 가장먼저 눈에 뛰인듯...

 

윈도우용 라이브러리는 http://gnuwin32.sourceforge.net/packages/freetype.htm

여기서 다운받는걸로 되있습니다.

http://prdownloads.sourceforge.net/gnuwin32/freetype-2.1.10.exe?download

 

여기서 freetype-2.1.10.exe 이 파일을 받고 설치하면

윈도우용 프리타입 sdk를 사용할수 있습니다.

 

추가로 프리타입라이브러리를 사용하는 어플리케이션의 실행파일은

freetype6.dll, zlib1.dll을 같이 필요로 합니다.

 

흠... 윈도우용 튜토리얼을 처음에 찾아봤는데... 찾기 쉽지않더군요...

gpg랑 데브피아에도 없고... 그래서 dx의 텍스쳐에 바로

트루타입폰트를 찍는 예제를 만들어보았습니다.

 

아 아크로드가 이 프리타입라이브러리를 사용하더군요 보니깐.. ^^;;;

 

추신 - 이소스는 프리타입에 관한 가장기본적인 기능만 튜토리얼로 만들어본겁니다.

아직 손봐야할 기능들이 많이 있습니다.

 

더 참고하시고 싶은분은 위사이트 프리타입 튜토리얼을 참조하세요


출처 : http://blog.naver.com/swoosungi/90024620229

반응형
Posted by blueasa
, |

#ifdef 는 정의되있는지를 테스트 하므로, 한번에 여러개를

사용할 수는 없다. 형식이 #ifdef name 처럼,

하나의 토큰이 되어야한다.

여러개가 정의되있는지 테스트 하기위해서는 
#if defined(MACRO1) || defined(MACRO2)처럼 사용.

단, #if는 ||로 중첩해서 사용할 수 있다.
형식이, #if expression이므로, C표현이 올수 있다.

#if MACRO1 || MACRO2 처럼 사용해도 된다.

 

 

#if !defined() 의 의미는 #ifndef 와 같다. (if not define)

()안의 내용이 정의되어 있지 않으면 그 아래부분 (#endif까지)을 유효한 소스코드로 인식하고 컴파일 시 적용하라는 의미다.

 

그런데 그 괄호안의 부분을 찾을 수가 없다는 것은

EXCLUDE_PGX_SUPPORT 가 아무데도 define되지 않았음을 의미

 

정의되어 있지 않으므로 해당 구문 이후의 소스코드는

유효한 코드가 된다.

 

#if !defined(...)

 

안의 내용은 유효코드

 

#endif

 

반대로, #ifdef (...)라면

해당 키워드가 정의되어 있지 않으므로

#endif  까지의 코드내용은 전부 무의미해진다.



출처 : http://blog.naver.com/ghostcbr954/110003736409

반응형
Posted by blueasa
, |

2003 프로젝트를 2008에서 컴파일 할때 발생..


Wp64 옵션을 주지 말라는 것

프로젝트 -> 속성 -> C/C++ -> 일반 -> 64비트 이식성 문제점 검색 : 아니요



출처 : http://blog.naver.com/ghostcbr954/110086888865

2차 출처 : http://boyfox009.egloos.com/2579554

반응형
Posted by blueasa
, |
참고 사이트
http://cafe.naver.com/mcbugi/32424 : [윈도우에서 Objective-C] Objective-C 기초는 윈도우에서!! -1강
http://cafe.naver.com/mcbugi/32425 : [윈도우에서 Objective-C] Objective-C 기초는 윈도우에서!! -2강
http://cafe.naver.com/mcbugi/32426 : [윈도우에서 Objective-C] Objective-C 기초는 윈도우에서!! -3강
http://cafe.naver.com/mcbugi/32427 : [윈도우에서 Objective-C] Objective-C 기초는 윈도우에서!! -4강

위 자료는 AppNext.com에서 제공하는 자료인 듯하다.

Object-C를 공부하기 위해서는 맥이라는 운영체제가 필요하다. 결국 본인도 해킨토시를....
맥부기 카페의 맨날할래님의 글에서 윈도우에서도 공부할 수 있는 방법을 알게 되었다.
기록의 차원에서 글을 남긴다. 자세한 내용은 위 링크의 본글에서 확인. 여긴 간략하게 요약.

기본적인 방법은 윈도우에서 Dev-Cpp를 이용하는 것이다.

1. 필요한 설치 프로그램들.
- GNUstep system 0.24.0
- GNUstep Core 0.23.1
- Dev c++
>>> 댓글에서 발견. 현재 GNUstep 패키지는 3개로 나뉘어졌다고 한다. 아래 링크에서 System, Core, Devel 3개를 모두 설치하면 된다고 한다.
http://www.gnustep.org/experience/Windows.html
2. 프로그램 설치

반응형
Posted by blueasa
, |
아래 블로그 내용대로 진행하다가 잘 되지 않아서 확실히 되는 놈으로 다시 정리했습니다...^^"

http://devian.tistory.com/149

---------------------------------------------------------------------------
요즘 애플 앱스토어가 붐이 일면서 중고 맥북 구하기가 힘들어졌다고 하던데...
가상 머신을 이용해서 iPhone 개발 환경을 꾸며 본다...

우선 Windows 기반 가상화 솔루션으로는 가장 유명한 VMWare 7을 기반으로 OS X dvd를 구해 설치하거나
OS X 기반 VMWare 가상머신을 바로 구해서 구동을 시켜도 무방하다.

OS X 10.6 (Snow Leopard) 설치 가이드 
VMWare 에서 OS X - Snow Leopard  설치하기 : OS X 가상 머신 만들기
VMWare 에서 OS X - Snow Leopard  설치하기 : OS X 설치하기
VMWare 에서 OS X - Snow Leopard  설치하기 : OS X 용 VMWare Tools 설치하기

OS X 10.5 (Leoard) 용 VMWare 이미지
첨부된 VMWare 이미지에는 VMWare Tools 가 설치되어 있지 않으므로 위 링크의 가이드에 따라 추가 설치해야 한다.
설치 중간에 Admin Password가 필요한데, 계속 틀리다 보면 알수 있게 된다....^^"
해당 버전 설치 후 OS Update를 하다보니 Crash가 발생했다...ㅠ.ㅠ



반응형
Posted by blueasa
, |

겜브리오의 파티클은 NiParticleSystem에서 관리한다이 클래스는 NiGeometry에서 파생되었고 모양도 가지고 있다또한 이 파티클이 키프레임에 의해서 제작되었다면 컨트롤러를 가지고 있다이 파티클에 대한 컨트롤러는 NiPSysEmitterClrl 이다.

NiParticleSystem은 수정자(modifier)를 가지고 있다이 수정자를 이용해 파티클 시스템의 전반적이 부분을 제어할 수 있을 것이다참고 수정자는 아래와 같다.

-       NiPSysAgeDeath(파티클의 나이와 죽음 관리)

-       NiPSysBoxEmitter(바운딩 볼륨 관리)

-       NiPSysSpawnModifier(파티클 생성 관리이지만 사용 못 해봤다.)

-       NiPSysGrowFadeModifier(파티클 크기나 성장을 관리)

-       NiPSysGravityModifier(파티클 중력 관리)

-       NiPSysPositionModifier(파티클 위치 관리)

-       NiPSysBoundUpdateModifier(사용 안해봤다.)

 

파티클의 양을 조절하기 위해서는 위의 수정자에서 해결하지 못한다그것을 하기 위해서는 파티클 시스템의 컨트롤러를 제어해야한다아티스트는 키프레임에 파티클의 양을 기록하기 때문인데 이것은 컨트롤의 NiInterpolator에 저장되어 있다우린 파티클 시스템의 컨트롤러를 얻고 그 컨트롤러에서 Interpolator를 얻어서 수정해야 파티클의 양이 조절될 것이다아마 이와는 다른 방법으로 파티클을 제작하였다면 그 때 NiPSysSpawnModifier가 작동되지 않을까 한다.

 

[기본소스]

void JrManagerParticle::Traverse(NiAVObjectpkAVObject)

{

        ifNiIsKindOf(NiParticleSystempkAVObject) )

        {

               NiParticleSystempkPaticleSystem = NiDynamicCast(NiParticleSystempkAVObject);

               NiTimeControllerpkControl = pkPaticleSystem->GetControllers();

               ifNiIsKindOf(NiPSysEmitterCtlrpkControl))

               {

                       NiPSysEmitterCtlrpkEmitterCtlr = NiDynamicCast(NiPSysEmitterCtlrpkControl);

                       NiFloatInterpolatorpkInterpolator = pkEmitterCtlr->GetBirthRateInterpolator();

                       pkInterpolator->SetPoseValue(100);

                       int t = 0;

               }

 

 

               int nTotal = pkPaticleSystem->GetModifierCount();

 

/*

               pkPaticleSystem->RemoveModifier(pkPaticleSystem->GetModifierAt(0));

               pkPaticleSystem->RemoveModifier(pkPaticleSystem->GetModifierAt(1));

               pkPaticleSystem->RemoveModifier(pkPaticleSystem->GetModifierAt(1));

               pkPaticleSystem->RemoveModifier(pkPaticleSystem->GetModifierAt(1));

               pkPaticleSystem->RemoveModifier(pkPaticleSystem->GetModifierAt(2));

*/

 

               for(int i=0;i<nTotal;++i)

               {

                       NiPSysModifierpPSysModifier = pkPaticleSystem->GetModifierAt(i);

                       ifNiIsKindOf(NiPSysSpawnModifierpPSysModifier) )

                       {

                              NiPSysSpawnModifierpParticleModifier = NiDynamicCast(NiPSysSpawnModifierpPSysModifier);

                       }

 

                       ifNiIsKindOf(NiPSysGravityModifierpPSysModifier) )

                       {

                              NiPSysGravityModifierpParticleModifier = NiDynamicCast(NiPSysGravityModifierpPSysModifier);

                       }

 

                       ifNiIsKindOf(NiPSysBoxEmitterpPSysModifier) )

                       {

                              NiPSysBoxEmitterpParticelEmitter = NiDynamicCast(NiPSysBoxEmitterpPSysModifier);

                              //pParticelEmitter->SetSpeed(1.0f);

                              //pParticelEmitter->SetLifeSpan(10);

                              //pParticelEmitter->SetLifeSpanVar(1000);

                              //pParticelEmitter->SetEmitterWidth(5);

                       }

 

//                     NiPSysAgeDeathModifier* pAgeDeathModifier = (NiPSysAgeDeathModifier*)pPSysModifier;

//                     NiPSysSpawnModifier* pPSysSpawnModifier = pAgeDeathModifier->GetSpawnModifier();

//                     pPSysSpawnModifier->SetMaxNumToSpawn(0);

//                     pPSysSpawnModifier->SetMinNumToSpawn(0);

 

                       //pkPaticleSystem->RemoveModifier(pPSysModifier);

                       int c = pkPaticleSystem->GetModifierCount();

                       int t = 0;

 

                       //pPSysModifier->SetActive(false);

               }

               int c = pkPaticleSystem->GetModifierCount();

               int t = 0;

        }

 

        ifNiIsKindOf(NiNodepkAVObject) )

        {

               NiNodepkNode = NiDynamicCast(NiNodepkAVObject);

               for(unsigned int i=0;i<pkNode->GetArrayCount();++i)

               {

                       Traverse(pkNode->GetAt(i));

               }

        }

}



출처 : http://talkon.egloos.com/498126

반응형

'Gamebryo > Effect' 카테고리의 다른 글

강의자료 - 파티클 예제  (0) 2011.03.22
Setup about Effect Dumy…  (0) 2011.03.21
이펙트 출력  (0) 2011.02.08
이펙트 작업에 필요한 기능  (0) 2011.01.27
검광, 검기 잔상 효과에 대하여...  (1) 2011.01.21
Posted by blueasa
, |

- 작성자:고리(goli81@naver.com) -

 

UnderWater(바다속효과)

 

소개 :
        바다 안에서 일어나는 이미지 굴절 효과와 빛이 비춰지는
        모양을 표현해 보았다.

 

구현:
1. 전체 랜더링 될 화면을 캡쳐한다.
2. 캡쳐된 화면을 RHW로 화면에 그리고 sin, cos을 통해서 Vertex를
   흔들어 줘서 물이 울렁이는 효과를 준다.
3. Projection Mapping을 이용하여 수면에서 빛이 들어오는 효과를
   구현한다.
4. Fog를 적절히 사용하여 Camera의 뒤쪽에 있는 물체를 서서히
   없애면서 더욱 실감나는 효과를 연출한다.


후기:
DirectX의 Dolphin예제를 참고해서 만들었고 거기다가 화면을 캡쳐해서
물이 울렁거리는 효과를 구현하니 더욱더 실감이 나는거 같다.
실제 게임에 적용하기에는 간단하면서도 강력한 기능 인것 같다.

 

Source & Demo
Compiler: VS.NET 2003


 





반응형

'Programming > D3D' 카테고리의 다른 글

SetRenderState 정리  (0) 2011.09.05
D3D화면에 WebPage 출력하기  (0) 2011.02.19
Posted by blueasa
, |