겜브리오의 파티클은 NiParticleSystem에서 관리한다. 이 클래스는 NiGeometry에서 파생되었고 모양도 가지고 있다. 또한 이 파티클이 키프레임에 의해서 제작되었다면 컨트롤러를 가지고 있다. 이 파티클에 대한 컨트롤러는 NiPSysEmitterClrl 이다.
NiParticleSystem은 수정자(modifier)를 가지고 있다. 이 수정자를 이용해 파티클 시스템의 전반적이 부분을 제어할 수 있을 것이다. 참고 수정자는 아래와 같다.
- NiPSysAgeDeath(파티클의 나이와 죽음 관리)
- NiPSysBoxEmitter(바운딩 볼륨 관리)
- NiPSysSpawnModifier(파티클 생성 관리이지만 사용 못 해봤다.)
- NiPSysGrowFadeModifier(파티클 크기나 성장을 관리)
- NiPSysGravityModifier(파티클 중력 관리)
- NiPSysPositionModifier(파티클 위치 관리)
- NiPSysBoundUpdateModifier(사용 안해봤다.)
파티클의 양을 조절하기 위해서는 위의 수정자에서 해결하지 못한다. 그것을 하기 위해서는 파티클 시스템의 컨트롤러를 제어해야한다. 아티스트는 키프레임에 파티클의 양을 기록하기 때문인데 이것은 컨트롤의 NiInterpolator에 저장되어 있다. 우린 파티클 시스템의 컨트롤러를 얻고 그 컨트롤러에서 Interpolator를 얻어서 수정해야 파티클의 양이 조절될 것이다. 아마 이와는 다른 방법으로 파티클을 제작하였다면 그 때 NiPSysSpawnModifier가 작동되지 않을까 한다.
[기본소스]
void JrManagerParticle::Traverse(NiAVObject* pkAVObject)
{
if( NiIsKindOf(NiParticleSystem, pkAVObject) )
{
NiParticleSystem* pkPaticleSystem = NiDynamicCast(NiParticleSystem, pkAVObject);
NiTimeController* pkControl = pkPaticleSystem->GetControllers();
if( NiIsKindOf(NiPSysEmitterCtlr, pkControl))
{
NiPSysEmitterCtlr* pkEmitterCtlr = NiDynamicCast(NiPSysEmitterCtlr, pkControl);
NiFloatInterpolator* pkInterpolator = 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)
{
NiPSysModifier* pPSysModifier = pkPaticleSystem->GetModifierAt(i);
if( NiIsKindOf(NiPSysSpawnModifier, pPSysModifier) )
{
NiPSysSpawnModifier* pParticleModifier = NiDynamicCast(NiPSysSpawnModifier, pPSysModifier);
}
if( NiIsKindOf(NiPSysGravityModifier, pPSysModifier) )
{
NiPSysGravityModifier* pParticleModifier = NiDynamicCast(NiPSysGravityModifier, pPSysModifier);
}
if( NiIsKindOf(NiPSysBoxEmitter, pPSysModifier) )
{
NiPSysBoxEmitter* pParticelEmitter = NiDynamicCast(NiPSysBoxEmitter, pPSysModifier);
//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;
}
if( NiIsKindOf(NiNode, pkAVObject) )
{
NiNode* pkNode = NiDynamicCast(NiNode, pkAVObject);
for(unsigned int i=0;i<pkNode->GetArrayCount();++i)
{
Traverse(pkNode->GetAt(i));
}
}
}
출처 : http://talkon.egloos.com/498126