블로그 이미지
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
Setup about Effect Dumy…




작성 / 이 정 표

leegoongtr@naver.com








2006년 7월 을 기준으로 하여 팔에 붙는 더미는 1개로 통합 되었음을 미리 말씀 드립니다.

해당 이미지는 7월 이전의 셋팅에 기준 한 것이니 착오 없길 바랍니다.

하나로 통합 될 foot dumy 는 center dumy 와 같은 이름의 형식으로 바이펫의 footstep 위치에 위치 하게 됩니다. 법석씨께 확인 바랍니다.








더미의 생성 : 적당한 크기로 처음 생성하십시오.처음 생성하면 스케일값 100 으로 설정 됩니다.어떤 크기로 생성 하던지 초기 값은 아마 100 으로 설정 될겁니다.

가능한 더미의 크기를 변형 하지 마십시오.처음 생성할 때 적당한 크기로 생성을 해야 합니다.






더미의 위치 : 생성한 더미를 선택하고 해당 이름을 정해 준 후 해당 파트 즉 R_Handdumy 라고 한다면 이 더미를 선택하고 얼라인 툴로 바이펫의 RHand 에 정렬하도록 합니다. 정렬할때 피봇포인트가 아니라 센터 로 설정 하고 하시면 됩니다.

또는 셋팅 하시는 분이 어느정도 감으로 위치를 잡으셔도 무방합니다.

이 더미는 손에 붙을 이펙트의 위치를 잡기 위함과 무기 아이템의 위치 기준 더미가 될 것입니다.








위치를 모두 잡았다면 더미의 로컬 피봇을 확인합니다.

로컬피봇은 Up Vector 가 Z 로 되어 있어야 합니다.

만약 이 설정을 할 때 피봇이 잘 못 되어 있다면 아래 그림과 같이 Affect Pivot Only 활성후 Align to World 하면 큰 문제 없을 것입니다.





모든 피봇 셋팅이 끝났다면 모든 해방 더미를 해당 바이펫 노드에 차일드로 링크 걸어 줍니다.

단 Spinedumy 는 바이펫의 Spine 이 3 개 라고 가정 하에 Bip01 Spine1 에 걸도록 합니다.

























마지막으로 더미에 겜브리오 고유 속성을 붙혀 줘야 합니다.





더미를 모두 선택 하고 Keep 이라고 붙어 있는 아이콘을 클릭하여 팝업창을 엽니다.

위 그림처럼 체크박스에 체크 한 후 Apply to Selection This 버튼을 클릭 한 후 프로퍼티 유저 디파인을 보고 고유 속성이 잘 붙어 있는지 확인 합니다.

NiOptimizeKeep 이라고 붙어 있으면 된겁니다.

위치는 상관 없습니다.

이렇게 하여 더미의 기본 셋팅은 끝납니다.

반응형

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

[펌] 이펙트 에니메이션 방법  (1) 2011.05.20
강의자료 - 파티클 예제  (0) 2011.03.22
파티클 컨트롤 해보기  (0) 2011.02.24
이펙트 출력  (0) 2011.02.08
이펙트 작업에 필요한 기능  (0) 2011.01.27
Posted by blueasa
, |
실수는 정수부(Integer Parts)와 소수부(Fractional Parts)로 이루어져 있습니다.

123.456789555 라는 실수에서

123 이 정수부이고

.456789555 가 소수부입니다. 정수부와 소수부를 분리하여 얻는 함수가

math.h 헤더 파일의

double modf(double x, double *ipart);

입니다. 소수부는 직접 반환하고, 정수부는 ipart 에 정수가 아닌 실수형으로 넣습니다.


정수부/소수부 분리, 소수점 이하만 구하는 함수 예제: modf() Function Example


파일명: 0.cpp
#include 
#include 


int main(void) {

  double integer, fraction;
  double n = 123.456789555;

  fraction = modf(n, &integer);

  printf("%.9f = %.f + %.15f\n", n, integer, fraction);


  return 0;
}


