Page 1 sur 1

Demande de tuto "Particle"

Publié : ven. 23/févr./2018 16:12
par Ar-S
Si quelqu'un maitrise les particles, j'aimerai un tuto simple.

L'exemple de la doc est magnifique mais je le trouve trop complexe.
J'ai essayé de faire un test, ça rend vraiment n'imp.

Code : Tout sélectionner


Enumeration
  #Emeteur
  
EndEnumeration

IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

UsePNGImageDecoder()

#CameraSpeed = 1
#MaxSpeedFactor = 10
#MinSpeedFactor = 0

InitEngine3D()

InitSprite()
InitKeyboard()
InitMouse()


If Screen3DRequester()
  
  CreateParticleEmitter(#Emeteur, 400, 400, 400, #PB_Particle_Point, 2, 2, 2)
  
  ; Creation d'une texture (10x10 pixel blanc)
;   TX = CreateTexture(#PB_Any, 10, 10)
;   StartDrawing(TextureOutput(TX))
;   Box(0,0,10,10,$FFFFFF)
;   StopDrawing()
  
  IM = LoadImage(#PB_Any, #PB_Compiler_Home + "\Examples\3D\Data\Textures\Caisse.png")
  TX = CreateTexture(#PB_Any,64,64)
  StartDrawing(TextureOutput(TX))
    DrawImage(ImageID(IM),0,0)
  StopDrawing()
  
  ; Création du material d'après la texture 
  CreateMaterial(0, TextureID(TX))
  
  ; Création de l'émeteur de particules
  CreateParticleEmitter(#Emeteur, 200, 200, 1, #PB_Particle_Box,64,64,0)
  ParticleMaterial    (#Emeteur, MaterialID(0))
  ParticleTimeToLive  (#Emeteur, 5, 10)
  ParticleEmissionRate(#Emeteur, 25)
  ParticleSize        (#Emeteur, 8, 8)
  ParticleColorRange  (#Emeteur, RGB(255,0,0), RGB(0, 255, 0))
  
  
  MoveParticleEmitter(#Emeteur, 0, 0, 0 )
  
  CreateCamera(0, 0, 0, 100, 100)
  MoveCamera(0, 0, 0, 100, #PB_Absolute)
  
  Repeat
    Screen3DEvents()
    
    If ExamineMouse()
      MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
      MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
    EndIf  
    
    If ExamineKeyboard()
      
      If KeyboardReleased(#PB_Key_F5)
        Disable = 1 - Disable
        DisableParticleEmitter(#Emeteur, Disable)
      EndIf
      
      If KeyboardPushed(#PB_Key_F6) 
        speedFactor = speedFactor + percent * (#MaxSpeedFactor - speedFactor)
        ParticleSpeedFactor(#Emeteur, speedFactor)
      EndIf
      
      If KeyboardPushed(#PB_Key_F7) 
        speedFactor = speedFactor + percent * (#MinSpeedFactor - speedFactor)
        ParticleSpeedFactor(#Emeteur, speedFactor)
      EndIf
      
      If KeyboardPushed(#PB_Key_Left)
        KeyX = -#CameraSpeed 
        
      ElseIf KeyboardPushed(#PB_Key_Right)
        KeyX = #CameraSpeed 
        
      Else
        KeyX = 0
      EndIf
      
      If KeyboardPushed(#PB_Key_Up)
        KeyY = -#CameraSpeed 
      ElseIf KeyboardPushed(#PB_Key_Down)
        KeyY = #CameraSpeed 
      Else
        KeyY = 0
      EndIf
      
    EndIf
    
    RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
    MoveCamera  (0, KeyX, 0, KeyY)
    
    RenderWorld()
    Screen3DStats()
    
    FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf


Re: Demande de tuto "Particle"

Publié : ven. 23/févr./2018 17:25
par SPH
ca me dit :
Le compilateur n'est pas encore pret... Veuillez reessayer

Re: Demande de tuto "Particle"

Publié : ven. 23/févr./2018 18:18
par Ar-S
bah... j'y peux rien..

Re: Demande de tuto "Particle"

Publié : sam. 24/févr./2018 0:56
par falsam
je te propose un système de particule basic dans une boite ayant la même dimension que le screen.

Code : Tout sélectionner

    ;Création du générateur de particules.
    ; - Tout comme la caméra, il sera placé au point central de la scene (0, 0, 0)
    ; - La taille du générateur est celui de la scene
    Emiter = CreateParticleEmitter(#PB_Any, ScreenWidth(), ScreenHeight(), 1, #PB_Particle_Box, 0, 0, 0)
    
    ;Nombre de particules émises par seconde par l'émetteur
    ParticleEmissionRate(Emiter, 2000)
    
    ;Durée de vie d'une particule (Minimum et Maximum)
    ParticleTimeToLive(Emiter, 1, 10)
    
    ;Taille des particules
    ParticleSize(Emiter, 2, 2)
    
    ;On donne une couleur aléatoire à chaque texture 
    ParticleColorRange(Emiter, RGB(255, 0, 0), RGB(255, 255, 255))    
    
    ;Creation du material (la texture) qui sera utilisé par le générateur 
    ;La texture se trouve dans le dossier d'installation de PureBasic ("Examples/3d/Data/Textures")
    Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(-1, "flare.png")))
    
    ;La texture n'ayant pas de transparence, suppression du fond noir de la texture
    MaterialBlendingMode(Material, #PB_Material_Add)    
    
    ;L'éclairage dynamique est désactivé (Sans cette option c'est la couleur de la texture qui est visible)
    DisableMaterialLighting(Material, #True)
          
    ;On affecte le materiel au générateur de particules
    ParticleMaterial(Emiter, MaterialID(material))
Et la mise en oeuvre avec ce code

Code : Tout sélectionner

EnableExplicit

Global Camera, Light, Emiter, Material, Bottom

;Summary
Declare GameLoad()
Declare RenderGame3D()
Declare RenderGame2D() 
Declare Exit()

GameLoad()

Procedure GameLoad()
  Protected Window 
  
  If InitEngine3D() And  InitKeyboard() And InitSprite() And InitMouse() And InitSound()
    Window = OpenWindow(#PB_Any, 0, 0, 0, 0, "", #PB_Window_Maximize | #PB_Window_BorderLess)
    
    ;-[Screen]
    OpenWindowedScreen(WindowID(Window),0, 0, WindowWidth(Window) , WindowHeight(Window))    
    KeyboardMode(#PB_Keyboard_International)  
    
    ;-[2D] - Création ou Chargement des élements 2D si besoin
    Bottom = CreateSprite(-1, ScreenWidth(), 150, #PB_Sprite_AlphaBlending)
    
    
    ;-[3D] - Création ou chagement des élements 3D si besoin
    Add3DArchive(#PB_Compiler_Home + "Examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
    
    ;-Camera
    
    Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
    CameraBackColor(Camera, RGB(0, 0, 0))
    MoveCamera(Camera, 0, 0, 0)
    CameraLookAt(Camera, 0, 0, 0)
    
    ;-Light
    Light = CreateLight(#PB_Any, RGB(255, 255, 255), 0, 0, 0, #PB_Light_Point)
    
    ;-Particules 
    
    ;Création du générateur de particules.
    ; - Tout comme la caméra, il sera placé au point central de la scene (0, 0, 0)
    ; - La taille du générateur est celui de la scene
    Emiter = CreateParticleEmitter(#PB_Any, ScreenWidth(), ScreenHeight(), 1, #PB_Particle_Box, 0, 0, 0)
    
    ;Nombre de particules émises par seconde par l'émetteur
    ParticleEmissionRate(Emiter, 2000)
    
    ;Durée de vie d'une particule (Minimum et Maximum)
    ParticleTimeToLive(Emiter, 1, 10)
    
    ;Taille des particules
    ParticleSize(Emiter, 2, 2)
    
    ;On donne une couleur aléatoire à chaque texture 
    ParticleColorRange(Emiter, RGB(255, 0, 0), RGB(255, 255, 255))    
    
    ;Creation du material (la texture) qui sera utilisé par le générateur 
    ;La texture se trouve dans le dossier d'installation de PureBasic ("Examples/3d/Data/Textures")
    Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(-1, "flare.png")))
    
    ;La texture n'ayant pas de transparence, suppression du fond noir de la texture
    MaterialBlendingMode(Material, #PB_Material_Add)    
    
    ;L'éclairage dynamique est désactivé (Sans cette option c'est la couleur de la texture qui est visible)
    DisableMaterialLighting(Material, #True)
          
    ;On affecte le materiel au générateur de particules
    ParticleMaterial(Emiter, MaterialID(material))
            
    ;-Loop
    While #True
      Repeat : Until WindowEvent() = 0
      FlipBuffers()  
      RenderGame3D()
      RenderWorld()
      RenderGame2D()
    Wend
  Else
    MessageRequester("Ooops", "Impossible de charger l'environnement 3D")
  EndIf 
EndProcedure

Procedure RenderGame3D()    
  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Escape)
      Exit()
    EndIf  
  EndIf
  
  If KeyboardPushed(#PB_Key_Left)
    RotateCamera(Camera, 0, 1, 0, #PB_Relative)
  EndIf  
  
  If KeyboardPushed(#PB_Key_Right)
    RotateCamera(Camera, 0, -1, 0, #PB_Relative)
  EndIf  
  
  If KeyboardPushed(#PB_Key_PageUp)
    MoveCamera(Camera, 0, 0.1, 0, #PB_Relative)
  EndIf  
  
  If KeyboardPushed(#PB_Key_PageDown)
    MoveCamera(Camera, 0, -0.1, 0, #PB_Relative)
  EndIf  
  
  If ExamineMouse()
    
  EndIf 
EndProcedure

Procedure RenderGame2D()
  StartDrawing(SpriteOutput(Bottom))
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  Box(0, 0, ScreenWidth(), SpriteWidth(Bottom), RGBA(0, 0, 0, 110))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(30, 10, ". : : Help : : .")
  DrawText(30, 40, "<--- ou ---> Rotation gauche ou droite de la caméra.")
  DrawText(30, 70, "Page-Up or Page-Down Déplacement vertical de la caméra.")
  DrawText(30, 100, "Esc quitter.")
  
  StopDrawing()
  DisplayTransparentSprite(Bottom, 0, ScreenHeight() - SpriteHeight(Bottom))
EndProcedure

Procedure Exit()
  End
EndProcedure

Re: Demande de tuto "Particle"

Publié : sam. 24/févr./2018 9:46
par Ar-S
Merci Falsam.
Je vais étudier ça de plus prés.
J'adore les particles. J'utilisais à l'époque pour des vidéos le soft Particle Illusion. Il était d'une puissance affolante.
J'avoue que de pouvoir en faire en PB m'intéresse (le effets sont quasi illimités) mais l'approche est pas si simple, sans compter les scripts que je n'ai même pas encore commencé à étudier.

Re: Demande de tuto "Particle"

Publié : sam. 24/févr./2018 12:30
par falsam
Un autre exemple dans lequel on met en oeuvre deux rayons lasers bleu et rouge

Code : Tout sélectionner

EnableExplicit

Global Camera, Light, EmiterRed, EmiterBlue, Mesh, Material, Entity, Laser, Bottom

;Summary
Declare GameLoad()
Declare RenderGame3D()
Declare RenderGame2D() 
Declare Exit()

GameLoad()

Procedure GameLoad()
  Protected Window 
  
  If InitEngine3D() And  InitKeyboard() And InitSprite() And InitMouse() And InitSound()
    Window = OpenWindow(#PB_Any, 0, 0, 0, 0, "", #PB_Window_Maximize | #PB_Window_BorderLess)
    
    ;-[Screen]
    OpenWindowedScreen(WindowID(Window),0, 0, WindowWidth(Window) , WindowHeight(Window))    
    KeyboardMode(#PB_Keyboard_International)  
    
    ;-[2D] - Création ou Chargement des élements 2D si besoin
    Bottom = CreateSprite(-1, ScreenWidth(), 150, #PB_Sprite_AlphaBlending)
    
    
    ;-[3D] - Création ou chagement des élements 3D si besoin
    Add3DArchive(#PB_Compiler_Home + "Examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
    
    ;-Camera
    Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
    CameraBackColor(Camera, RGB(0, 0, 0))
    MoveCamera(Camera, 0, 3, 5)
    CameraLookAt(Camera, 0, 1, 0)
    
    ;Ground
    Mesh = CreatePlane(-1, 10, 10, 50, 50, 2, 2)
    Material = CreateMaterial(-1, TextureID(LoadTexture(-1, "MRAMOR6X6.jpg")))
    CreateEntity(-1, MeshID(Mesh), MaterialID(Material))
    
    ;Support de particule
    Mesh = CreateSphere(-1, 0.1)
    Laser = CreateEntity(-1, MeshID(Mesh), #PB_Material_None) 
    
    ;-Light
    AmbientColor(RGB(0, 0, 0))
    Light = CreateLight(#PB_Any, RGB(255, 255, 255), 0, 10, 0, #PB_Light_Spot)
    SpotLightRange(Light, 1, 20, 3)
    
    ;-Particules 
    
    EmiterRed = CreateParticleEmitter(#PB_Any, 0, 0, 0, #PB_Particle_Point, 0, 0, 0)
    ParticleEmissionRate(EmiterRed, 1000)  
    ParticleSize(EmiterRed, 0.03, 0.03)
    ParticleEmitterDirection(EmiterRed, 1, 1, 0)
    ParticleEmitterAngle(EmiterRed, 0)
    ParticleVelocity(EmiterRed, #PB_Particle_MaximumVelocity, 10)
    ParticleTimeToLive(EmiterRed, 0.3, 0.3)
    Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(-1, "flare.png")))    
    MaterialBlendingMode(Material, #PB_Material_Add)    
    DisableMaterialLighting(Material, #True)
    ParticleColorRange(EmiterRed, RGB(255, 0, 0), RGB(255, 0, 0)) 
    ParticleMaterial(EmiterRed, MaterialID(material))
    
    
    EmiterBlue = CreateParticleEmitter(#PB_Any, 0, 0, 0, #PB_Particle_Point, 0, 0, 0)
    ParticleEmissionRate(EmiterBlue, 1000)  
    ParticleSize(EmiterBlue, 0.03, 0.03)
    ParticleEmitterDirection(EmiterBlue, -1, 1, 0)
    ParticleEmitterAngle(EmiterBlue, 0)
    ParticleVelocity(EmiterBlue, #PB_Particle_MaximumVelocity, 10)
    ParticleTimeToLive(EmiterBlue, 0.3, 0.3)
    Material = CreateMaterial(#PB_Any, TextureID(LoadTexture(-1, "flare.png")))    
    MaterialBlendingMode(Material, #PB_Material_Add)    
    DisableMaterialLighting(Material, #True)
    ParticleColorRange(EmiterBlue, RGB(0, 0, 255), RGB(0, 0, 255)) 
    ParticleMaterial(EmiterBlue, MaterialID(material))
    
    
    ;-Loop
    While #True
      Repeat : Until WindowEvent() = 0
      FlipBuffers()  
      RenderGame3D()
      RenderWorld()
      RenderGame2D()
    Wend
  Else
    MessageRequester("Ooops", "Impossible de charger l'environnement 3D")
  EndIf 
EndProcedure

Procedure RenderGame3D()   
  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Escape)
      Exit()
    EndIf  
  EndIf
  
  If KeyboardPushed(#PB_Key_Left)
    RotateCamera(Camera, 0, 1, 0, #PB_Relative)
  EndIf  
  
  If KeyboardPushed(#PB_Key_Right)
    RotateCamera(Camera, 0, -1, 0, #PB_Relative)
  EndIf  
  
  If KeyboardPushed(#PB_Key_PageUp)
    MoveCamera(Camera, 0, 0.1, 0, #PB_Relative)
  EndIf  
  
  If KeyboardPushed(#PB_Key_PageDown)
    MoveCamera(Camera, 0, -0.1, 0, #PB_Relative)
  EndIf  
  
  If ExamineMouse()
  EndIf   
EndProcedure

Procedure RenderGame2D()
  StartDrawing(SpriteOutput(Bottom))
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  Box(0, 0, ScreenWidth(), SpriteWidth(Bottom), RGBA(0, 0, 0, 110))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(30, 10, ". : : Help : : .")
  DrawText(30, 40, "<--- ou ---> Rotation gauche ou droite de la caméra.")
  DrawText(30, 70, "Page-Up or Page-Down Déplacement vertical de la caméra.")
  DrawText(30, 100, "Esc quitter.")
  
  StopDrawing()
  DisplayTransparentSprite(Bottom, 0, ScreenHeight() - SpriteHeight(Bottom))
EndProcedure

Procedure Exit()
  End
EndProcedure

Re: Demande de tuto "Particle"

Publié : sam. 24/févr./2018 12:38
par Ar-S
Merci pour ce second exemple :) Cool 8)
Y'a t il une raison particulière aux -1 des éléments Mesh et entités ?
( Mesh = CreatePlane(-1, 10, 10, 50, 50, 2, 2) etc.. )

--- edit ----
Pigé => #PB_Any

Feignasse :)

Re: Demande de tuto "Particle"

Publié : sam. 24/févr./2018 16:48
par Micoute
Je pense que -1 peut être remplacé par #PB_Any, car j'ai vu Mesh = ...

Re: Demande de tuto "Particle"

Publié : sam. 24/févr./2018 18:31
par Guillot
mon exemple qui illustre notamment les 3 nouvelles fonctions relatives aux particules
(elle à été intégré dans les exemples, mais modifiée et sans les commentaires)

je te conseil de garder ma fonction CreateEmitter
qui spécifie DisableMaterialLighting(material, 1) (indispenssable)
et qui corrige l'inversion height/depth de la fonction CreateParticleEmitter(n, width, depth, height,#PB_Particle_Box)

Code : Tout sélectionner

;--------------------------------------------------------------
;                            Particules
;                            ==========
;
; ParticleAcceleration(particleID, x.f, y.f, z.f)
; -----------------------------------------------
;
; permet d'appliquer une accelération aux particules
; pour simuler la gravité, le vent...
; x,y,z represente le vecteur directeur de l'accelération
;
; ParticleColorFader(particleID, r.f, g.f, b.f, a.f)
; --------------------------------------------------
;
; permet de changer la couleur (canal alpha inclu) au cour du temps
; les valeurs r, g, b, a correspondent à la variantion des composantes couleur en 1 seconde. ex:
; 0: aucun changement 
; -1: diminution de 256 de la composante en 1 seconde
; +1: augmentation de 256 de la composante en 1 seconde
;
; ParticleEmitterAngle(particleID, angle.f)
; -----------------------------------------
;
; permet de spécifier l'angle du cone de dispertion (en degree)
;
;----------------------------------------------------------------


InitEngine3D():InitSprite():InitKeyboard():InitMouse()
OpenWindow(0, 0, 0, 0,0, "",#PB_Window_Maximize|#PB_Window_BorderLess)
ex=WindowWidth (0,#PB_Window_InnerCoordinate)
ey=WindowHeight(0,#PB_Window_InnerCoordinate)
OpenWindowedScreen(WindowID(0), 0, 0, ex, ey, 0, 0, 0)

Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Parse3DScripts()

LoadTexture(0, "dirt.jpg")
CreateMaterial(0, TextureID(0))
CreatePlane (0,256,256,1,1,8,8):CreateEntity(0, MeshID(0), MaterialID(0),0,0,0)
 
LoadTexture(1, "smoke.png")
CreateMaterial(1, TextureID(1))
MaterialBlendingMode   (1, #PB_Material_AlphaBlend)

LoadTexture(2, "flare.png")
CreateMaterial(2, TextureID(2))
MaterialBlendingMode   (2, #PB_Material_Add)

Procedure CreateEmitter(n,material,size.f,rate.f,mintime.f,maxtime.f,angle.f=0,width.f=0,height.f=0,depth.f=0)
    DisableMaterialLighting(material, 1)
    nn=CreateParticleEmitter(n, width, depth, height,#PB_Particle_Box):If n=-1:n=nn:EndIf
    ParticleEmitterAngle(n,angle)
    ParticleMaterial(n, MaterialID(material))
    ParticleSize(n,size,size)
    ParticleEmissionRate(n,rate)
    ParticleTimeToLive  (n,mintime,maxtime)
    ProcedureReturn n    
EndProcedure

;emetteur 1 : feu
;----------------
CreateEmitter(1,1,5,150,2,2,30)
MoveParticleEmitter(1,50,5,50)
ParticleColorRange(1, $00ffff, $0000ff)
ParticleColorFader(1, -0.5, -0.5, -0.5, -0.5)
ParticleEmitterDirection(1, 0, 1, 0)
ParticleVelocity(1, 2,20)
ParticleAcceleration(1, 0.2, 0, 0)


;emetteur 2 : feu d'artifice
;---------------------------
CreateEmitter(2,2,5,100,1,2,30)
MoveParticleEmitter(2,-50,0,50)
ParticleColorRange(2, $ff0000, $0000ff)
ParticleEmitterDirection(2, 0, 1, 0)
ParticleVelocity(2, 2,80)
ParticleAcceleration(2, 0, -1, 0)

;emetteur 3 : neige
;------------------
createemitter(3,2,2,50,4,4,10,50, 0, 50)
ParticleEmitterDirection(3, 0, 1, 0)
ParticleVelocity(3, 2,-10)
MoveParticleEmitter(3,50,40,-50)

;emetteur 4 : torche multicolor
;------------------------------
CreateEmitter(4,1,5,50,1,1,5)
 ParticleColorRange(4, $ffff00, $00ff00)
 ParticleColorFader(4, 0,0,0, -1)
 ParticleVelocity(4, 2,35)
 ParticleAcceleration(4, -0.5, 0, 0)
 ParticleEmitterDirection(4, 0, 1, 0)
 MoveParticleEmitter(4,-50,5,-50)
 
;emetteur 5 : noir au centre
;---------------------------
 CreateEmitter(5,1,4,100,1,1)
 ParticleColorRange(5, $000000, $000000)
 ParticleColorFader(5, 0,0,0, -1)
 ParticleVelocity(5, 2,30)
 ParticleEmitterDirection(5, 0, 1, 0)
     
CreateCamera(0, 0, 0, 100, 100)
CameraBackColor(0,$555555)

Repeat
  ExamineKeyboard()
  a.f+0.005
  MoveCamera(0,Cos(a)*100,40,Sin(a)*100,0)
  MoveParticleEmitter(5,Sin(a*20)*10,5,Cos(a*20)*10,0)
  CameraLookAt(0,0,0,0)
  RenderWorld()
  FlipBuffers()    
Until WindowEvent() = #PB_Event_CloseWindow Or KeyboardReleased(#PB_Key_Escape)

Re: Demande de tuto "Particle"

Publié : sam. 24/févr./2018 19:28
par Ollivier
Petite parenthèse à Falsam.
Je mettais 16 à la place de #Pb_Event_CloseWindow puis cette constante a changé de valeur. Résultat : des codes devenus non fonctionnels.
Et je ne sais pas si les constantes sont comprises dans le LTS. Sinon, il peut t'arriver la même bricole si tu prenais cette habitude.

Re: Demande de tuto "Particle"

Publié : sam. 24/févr./2018 23:37
par Ar-S
Merci Guillot pour ces exemples et les comments.
Avec tout ça je devrais m'en sortir même si j'aurai surement d'autre questions.

@Olivier. Tu ne veux pas dire l'inverse ?