Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
particles [2019/10/01 11:13] – [Smoke effect with wind influencer] adminparticles [2020/11/06 14:04] admin
Line 1: Line 1:
 ====== Using the ParticleSystem ====== ====== Using the ParticleSystem ======
 +
 +{{::particles1.jpg?nolink|}}
  
 Gorilla3D provides an integrated particle system for rendering complex and individual particle effects. Gorilla3D provides an integrated particle system for rendering complex and individual particle effects.
Line 7: Line 9:
 Gorilla3D already supplies some of the most popular effects, like: fire, smoke, rain, snow, waterfall, eruption, explosion. Gorilla3D already supplies some of the most popular effects, like: fire, smoke, rain, snow, waterfall, eruption, explosion.
  
 +{{::particles2.jpg?nolink|}}
  
 It is possible to manipulate each particle by the so-called influencers. It is possible to manipulate each particle by the so-called influencers.
Line 20: Line 23:
   * Endless or limited emmittance   * Endless or limited emmittance
   * Physically based particle collision detection with other scene objects (not with particles!)   * Physically based particle collision detection with other scene objects (not with particles!)
 +  * Autosorting of particles depending on assigned camera
  
 ===== Shader / Material ===== ===== Shader / Material =====
Line 44: Line 48:
 | a_Binormal | X = size, Y = angle, Z = weight | | a_Binormal | X = size, Y = angle, Z = weight |
 | a_Tangent | X = age, Y = life time, Z = delta time | | a_Tangent | X = age, Y = life time, Z = delta time |
 +===== Influencers =====
 +
 +Influencers are helper classes to manipulate particles at runtime.
 +
 +===== Physics Particle Support =====
 +
 +{{::particles3.jpg?nolink|}}
 +
 +Our particles system can be linked to the physics system for particle collision detection.
 +In the following example we use the rain particle emitter as basis.
 +
 +<file pascal>
 +uses
 +  [...]
 +  Gorilla.Material.Particle,
 +  Gorilla.Particle.Emitter,
 +  Gorilla.Particle.Influencer,
 +  Gorilla.Particle.Rain,
 +  Gorilla.Particle.Spot,
 +  Gorilla.Physics,
 +  Gorilla.Physics.Q3.Body;
 +  
 +TForm1 = class(TForm)
 +  procedure FormCreate(Sender: TObject);
 +  protected
 +    FViewport : TGorillaViewport;
 +    FCamera : TGorillaCamera;
 +    FPhysics : TGorillaPhysicsSystem;
 +    FParticles : TGorillaRainParticleEmitter;
 +    FInfluencer : TGorillaPhysicsInfluencer;
 +    FSplashes : TGorillaSpotParticleEmitter;
 +    
 +    procedure DoOnGorillaPhysicsNotifyContact(const ABodyA, ABodyB : TQ3Body);
 +  [...]
 +end;
 +
 +[...]
 +
 +procedure TForm1.DoOnGorillaPhysicsNotifyContact(const ABodyA, ABodyB : TQ3Body);
 +begin
 +  // collision detected - create splashes on particle-sphere/box/terrain/mesh collision
 +  // not on particle-particle collision (too much)
 +  if (PTypeInfo(ABodyA.UserDataType) = TypeInfo(PGorillaParticle))
 +  and (PTypeInfo(ABodyB.UserDataType) = TypeInfo(PGorillaParticle)) then
 +    Exit;
 +
 +  if (PTypeInfo(ABodyA.UserDataType) = TypeInfo(PGorillaParticle)) then
 +    FSplashes.EmitParticle(
 +      PGorillaParticle(ABodyA.UserData)^.Position
 +      )
 +  else if (PTypeInfo(ABodyB.UserDataType) = TypeInfo(PGorillaParticle)) then
 +    FSplashes.EmitParticle(
 +      PGorillaParticle(ABodyB.UserData)^.Position
 +      );
 +end;
 +
 +procedure TForm1.FormCreate(Sender: TObject);
 +begin
 +  [...]
 +  
 +  // create physics system with contact callback function to display splashes
 +  FPhysics := TGorillaPhysicsSystem.Create(FViewport);
 +  FPhysics.OnBeginContact := DoOnGorillaPhysicsNotifyContact;
 +  
 +  // create rain particle emitter
 +  FParticles := TGorillaRainParticleEmitter.Create(FViewport);
 +  FParticles.Parent := FViewport;
 +  FParticles.Camera := FCamera;
 +  FParticles.EmitParticles := 25;
 +
 +  // preconfigure particles
 +  FParticles.Colored.StartColor := TAlphaColorF.Create( TAlphaColorRec.Blue );
 +  FParticles.Colored.EndColor := TAlphaColorF.Create( TAlphaColorRec.Blueviolet );
 +  FParticles.ParticleSize   := TParticlePreset.Create(20, 20, 1, false);
 +  FParticles.ParticleGrowth := TParticlePreset.Create(0, 0, 1, false);
 +  FParticles.Colored.Enabled := false;
 +  FParticles.Wind.Enabled := false;
 +
 +  // create a physics influencer
 +  FInfluencer := TGorillaPhysicsInfluencer.Create(FParticles);
 +  FInfluencer.Emitter := FParticles;
 +  // link to physics system component
 +  FInfluencer.Physics := FPhysics;
 +  FInfluencer.Enabled := true;
 +
 +  // another particle emitter to simulate rain drop splashes when they hit an obstacle
 +  FSplashes := TGorillaSpotParticleEmitter.Create(FViewport);
 +  FSplashes.Parent := FViewport;
 +  FSplashes.Camera := FCamera;
 +  FSplashes.LoadTexture('splash.png');
 +
 +  // activate physics
 +  FPhysics.Active := true;
 +  FParticles.Start();
 +  FSplashes.Start();
 +end;
 +</file>
 ===== Example ===== ===== Example =====
  
Line 112: Line 213:
 begin begin
   LParticles := TGorillaEruptionParticleEmitter.Create(FGorilla);   LParticles := TGorillaEruptionParticleEmitter.Create(FGorilla);
 +  LParticles.Parent := FGorilla;
   LParticles.Camera := FCamera;   LParticles.Camera := FCamera;
  
Line 134: Line 236:
 begin begin
   LParticles := TGorillaRainParticleEmitter.Create(FGorilla);   LParticles := TGorillaRainParticleEmitter.Create(FGorilla);
 +  LParticles.Parent := FGorilla;
   LParticles.Camera := FCamera;   LParticles.Camera := FCamera;
 end; end;
Line 151: Line 254:
 begin begin
   LParticles := TGorillaSnowParticleEmitter.Create(FGorilla);   LParticles := TGorillaSnowParticleEmitter.Create(FGorilla);
 +  LParticles.Parent := FGorilla;
   LParticles.Camera := FCamera;   LParticles.Camera := FCamera;
 end; end;
Line 272: Line 376:
 end; end;
 </file> </file>
 +
  
 Next step: [[physics|Physics]] Next step: [[physics|Physics]]