integer 변수에 정수부가 들어가는데 정수형이 아닌 실수형으로 들어갑니다. 그래서 %.f 이런 포맷 지정자를 사용하여 정수로 출력했습니다.

fraction 변수에는 소수부가 들어갑니다.


컴파일 및 실행 결과:
D:\Z>cl /nologo 0.cpp && 0.exe
0.cpp
123.456789555 = 123 + 0.456789555000000

D:\Z>

정수부와 소수부가 나누어졌습니다.

그런데 소수부가 그리 정밀하게 구해지지는 않았습니다.





modf 함수 없이, 실수에서 소수부 구하기


다음과 같이 할 수도 있습니다:
#include 
 
int main(void) {

  double n = 123.456789555;

  printf("%.9f = %d + %.15f\n", n, (int) n, n - (int) n);

  return 0;
}
[출처] http://mwultong.blogspot.com/2006/12/c-get-fractional-part-only.html


처 : 
http://sunnmoon.egloos.com/2218722
반응형

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

strncmp 와 memcmp  (0) 2011.07.14
fmod double형 나눗셈의 나머지 구하기  (0) 2011.03.24
이름공간(namespace)의 함정.  (0) 2011.03.13
카메라 흔들기  (0) 2011.03.05
[게임코드]손쉽게 카메라 흔들기  (0) 2011.03.04
Posted by blueasa
, |

네덜란드인가... 그 지역의 배경으로 하는 이야기중.. 댐을 막는 이야기가 있다.. 작은 구멍을 막지 않고 방치하여 홍수가 났다는 그런이야기인데....

큰 비로 홍수가 나는것처럼 한순간에 마음으로 들어올수도있지만 작은 구멍을 그냥 방치해서 마음이 흘러가는데로 나두다 어느순간에는 막지못하는 지경에 이르러 지칠때까지 막다가 결국..

 

<-선덕여왕 미실의 대사중>

목표를 위해서 사람을 이용하는것보다 사람이 목표가 되는것이 위험하다했다. 맞는말인것 같다.... 그렇지만 어쩔수없나보다.

 

 

 

GameBryo 에서 Fx Shader 를 사용하려고 하면 편리하게 제공된 클래스가 있다. Full Demo에서 사용되어지는 ShaderHelper 라는 클래스인데.. 간단히 어플리케이션 시작시 초기화와 끝날시 해제를 하여준다면 ShaderHelper에서 사용자가 설정한 디렉토리에 쉐이더파일(Fx.등등)에 쉐이더를 모아둔다면 로딩과 해제를 하여준다..

 

처음 Fx파일이 로딩될시 GameBryo Library에 보면 이 쉐이더파일을 Parsr하는  NiD3DXEffectParser라는 클래스가 있다. 이 파서에 보면 GameBryo가 어떤식으로 Fx Shader에 Application에서 Dx를 통해 제공하는 매트릭스(world, view, worldview) 등을 넘기는지를 알수있는데 그것이 세만틱과 각종 주석들이다..(물론 이건 나도 처음부터 궁금했었지만 최근에야 알게되었다, Help파일에 있드라.. 미리좀 자세히 바뒀으면..) 주석에는 desc, description, uihelp, hidden, uiwidget, none name, target, obejct, objectindex... 기타등등이 있고 Semantic을 파서하는 내용을 보면.. 세만틱 내용에 it, trans, transpose, inv, i, inverse, model, space, 기타등등의 이름을 찾아서 있으면 그것을 넘기는 식이다.. 예를들어..

float4x4 viewInv : ViewInverse < string UIType = "None"; >;  
float4x4 viewInv : InvView < string UIType = "None"; >; 

 

위 코드가 있다면 이것을 파서하여 해당단어들의 존재유무로 매트릭스를 넘긴다.위 두개코드에서 넘겨받는 viewInv는 동일하다. 세만틱에 View라는것이 있고 Inverse나 Inv가 존재하면 그걸을 InverseView로 인식하는 식이다. 다른것도 마찬가지이고 SKINBONEMATRIX3 라는 세만틱이 존재하고 그것을 이용한다면 메쉬를 Hardware skinning으로 처리하여 스킨계산을 application에서 하지 않는다.

 

