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

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
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

겜브리오의 파티클은 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
, |