-
Notifications
You must be signed in to change notification settings - Fork 7
Particle How to_KOR
이 문서는 fastbird engine의 파티클 시스템에 대해 설명합니다.
Particle Emitter는 아래와 같이 정의됩니다. 아래 내용은 data/particles/7_explosion.particle 의 일부분입니다.
<ParticleEmitter emitterLifeTime="1.0" emitterID="7">
<ParticleTemplate texture="data/particles/nova.png" emitPerSec="0" numInitialParticle="1"
cross="false" blendMode="Additive" preMultiAlpha="true" stretchMax="0"
glow="1.0" emitTo="WorldSpace" range="Point" rangeRadius="0.0"
uvAnimColRow="1, 1" uvAnimFramesPerSec="0"
lifeTimeMinMax="1.0, 1.0" align="Billboard" DefaultDirection="0, 1, 0"
sizeMinMax="0.5, 1.0" sizeRatioMinMax="1.0, 1.0" pivot="0.5, 0.5"
scaleVelMinMax="0.00, 0.00" scaleVelRatio="1.00, 1.00"
scaleAccel="5.0" scaleAccelUntil="10 percent" scaleDeaccel="20.0" scaleDeaccelAfter="90 percent"
velocityMinMax="0.0,0.0" velocityDirectionMin="-1, -1, -1" velocityDirectionMax="1, 1, 1"
accel="0" accelUntil="0 percent" deaccel="0" deaccelAfter="0 percent"
rotMinMax="0, 0 deg" rotSpeedMin = "35" rotSpeedMax="15"
rotAccel="0 deg" rotAccelUntil="0 percent" rotDeaccel="0 deg" rotDeaccelAfter="100 percent"
fadeInUntil="20 percent" fadeOutAfter="80 percent"
Intensity="1.0, 1.0"
/>
<!-- for Point lights -->
<ParticleTemplate pointLightRangeMinMax="4, 8" emitPerSec="0" numInitialParticle="1"
color="0.95, 0.95, 0.8, 1.0" colorEnd="0.85, 0.85, 0.5, 1.0"
lifeTimeMinMax="0.1, 0.15"
emitTo="localSpace" range="Point" rangeRadius="0.0"
scaleVelMinMax="0.01, 0.05"
scaleAccel="1" scaleAccelUntil="10 percent" scaleDeaccel="10.0" scaleDeaccelAfter="90 percent"
velocityMinMax="0,0" velocityDirectionMin="-1,-1,-1" velocityDirectionMax = "1, 1, 1"
accel="0" accelUntil="0 percent" deaccel="0" deaccelAfter="0 percent"
fadeInUntil="0 percent" fadeOutAfter="80 percent"
Intensity="1.0, 1.6"
/>
</ParticleEmitter>
구성 요소를 하나씩 살펴보면
-
<ParticleEmitter>
- emitterLifeTime : 에미터의 지속시간입니다. -1은 무한대 입니다.
- emitterID : 고유 아이디로 파티클 로딩 함수의 인자로 사용됩니다. 파일 이름으로도 로딩할 수 있습니다.
-
<ParticleTemplate>
: 1개 이상 정의될 수 있습니다.- texture : 사용할 텍스쳐 파일
- emitPerSec : 초당 생성될 파티클 수
- numInitialParticle : 에미터 생성시점에 바로 생성되는 파티클 수
- cross : 쿼드가 아니라 십자가 형태로 렌더링 하고 싶을 때 true.
- blendMode : Additive, AlphaBlend, InvColorBlend, Replace 를 지정할 수 있음
- preMultiAlpha : 최종 결과 생상에 알파를 곱해서 출력할지 여부
- stretchMax : 에미터의 속도에 따라서 파티클을 늘리고 싶을 경우 사용합니다.
- glow : 파티클 주변 glow 파워
- emitTo : 뿌려진 파티클이 에미터와 함께 움직일지 독립적으로 움직일지 여부. WorldSpace면 독립적, LocalSpace면 함께 움직임
- range / rangeRadius : 파티클 생성 포지션 지정
- uvAnimColRow : texture가 uv 에니메이션을 위한 텍스쳐일 경우 행과 열 개수를 입력
- uvAnimFramesPerSec : 에니메이션 초당 프레임수. 0을 지정하면 파티클 라이프타임동안 1회가 재생됨.
- lifeTimeMinMax : 생존시간 최소 최대값
- align : 정렬 타입.
- billboard : 카메라를 향함
- direction: u방향이 emitter의 forward에 정렬됨
- DefaultDirection : 사용되지 않음
- Scale
- sizeMinMax: 크기 최소 최대값
- sizeRatioMinMax : u과 v의 비율. 정사각형이면 1.0, u가 2배 길면 2.
- scaleAccel : 가속도
- scaleAccelUntil : 가속이 끝나는 시간
- scaleDeaccel : 감속도
- scaleDeaccelAfter : 감속이 시작되는 시간
- Velocity
- velocityMinMax : 속도 최소 최대 값
- velocityDirectionMin/Max : 방향 랜덤 값
- accel/deaccel : 가속도 감속도
- accelUntil/deaccelAfter : 가속이 끝나는 시간, 감속이 시작되는 시간
- Rotation
- rotMinMax : 회전 최소 최대 값
- rotSpeedMin/Max : 회전 속도 최소 최대 값
- rotAccel/Deaccel : 회전 가속 감속 값
- rotAccelUntil/rotDeaccelAfter : 회적 가속 끝 / 감속 시작 시간
- fadeInUntil/fadeOutAfter : 페이드인이 끝나는 시간 / 페이드아웃이 시작되는 시간
- Intensity : 생상 발기 최소 최대 값.
- color, colorEnd : 컬러 에니메이션을 위한 속성입니다. 파티클 라이프 타임 값에 의해 이 두 색상의 보간 결과가 최종 색상이 됩니다.
한 emitter가 여러 종류의 파티클을 발생시킨다면 <ParticleTemplate>
을 여러개
정의하면 됩니다.
추가. 2015년 2월 - 포인트 라이트 에미터
-
<ParticleTemplate>
의 속성- pointLightRangeMinMax : 포인트라이트의 범위를 지정합니다.
- color, colorEnd : 포인트 라이트의 색상을 선택합니다.
파티클 에미터는 아래와 같이 사용할 수 있습니다.
IParticleEmitter* pEmitter = gEnv->pEngine->GetParticleEmitter(7, false); // 파티클 객체를 얻어온다. 한번 얻어온 객체는 캐싱된다.
pEmitter->SetPos(...)
pEmitter->Active(true); // 에미션을 시작하고 장면에 추가한다.
임시로 끌때는 pEmitter->StopImmediate(); // 갑자기 꺼짐 혹은 pEmitter->Stop(); // emittion이 중단되고 이미 에밋된 모든 파티클이 소멸하면 꺼짐.
파티클을 완전히 없앨 때는 gEnv->pEngine->ReleaseParticleEmitter(pEmitter);
또한 파티클에미터 객체의 라이프 타임에 관여하고 싶지 않을 때, 즉 그냥 한번 플레이하고 사라지면 되는 파티클의 경우는 아래와 같이 편리하게 사용할 수 있습니다.
SmartPtr<IParticleEmitter> pOneTimeParticle = gEnv->pEngine->GetParticleEmitter(7, true);
pOneTimeParticle->SetPos(...)
pOneTimeParticle->Active(true)
pOneTimeParticle = 0; // 0으로 만들어줘도 되고 아니면 블록을 벋어나서 자동으로 0이되도 상관 없음.
GetParticleEmitter()의 두번째 인자기 true이고 SmartPtr을 사용하여 리턴값을 스마트 포인터에 받았습니다.
.particle은 핫리로딩이 지원됩니다. 게임 실행 중에 .particle파일을 에디터로 열고 편집 후 저장하면 게임에 바로 변경사항이 반영됩니다. 빠른 이터레이션을 위해 필요한 기능입니다.
파티클을 작성할 때는 새로운 .particle파일을 만든 후(emitter ID를 유니크하게)에
게임을 실행하고 콘솔을 연후() editparticle
` 를 입력하면 해당 파티클이
화면에 로딩되고 카메라가 로딩된 에미터에 고정됩니다. 이 상태에서 hot-reloading기능을
이용하여 원하는 대로 편집니다.
또한, 파티클 편집 중에 콘솔에 MoveEditParticle 1 을 입력하면 파티클이 좌우로 날아다닙니다. 움직이는 모습을 확인 하고 싶을 때 사용하면 좋습니다.
GitHub(https://github.com/fastbird/fastbirdEngine)에 있는 EngineApp 프로젝트를 컴파일하여 동작을 테스트할 수 있습니다.