맥스에서 쉐이더로 설정한 값들은 메쉬에 쉐이더 주석의 이름으로 ExtraData로 넘겨져서 들어가져 있어 셋팅을 변화하고자할때는 이 ExtraData를 찾아서 값들을 세팅하여 주면되고 맵등은 메쉬의 TexturingProperty에 shadermap 을 변경하여 주면된다.

 

그 밖에 특정 쉐이더를 직접 어떠한 노드구조 하위에 입히고자 할때에는 아래처럼 하면 된다.

void FindGeomSetMaterial(NiAVObject* pkAVObject, bool bMarkedParent, int nID)
{
  if (NiIsKindOf(NiGeometry, pkAVObject))
  {
  NiMaterial* pkMaterial;
  pkMaterial = NiSingleShaderMaterial::Create("GB_NomalOutLine_TEST");
  //if (bMarkedParent || strstr(pkAVObject->GetName(), "PlanarOccluder"))
   {
   NiGeometry* pkGeom = (NiGeometry*)pkAVObject;
   pkGeom->ApplyAndSetActiveMaterial(pkMaterial);

   const NiMaterial *pkMat = pkGeom->GetActiveMaterial();
   }
  }
  else if (NiIsKindOf(NiNode, pkAVObject))
  {
       // bool bMarked = false;
       // if (strstr(pkAVObject->GetName(), "Occluder"))   // 해당노드의 이름에 Occluder가 들어간 놈들만은. 머 이런식으로..
         bool   bMarked = true;

        NiNode* pkNode = (NiNode*)pkAVObject;

        unsigned int uiChildren = pkNode->GetArrayCount();
        for (unsigned int ui = 0; ui < uiChildren; ui++)
        {
            NiAVObject* pkChild = pkNode->GetAt(ui);
            if (pkChild)
                FindGeomSetMaterial(pkChild, bMarked, nID);
        }
    }
}

[출처]
 < Tips >: Using Fx Shader In GameBryo |작성자 메딥


반응형

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

알파 텍스쳐 블렌딩 공식  (0) 2011.07.22
[펌] Soft Particle (Depth bias blend)  (0) 2011.06.15
쉐이더  (0) 2011.04.04
HDR  (0) 2011.04.04
겜브리오 쉐이더 제작시 주의사항  (0) 2011.04.04
Posted by blueasa
, |

 

 우선적으로  천몽(iliyard)님이 올리신 내용을 기초로 하여 필요부분을 추가 서술했음을 알려드립니다.

 

 1.    Overview

· 타격감이란??..

  말 그대로 게임내에서 유저가 상대방을 때릴 때나 피격시 느낌을 얼마나 잘 받을수 있게 해주는가를 말하는 것. 이 타격감을 향상 시키기 위해서는 여러가지

  요소가 있는데 각 요소들 완성도를 높여 타격감을 극대화시키는데 중점을 둔다.

 

