Gamebryo/Effect

파티클 컨트롤 해보기

blueasa 2011. 2. 24. 23:29

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

반응형