2.    Animation

    2.1 공격 동작

        2.1.1 무기에 따른 적절한 동작

                ·무기의 종류에 따라 적절한 동작을 해야 한다. , 무기가 칼이냐 도끼냐에 따라 공격 애니메이션이 틀려야 한다.

 

        2.1.2 중량감 표현

                ·같은 무기더라도 어떤 타입이냐에 따라 그 무게가 달라진다. 단검처럼 가벼운 무기는 움직임도 가벼워야 하고 양손 무기처럼 무거운 무기는 

                   움직임에 무게감이 느껴져야 한다. 즉 무게의 차이는 공격속도와 밀접한 관계를 가진다.

 

        2.1.3 속도의 완급 조절

                ·공격을 할때에는 단순히 휘두르기만 하지 않는다. 2.1.2 중량감 표현에서도 설명했듯이 각 무기별로 무게가 다르기때문에 공격 준비동작이나

                    공격시 동작이 각각 다른 속도및 다른 가속도를 가지고 있다.  

                    단검의 경우 무게가 가볍기 때문에 준비동작 자체가 굉장히 짧고, 공격속도로 일정하며, 양손검이나 양손둔기같이 무거운 무기류는 무거운 무게 

                    때문에 준비동작이 긴 반면 가속도는 점점 빨라지게 된다. 

 

    2.2  피격 동작

             ·가장 이상적인 피해 동작은 모든 공격에 대해 대응하는 동작이 있는 것이다. 하지만 그러기엔 게임제작상 리소스가 너무 많이 필요하니 타입에

                따라 몇가지로 축소한다. 보통 2종에서 4종(단순피격, 크리티컬피격, 스턴, 넉백)으로 줄여서 표현하는 경우가 많다.

 

        2.2.1 방향

             · 왼쪽, 오른쪽, 중앙, 후면에서 힘이 가해졌다는 느낌이 들도록 각각의 피격 동작을 만든다.(이 또한 리소스 제약상 줄여서 표현하는 경우가 많다.)

             · 중앙인 경우는 찌르기 공격이나 원거리 공격에 대한 피해 동작으로 맞춰 만든다.

 

        2.2.2 데미지 세기

             · 크리티컬 데미지나 특정 스킬 공격을 받았을 경우에는 뒤로 날라가서 넘어지는 동작(넉백)을 만든다.

 

   3. 프레임 정지

        · 주로 대전 격투류 게임에서 많이 표현되는 표현방법. 타격시 일정프레임을 정지시킨후  다시 그 다음 애니메이션시 정지된 프레임시간부터 나머지

               애니메이션 시간만큼을 빠르게 돌리는 방법. 잠깐의 프레임동안 정지되어 있어서 타격이나 피격에 대한 인지가 강하게 되며, 후에 정지되어 까먹은

               프레임만큼 빨리 돌리더라도 시각적으로는 빠르다고 인지하기가 어렵다. (물론 정지시간이 많으면 인지가 됨 ^^)

 

3.    이펙트

    3.1. 궤적(Trail)

         · 실제 세계에서 칼의 움직임은 연속적이지만 게임에서 칼의 움직임은 비연속적인 칼의 위치들을 나타내는 프레임들을 모아놓은 것이다. 따라서 빠른

             공격 애니메이션의 경우 칼이 움직임이나 어떤 부위를 공격하고 있는지 알아내기란 쉽지 않다. 특히 게임플레이시 FrameRate(초당 프레임수)

             에도 많은 영향을 받는다. 다음과 같은 궤적 효과를 사용함으로써 칼의 움직임이나 공격의 영향이 미치는 범위를 보여준다.

         · 궤적을 나타내는 방법에는 메쉬, 파티클, 왜곡효과및 혼합하여 사용경우도 많다. 

 

 


 

       3.2 파티클(Particle)

               · 대부분의 이펙트에 적용되는데 마법류표현에서 더 많이 쓰인다. 

 

[공격의 방향을 나타내기 위한 2D 파티클 - 피표현- ]

 

 


 


 

 [공격 이펙트]

 

 

         3.3 광원[Light)

                 · 적을 가격하거나 피격 당하는 순간 캐릭터의 타격 지점 & 지형에 광원을 표현 함으로서 타격감을 증진시키는데 중요한 역할을 한다.

                      타격감을 표현하는데 있어서 필수적인 요소중 하나다. 하지만 광원표현은 실시간 계산이 이루어져야 하는만큼 게임 플레이시 상당한

                      포퍼먼스를 요구한다. 고사양을 지향하는 게임이면 모를까 저사양을 고려한 게임이라고 한다면 표현의 한계를 가진다.


 

        3.4 위치

             · 타격 이펙트중 피격자의 몸에서 나타나는 이펙트의 위치는 무기와 피격자가 부딪히는 부분에서 터지게 한다. 이때 그 위치를 계산하기

                 어렵다면 공격 종류에 따라 그 위치를 미리 정해놓는다.

 

        3.5 타이밍

             · 타이밍을 맞추는데는 두 가지 방법 프레임 체크와 시간 체크가 있다.(개발사마다 기준이 다르다.) 

             · 그러나 프레임 체크 방식이 시간 체크 방식보다 정교 하므로 가능한한 프레임 체크 방식(1초=30프레임)으로 한다.

             · 현재 설명중인 모든 요소들이 이 타이밍이 서로 맞지 않으면 어떠한 타격감도 얻을수 없다. 타격위치, 시간, 반응등 모든것이 각기 적절한

                  타이밍 속에서 빛을 발한다.

 

           3.5.1 프레임 체크

                 · 보통 Collision Box를 이용하여 무기가 피격체에 닿았을때 자동으로 필요 이펙트를 표현해 주기도 하지만 이는 플레이시 항상 계산을

                      하고 있어야 하기 때문에 많은 퍼포먼스를 요구한다. 그리하여 공격자의 공격 애니메이션 총 20 프레임이라고 할 때 15 프레임이 무기가

                      적에게 닿는 프레임이라고 하면 그 순간 이펙트를 터트려 주는 방식으로 하여 퍼포먼스를 줄이기도 한다.   

           3.5.2 시간 체크

                 · 프레임 체크방식과 개념은 같다. 공격자의 공격 애니메이션 총 20 프레임이라고 할 때 15 프레임이 무기가 적에게 닿는 프레임이라고

                      하면 1 프레임에서 15 프레임까지의 사간을 계산해서 0.7초라고 한다면 애니메이션이 시작 한 후 0.7초가 지난 다음에 이펙트를 터트려

                      주도록 한다.

 

4. Sound Effect

 · 사운드 효과는 타격감을 살리는데 매우 중요한 역할을 하는데 공격자의 무기 종류와 피격자의 보호구에 따라 그 효과음이 달라져야 한다.

 

 

5. 카메라

    5.1 카메라 흔들기(Camera Shake) 

          · 짧은 시간안에 화면을 랜덤하게 흔들어 주는 방법인데 강력한 공격(크리티컬 데미지)이나 폭발을 일으키는 공격시에 이용한다.

              보통 영화나 미디어의 연출시 많이 사용하는 방식이었으나 게임산업이 발전함에 연출을 강조하는 추세이니 만큼 Camera Shake표현

              또한 많이 해주고 있다. (CameraShake에 대해서는 따로 게시예정)

 

    5.2 카메라 전환(Camera Move)

         · 무기의 중량감이나 강력함, 공격 방향등 공격 효과를 좀 더 극대화 시키기 위한 방법이다.

         · 거대한 검을 수평 방향 왼쪽으로 휘드르게 될 때 그 검이 적에게 맞는 순간 카메라를 왼쪽으로 약간 이동시킨다. 위로 솟구쳐 올리는

             공격일 경우에는 카메라를 위로, 수직 방향으로 내려치는 공격일 경우에는 카메라를 아래로 약간 이동시킨다.

 

6. 동기화(Sync)

        · 위에서 설명한 타이밍과 유사하다고 할수 있다. 하지만 위의 타이밍은 각각의 동기화라고 한다면 현재 설명하는 동기화는 연출전체의

             타이밍이라고 보면 이해가 빠를것이다. 예를 들어 A라는 캐릭터 B라는 몬스터를 공격하는데 A가 공격이 끝나기도 전에 몬스터가

             맞는 동작을 취한다거나 A가 공격 했는데도 불구하고 한 템포 느리게 반응한다면 타격감을 느끼기 힘들다.

        · , 액션이 취해지면 그에 따른 피드백의 타이밍이 적절해야 한다. 이를 위해서는 클라이언트쪽에서의 어느 정도의 연출이 필요하다.

             예를 들어 A B를 때리는 동작에 들어갈 때 서버에 공격 메시지 패킷을 보내면 서버에서는 B가 입는 데미지를 계산하여 클라이언트에

             보내주는데 이때 A의 공격 동작이 다 끝나기도 전에 데미지 패킷이 도착한다면 클라이언트는 데미지를 바로 적용시키는게 아니라 이걸 보관

             하고 있다가 A의 공격 동작에 맞춰서 이펙트와 함께 B는 맞는 동작을 취하며 에너지가 깎이는 식이다.

 

7.    기타

    7.1 데미지 표현

        · 데미지를 입거나 입혔을 때 얼마만큼의 데미지를 입혔는지를 알려주는데 데미지 수치 또한 연출이 필요하다.

            (UI 연출 이펙트로 명명하는 경우가 많다.) 

        ·애니메이션이나 이펙트는 임펙트있게 표현되는데 실제 데미지 수치는 밋밋하게 그냥 뜬다면 좀 뭔가 부족하지 않은가?

     7.2 반전 (Invert)

        · 타격이나 피격시 좀 더 명확하게 인지 하기 위하여 인위적으로 캐릭터나 배경전체의 색을 반전시키는 기법을 말한다.

 

[캐릭터 반전기법의 예]

    7.3 배경블랜딩

       · 이펙트는 주로 어두운 배경에서 그 화려함이 가중된다. 하지만 밝은 캐주얼느낌의 게임이나 한낮의 밝은 필드에서 전투시 이펙트를 화려하게 표현한다

             해도 하얗게 색이 발해버리는 경우를 본적이 있을것이라 생각한다. 이와 같은 경우를 줄이기 위해서 일부러 마법사 같은 법사캐릭의 경우 스킬

             시전시 자신의 캐릭터나 피격되는 캐릭을 제외한 나머지 요소에 대해 일시적으로 어둡게 톤을 낮추어 이펙트 표현 뿐만아니라 시각적으로 집중도를

             높혀 타격감을 배가 시키는 방법이다.

 

타격감에 대해 글을 써보려 했는데 마침 천몽님의 글을 발견하여 더 쉽게 글을 쓸수 있었던듯 하다.

이펙터라면 이런 타격감의 종류와 표현 방식에대해 어느 디자인 파트보다 더 자세히 알고 있어야 한다고 생각한다.

추후 이 타격감요소에 대해 각각 상세 예시를 올려보겠습니다. 

반응형

'Tip & Tech' 카테고리의 다른 글

DLL 사용한다면 참고하세요  (0) 2011.04.19
미들웨어 정리  (0) 2011.04.13
예외 처리 ~~ tip  (0) 2011.02.08
디버깅 메세지 출력 매크로 수정판  (0) 2011.01.31
GPG 명예의 전당.베스트 오브 베스트  (0) 2011.01.21
Posted by blueasa
, |

name1 라는 이름공간과, 이에 속해있는 이름공간 name2 가 있고,

각각에는 Parent라는 이름을 가진 클래스가 있다고 하자. 


즉, name1::Parent 와 name1::name2::Parent 클래스가 있는 상황이다.


이 때, Child라는 이름의 클래스를 하나 만들려고 한다.

name1::Parent 을 상속하며, 멤버 변수로는  name1::name2::Parent 클래스의 포인터를 가진다.


작업하는 코드의 상황은 이렇다.



이름은 Parent 로 같지만, 이름공간이 다른 이것들을 어떻게 표현해야할까?



본래, 자신이 있는 이름공간을 우선으로 검색되는 것이 기본 룰이지만, 이 경우는 예외다.




주목해야할 부분은 멤버 변수 선언 부분의 name2::Parent  이다.

자신이 name2 이름공간에 있음에도 불구하고, name2를 붙여주었다.


상속하는 클래스의 이름은 지금 있는 이름공간보다 우선시 되기 때문이다.


즉, name2를 명시하지 않고 단순히 Parent *p; 로 멤버 변수를 선언한다면,

p는 name2::Parent*형이 아니라 name1::Parent*형이 되어버린다.


출처 : http://blog.naver.com/doogie90/130102637818

반응형
Posted by blueasa
, |

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

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

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

 

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