PureBasic

Forums PureBasic
Nous sommes le Mar 22/Oct/2019 12:47

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 67 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5  Suivante
Auteur Message
 Sujet du message: Histoire d'un Cube : Les particules
MessagePosté: Mer 17/Juil/2013 21:37 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6856
Localisation: IDF (Yvelines)
Les systèmes de particules sont largement utilisés dans les scènes 3D pour simuler des objets tels que la pluie, la neige, le feu, la fumée, des explosions, etc .....

PureBasic permet de créer des émetteurs de particules autonomes.
Chaque émetteur a ses propriétés propres comme la forme, la taille, la direction, la vélocité, la vitesse, le taux d'émission, la durée de vie et plus encore.

Un exemple commenté qui vous aidera pas à pas à créer votre premier système de particules.
Code:
; Histoire d'un cube - Découverte du systeme de particules
InitEngine3D()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Particules")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
MoveCamera(Camera, -2, 2, 5, #PB_Absolute)
CameraLookAt(camera,0,2,0)

; Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

; Une texture qui servira pour le sol
Texture = CreateTexture(#PB_Any, 256, 256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(0, 0, 0))
Box(2,2,252,252,RGB(255, 216, 0))
StopDrawing()

; Le materiel qui servira pour le sol
Material = CreateMaterial(#PB_Any,TextureID(texture))

; Création du sol
Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), 0, 0, 0)
CreateEntityBody(Entity, #PB_Entity_StaticBody, 2, 0, 1)

;
; Un systéme de particules
;

; Comme pour une entité, nous avons besoin d'une texture
Texture = CreateTexture(#PB_Any, 32, 32)
StartDrawing(TextureOutput(Texture))
Box(0,0,128,128,RGBA(255, 255, 255, 255))
StopDrawing()

; Comme pour une entité, la particule a besoin de sa couche matérial
Material = CreateMaterial(#PB_Any, TextureID(Texture))

; On illumine un peu plus la particule (On intensifie la couleur blanche)
SetMaterialColor(Material, #PB_Material_SelfIlluminationColor, RGB(255, 255, 255))

; C'est ici que nous allons créer un émetteur qui aura
; Une forme de boite : #PB_Particle_Box
; Une longueur, largeur et profondeur de 100x100x1
; Qu'on va placer à une hauteur de 5 unités
Emiter = CreateParticleEmitter(#PB_Any, 100, 100, 1, #PB_Particle_Box, 0,5,0)

; On affecte le materiel au systeme de particule
ParticleMaterial(Emiter, MaterialID(material))

; On donne une taille à chacune des particules
ParticleSize(Emiter, 0.5, 0.5)

; Nombre de particules émise par seconde par l'émetteur
ParticleEmissionRate(Emiter, 500)

; Direction que va prendre votre particule
; On va donner une valeur négative au parametre Y
ParticleEmitterDirection(Emiter, 0.00, -0.01, 0.00)

; Durée de vie d'une particule (Minimum, Maximum
ParticleTimeToLive(Emiter, 5.0, 10.0)


While #True
 
  Event = WindowEvent()
   
  ExamineKeyboard() 
 
  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf 
     
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld(30)
  FlipBuffers()
Wend
Vous allez me dire que c'est moche et vous avez raison, mais vous venez de créer votre premier émetteur de particules.

Ajoutons un peu de couleur. Apres la ligne ParticleTimeToLive(Emiter, 5.0, 10.0) vous allez ajouter
Code:
; De la couleur aléatoire
ParticleColorRange(Emiter, RGBA(221, 160, 221, 255), RGBA(255, 182, 193, 255))
C'est plus joli hein ?

Amusez vous à changer le ou les sens de direction. Remplacer la ligne ParticleEmitterDirection(Emiter, 0.00, -0.01, 0.00) par
Code:
ParticleEmitterDirection(Emiter, 0.00, 0.01, 0.00)

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Dernière édition par falsam le Dim 22/Sep/2013 12:16, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Histoire d'un Cube : Il neige
MessagePosté: Jeu 18/Juil/2013 1:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6856
Localisation: IDF (Yvelines)
Dans le premier message de ce fil de discussion, je vous ai demandé de créer un dossier data dans lequel figure un dossier Textures.

Télécharger la texture ci-dessous. Extrayez là et placez là dans ce dossier textures.
:arrow: Flare1.zip

Il fait mauvais et il se met à neiger. C'est l'objectif du code que je vous présente maintenant. Contrairement au code précédent ou vous avez créée une texture, vous allez cette fois çi charger une texture pour créer un système de particules pour simuler la neige qui tombe.
Code:
; Histoire d'un cube - Découverte du systeme de particules - Il neige

InitEngine3D()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Particules")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)

; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(203, 203, 203))
MoveCamera(Camera, -2, 2, 5, #PB_Absolute)
CameraLookAt(camera,0,2,0)

;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any, RGBA(255, 255, 255, 255), -2, 3, -2)
WorldShadows(#PB_Shadow_Modulative)

; Une texture qui servira pour le sol
Texture = CreateTexture(#PB_Any, 256, 256)
StartDrawing(TextureOutput(Texture))
Box(2,2,252,252, RGB(87, 121, 85))
StopDrawing()

; Le materiel qui servira pour le sol
Material = CreateMaterial(#PB_Any,TextureID(texture))

; Création du sol
Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), 0, 0, 0)
CreateEntityBody(Entity, #PB_Entity_StaticBody, 2, 0, 1)

; la neige
Texture = LoadTexture(#PB_Any, "flare1.png")
Material = CreateMaterial(#PB_Any, TextureID(Texture))
MaterialBlendingMode(material, #PB_Material_AlphaBlend)
SetMaterialColor(Material, #PB_Material_SelfIlluminationColor, RGB(255, 255, 255))

Emiter0 = CreateParticleEmitter(#PB_Any, 30, 30, 2, #PB_Particle_Box, 0, 10, 0)
ParticleMaterial(Emiter0, MaterialID(material))
ParticleSize(Emiter0, 0.3, 0.3)
ParticleEmissionRate(Emiter0, 500)
ParticleEmitterDirection(Emiter0, 0.00, -0.1, 0.00)
ParticleVelocity(Emiter0, 0.05, 0.1)
ParticleTimeToLive(Emiter0, 1, 7)

While #True
 
  Event = WindowEvent()
   
  ExamineKeyboard() 
 
  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf 
     
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld(30)
  FlipBuffers()
Wend
Si vous trouvez que la neige tombe en subissant une légère brise venant de gauche par exemple alors remplacer la ligne ParticleEmitterDirection(Emiter0, 0.00, -0.1, 0.00) par
Code:
ParticleEmitterDirection(Emiter0, 0.05, -0.1, 0.00)

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Dernière édition par falsam le Dim 22/Sep/2013 12:17, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Zoomer sur une scène
MessagePosté: Jeu 29/Aoû/2013 9:06 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6856
Localisation: IDF (Yvelines)
Molette de la souris pour zoomer de-zoomer. Vous pouvez aussi utiliser les touches de direction du clavier (Gauche, Droite, Haut et Bas) pour déplacer la caméra à gauche, droite, haut et bas.
Code:
Define.f CamX, CamY, CamZ

Procedure.w MouseWheelDelta()
  wz.w = ((EventwParam()>>16)&$FFFF)
  ProcedureReturn -(wz/100)
EndProcedure

InitEngine3D()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"How to use mousewheel to zoom in 3D")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Ambiance
AmbientColor(RGB(255, 255, 255))
CreateLight(#PB_Any,RGB(255, 255, 255), 3,50,50)

;
;axes
Red = RGB(255, 0, 0)
Green = RGB(0, 255, 0)
Blue = RGB(0, 255, 255)

AxeX = CreateLine3D(#PB_Any, -10,0,0, Red, 10, 0, 0, Red)
AxeY = CreateLine3D(#PB_Any, 0,-10,0, Green, 0, 10, 0, Green)
AxeZ = CreateLine3D(#PB_Any, 0,0,-10, Blue, 0, 0, 10, Blue)

;
; Entity
Mesh = CreateCube(#PB_Any, 2)

; Texture
Texture = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture))
Box(0,0,512,512,RGB(0, 0, 0))
Box(1,1,510,510,RGB(255, 216, 0))
StopDrawing()

Material = CreateMaterial(#PB_Any,TextureID(texture))
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))

;
; Camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(105, 105, 105))
CamX=2.0
CamY=1.0
CamZ=10
CameraLookAt(Camera,0,0,0)


While #True
 
  Event = WindowEvent()
  Select Event
    Case #WM_MOUSEWHEEL     
      CamZ=CamZ+(MouseWheelDelta())
     
  EndSelect
 
  ExamineKeyboard() 
 
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf 
 
  If KeyboardPushed(#PB_Key_Left)
    CamX-0.2 
  ElseIf KeyboardPushed(#PB_Key_Right)
    CamX+0.2
  EndIf
 
  If KeyboardPushed(#PB_Key_Up)
    CamY+0.2 
  ElseIf KeyboardPushed(#PB_Key_Down)
    CamY-0.2
  EndIf
   
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
 
 
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Dernière édition par falsam le Mar 17/Sep/2013 14:31, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Zoomer sur une scène
MessagePosté: Jeu 29/Aoû/2013 10:46 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8768
falsam a écrit:
[PB 4.20]

Molette de la souris pour zoomer de-zoomer. Vous pouvez aussi utiliser les touches de direction du clavier (Gauche, Droite, Haut et Bas) pour déplacer la caméra à gauche, droite, haut et bas.[code]Define.f CamX, CamY, CamZ


Très fluide ce dernier code (testé en 5.20 b12)

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube (Initiation à la 3D)
MessagePosté: Ven 30/Aoû/2013 12:03 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 19/Fév/2011 12:46
Messages: 1880
Un modo devrait mettre ce sujet dans les tutoriaux ;)

_________________
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube (Initiation à la 3D)
MessagePosté: Mar 10/Sep/2013 13:42 
Hors ligne

Inscription: Mar 24/Nov/2009 15:13
Messages: 384
Mes félicitations et remerciements à falsam pour tous ces exemples.
Tu vas rendre service à tous ceux qui s'intéressent à la 3D.
Exemples pertinents, programmes clairs, concis et bien construits, chapeau...


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Histoire d'un Cube : CameraFollow()
MessagePosté: Mer 11/Sep/2013 22:42 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6856
Localisation: IDF (Yvelines)
CameraFollow(#Camera, ObjetID, Angle, Hauteur, Distance, PourcentageRotation, PourcentagePosition [, Mode])
est apparu avec la version la version 5.20 de Pure Basic. Cette fonctionnalité permet de suivre un objet (Entité, Lumière, Emetteur de Particles, etc ...).

Nous verrons ici comment suivre une entité avec notre caméra.
■ La camera suit une entité sans possibilité de regarder ailleurs. (Mode = #True)
■ La camera suit une entité tout en ayant la possibilité de regarder ailleurs. (Mode = #False)
■ La camera suit une entité tout en ayant la possibilité de regarder ailleurs uniquement si l'entité n'est plus en mouvement. (Mode #False ou #True)

Ces codes sont sans fioriture afin de rester concentrer sur le sujet.
Escape permet de sortir du jeu. Utilisez les touches fléchées du clavier pour avancer, freiner, tourner à gauche et à droite ainsi que la touche Espace pour stopper l'entité.

■ La camera suit une entité sans possibilité de regarder ailleurs. (Mode = #True)
Code:
; Naissance d'un cube : Camera Follow
; La camera suit une entité sans possibilité de regarder ailleurs. (Mode  = #True)
EnableExplicit

InitEngine3D()
InitKeyboard()
InitSprite()

Global Window, Event
Global Camera
Global Texture, Material, Mesh, Entity
Global Player, PlayerSpeed.d
Global X.f, Y.f

Window = OpenWindow(#PB_Any,0,0,1024,768,"Camera Follow")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Activation Physics et Collisions (A mon avis ça ne sert à rien)
EnableWorldPhysics(#True)
EnableWorldCollisions(#True)

;
; Ambience, Lumiére blanche et activation des ombres
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))

;
; Materiel (texture) qui servira pour le sol, le cube les obstacles
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(0, 0, 0))
Box(1,1,252,252,RGB(255, 216, 0))
StopDrawing()
Material = CreateMaterial(#PB_Any, TextureID(Texture))
MaterialFilteringMode(Material, #PB_Material_Anisotropic, 6) ;Meilleurs rendu de la texture

;
; Creation du sol (Obstacle static)
Mesh = CreatePlane(#PB_Any, 100, 100, 1, 1, 12, 12)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
CreateEntityBody(Entity, #PB_Entity_StaticBody, 0,0,1)

;
; Le joueur
Mesh = CreateCube (#PB_Any, 1)
Player = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None, 0, 2, 0)
CreateEntityBody(Player, #PB_Entity_BoxBody, 1, 1, 0)

Repeat
  Event = WindowEvent()
 
  If ExamineKeyboard()
   
    ;Sortie du jeu
    If KeyboardPushed (#PB_Key_Escape)
     Break
    EndIf
   
   
    ;En avant ou Freinage
    If KeyboardPushed (#PB_Key_Up)
      PlayerSpeed + 0.1
    ElseIf KeyboardPushed (#PB_Key_Down)
      PlayerSpeed - 0.1
    EndIf
   
    ;A gauche ou à droite
    If KeyboardPushed (#PB_Key_Left)
      RotateEntity(Player, 0, 1.5, 0, #PB_Relative)
    ElseIf KeyboardPushed (#PB_Key_Right)
      RotateEntity(Player, 0, -1.5, 0, #PB_Relative)
    EndIf
           
    ;Freinage d'urgence
    If KeyboardPushed(#PB_Key_Space)
      PlayerSpeed = 0
    EndIf
   
  EndIf
 
  ;Mouvement du joueur
  MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
   
  ;CamearaFollow (PB 5.20) permet de suivre le joueur
  CameraFollow(Camera, EntityID(Player), 180, EntityY(Player) + 3, 6, 0.05, 0.05, #True)
 
  ; Affiche le rendu de la scène
  RenderWorld(40)
  FlipBuffers() 
ForEver

■ La camera suit une entité tout en ayant la possibilité de regarder ailleurs. (Mode = #False)
Commencer à avancer et utiliser la souris pour regarder ailleurs.
Code:
; Naissance d'un cube : Camera Follow
; La camera suit une entité tout en ayant la possibilité de regarder ailleurs. (Mode  = #False)
EnableExplicit

InitEngine3D()
InitKeyboard()
InitMouse()
InitSprite()

Global Window, Event
Global Camera, CamX.f, CamY.f
Global Texture, Material, Mesh, Entity
Global Player, PlayerSpeed.f


Window = OpenWindow(#PB_Any,0,0,1024,768,"Camera Follow")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Activation Physics et Collisions (A mon avis ça ne sert à rien)
EnableWorldPhysics(#True)
EnableWorldCollisions(#True)

;
; Ambience, Lumiére blanche et activation des ombres
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))

;
; Materiel (texture) qui servira pour le sol, le cube les obstacles
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(0, 0, 0))
Box(1,1,252,252,RGB(255, 216, 0))
StopDrawing()
Material = CreateMaterial(#PB_Any, TextureID(Texture))
MaterialFilteringMode(Material, #PB_Material_Anisotropic, 6) ;Meilleurs rendu de la texture

;
; Creation du sol (Obstacle static)
Mesh = CreatePlane(#PB_Any, 100, 100, 1, 1, 12, 12)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
CreateEntityBody(Entity, #PB_Entity_StaticBody, 0,0,1)

;
; Le joueur
Mesh = CreateCube (#PB_Any, 1)
Player = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None, 0, 0.5, 0)
CreateEntityBody(Player, #PB_Entity_BoxBody, 1, 1, 0)

;
;Debut du jeu : On fixe la caméra derriere le joueur
CameraFollow(Camera, EntityID(Player), 180, EntityY(Player) + 3, 6, 0.05, 0.05, #True) 

;La caméra étant orienté vers le haut,  on la force à regarder vers l'entité
;la caméra bascule de 100 degres en arriere
RotateCamera(Camera, -100, CamX, 0, #PB_Relative)
;Avec une valeur de -180 Degres la camera regarde le sol

Repeat
  Event = WindowEvent()
 
  If ExamineMouse()
    CamX = -MouseDeltaX() * 0.05
    CamY = -MouseDeltaY() * 0.05
  EndIf

  If ExamineKeyboard()
   
    ;Sortie du jeu
    If KeyboardPushed (#PB_Key_Escape)
      Break
    EndIf   
   
    ;En avant ou Freinage
    If KeyboardPushed (#PB_Key_Up)
      PlayerSpeed + 0.1
    ElseIf KeyboardPushed (#PB_Key_Down)
      PlayerSpeed - 0.1
    EndIf
   
    ;A gauche ou à droite
    If KeyboardPushed (#PB_Key_Left)
      RotateEntity(Player, 0, 1.5, 0, #PB_Relative)
    ElseIf KeyboardPushed (#PB_Key_Right)
      RotateEntity(Player, 0, -1.5, 0, #PB_Relative)
    EndIf
       
    ;Freinage d'urgence
    If KeyboardPushed(#PB_Key_Space)
      PlayerSpeed = 0
    EndIf
   
  EndIf
 
  ;Mouvement du joueur 
  MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
 
  ;CamearaFollow (PB 5.20) permet de suivre notre entité 
  CameraFollow(Camera, EntityID(Player), 180, EntityY(Player) + 3, 6, 0.05, 0.05, #False)     
  RotateCamera(Camera, CamY, CamX, 0, #PB_Relative)
   
  ; Affiche le rendu de la scène
  RenderWorld(40)
  FlipBuffers() 
ForEver

■ La camera suit une entité tout en ayant la possibilité de regarder ailleurs uniquement si l'entité n'est plus en mouvement. (Mode #False ou #True)
Code:
; Naissance d'un cube : Camera Follow
; La camera suit une entité tout en ayant la possibilité de regarder ailleurs
; uniquement si l'entité n'est plus en mouvement. (Mode #False ou #True)

EnableExplicit

InitEngine3D()
InitKeyboard()
InitMouse()
InitSprite()

Global Window, Event
Global Camera, CamX.f, CamY.f
Global Texture, Material, Mesh, Entity
Global Player, PlayerSpeed.f
Global KeyPress.b


Window = OpenWindow(#PB_Any,0,0,1024,768,"Camera Follow")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

;
; Activation Physics et Collisions (A mon avis ça ne sert à rien)
EnableWorldPhysics(#True)
EnableWorldCollisions(#True)

;
; Ambience, Lumiére blanche et activation des ombres
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))

;
; Materiel (texture) qui servira pour le sol, le cube les obstacles
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(0, 0, 0))
Box(1,1,252,252,RGB(255, 216, 0))
StopDrawing()
Material = CreateMaterial(#PB_Any, TextureID(Texture))
MaterialFilteringMode(Material, #PB_Material_Anisotropic, 6) ;Meilleurs rendu de la texture

;
; Creation du sol (Obstacle static)
Mesh = CreatePlane(#PB_Any, 100, 100, 1, 1, 12, 12)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
CreateEntityBody(Entity, #PB_Entity_StaticBody, 0,0,1)

;
; Le joueur
Mesh = CreateCube (#PB_Any, 1)
Player = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None, 0, 0.5, 0)
CreateEntityBody(Player, #PB_Entity_BoxBody, 1, 1, 0)

;
;Debut du jeu : On fixe la caméra derriere le joueur
CameraFollow(Camera, EntityID(Player), 180, EntityY(Player) + 3, 6, 0.05, 0.05, #True) 

;La caméra étant orienté vers le haut,  on la force à regarder vers l'entité
;la caméra bascule de 100 degres en arriere
RotateCamera(Camera, -100, CamX, 0, #PB_Relative)
;Avec une valeur de -180 Degres la camera regarde le sol


Repeat
  Event = WindowEvent()
 
  If ExamineMouse()
    CamX = -MouseDeltaX() * 0.05
    CamY = -MouseDeltaY() * 0.05
  EndIf

  If ExamineKeyboard()
   
    ;Sortie du jeu
    If KeyboardPushed (#PB_Key_Escape)
      Break
    EndIf   
   
    ;En avant ou Freinage
    If KeyboardPushed (#PB_Key_Up)
      PlayerSpeed + 0.1
    ElseIf KeyboardPushed (#PB_Key_Down)
      PlayerSpeed - 0.1
    EndIf
   
    ;A gauche ou à droite
    If KeyboardPushed (#PB_Key_Left)
      RotateEntity(Player, 0, 1.5, 0, #PB_Relative)
    ElseIf KeyboardPushed (#PB_Key_Right)
      RotateEntity(Player, 0, -1.5, 0, #PB_Relative)
    EndIf
       
    ;Freinage d'urgence
    If KeyboardPushed(#PB_Key_Space)
      PlayerSpeed = 0
    EndIf
   
  EndIf
 
  ;Mouvement du joueur 
  MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
 
  ;CameraFollow (PB 5.20) permet de suivre notre entité
  If PlayerSpeed = 0
    CameraFollow(Camera, EntityID(Player), 180, EntityY(Player) + 3, 6, 0.05, 0.05, #False)     
    RotateCamera(Camera, CamY, CamX, 0, #PB_Relative)
  Else
    CameraFollow(Camera, EntityID(Player), 180, EntityY(Player) + 3, 6, 0.05, 0.05, #True)
  EndIf
   
  ; Affiche le rendu de la scène
  RenderWorld(40)
  FlipBuffers() 
ForEver


Dernière édition par falsam le Dim 04/Jan/2015 0:41, édité 3 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Histoire d'un Cube : Créer un joint.
MessagePosté: Sam 14/Sep/2013 18:09 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6856
Localisation: IDF (Yvelines)
La fonction PointJoint(#Joint, EntityID, PivotX, PivotY, PivotZ [, EntityID2, PivotX2, PivotY2, PivotZ2]) permet de réer un point d'articulation (Joint ou encore point de pivot) entre les points centraux de deux entités disposant de propriétés physiques.

■Tout de suite un code qui va mettre un scène notre cube favori (player) sur lequel on va accrocher deux wagons followers (Follower1 & Follower2) chacun étant distant de 2 unités.
Image

Le player étant placé, nous allons travailler sur l'axe Z orienté Nord/Sud.
- Le premier et le second follower sont placés l'un derrière l'autre sur ce même axe chacun étant distant de 2 unites. (Dans l'ordre de nord au sud : Player, Follower1, Follower2)

Le premier joint servira à relier le point central du premier follower au point central du player à deux unités l'un de l'autre sur l'axe Z. Le code correspondant sera le suivant.
Code:
Joint1 = PointJoint(#PB_Any , EntityID(Player), 0, 0, 0, EntityID(Follower1), 0, 0, 2)
De même le second joint servira à le point central du deuxième follower au au point central du premier follower à deux unités l'un de l'autre sur l'axe Z. Le code correspondant sera le suivant.
Code:
Joint2 = PointJoint(#PB_Any , EntityID(Follower1), 0, 0, 0, EntityID(Follower2), 0, 0, 2)

Le code complet pour voir ce que ça donne.
Escape pour quitter, Les fléches de direction pour aller en avant, freiner, tourner à gauche ou à droite. Barre d'espace pour un arret d'urgence. N'allez pas trop vite :)
Code:
; Naissance d'un cube : Jointure
EnableExplicit

InitEngine3D()
InitKeyboard()
InitSprite()

Global Window, Event
Global Camera
Global Texture, Material, Mesh, Entity
Global Player, PlayerSpeed.d
Global Follower1, Follower2
Global Joint1, Joint2
Global X.f, Y.f

Window = OpenWindow(#PB_Any,0,0,1400,768,"Camera Follow")
OpenWindowedScreen(WindowID(window),0,0,1400,768)

;
; Activation Physics et Collision
EnableWorldPhysics(#True)
EnableWorldCollisions(#True)

;
; Ambience, Lumiére blanche et activation des ombres
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;
; Camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))

;
; Materiel
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(0, 0, 0))
Box(1,1,252,252,RGB(255, 216, 0))
StopDrawing()
Material = CreateMaterial(#PB_Any, TextureID(Texture))
MaterialFilteringMode(Material, #PB_Material_Anisotropic, 6) ;Meilleurs rendu de la texture

;
; Creation du sol (Obstacle static)
Mesh = CreatePlane(#PB_Any, 500, 500, 1, 1, 50, 50)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))
CreateEntityBody(Entity, #PB_Entity_StaticBody, 0,0,1)

;
; Le joueur
Mesh = CreateCube (#PB_Any, 1)
Player = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), 0, 0.5, 0)
CreateEntityBody(Player, #PB_Entity_BoxBody, 1, 1, 0.1) ;Notez la friction à 0.1

; Les followers (On se sert du mesh précfédent)

;On place les deux cubes qui vont suivre le cube player
Follower1 = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None, 2, 0.50, 0)
Follower2 = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None, 4, 0.50, 0)

;Ajoutons un peu de physic pour chacun d'eux (Masse, Restitution, friction)
;On donne une friction plus importante afin de ne pas avoir les followers passer devant le cube
;Essayer avec une friction à 0 poru voir le resultat
CreateEntityBody(Follower1, #PB_Entity_BoxBody, 1, 1, 1)
CreateEntityBody(Follower2, #PB_Entity_BoxBody, 1, 1, 1)

;On va attacher le premier follower au player sur l'axe des Z (Orientation Nord -> Sud)
;à 2 unites du point central du player
Joint1 = PointJoint(#PB_Any , EntityID(Player), 0, 0, 0, EntityID(Follower1), 0, 0, 2)

;De la meme maniere on va attacher le deuxiéme follower au premier follower sur l'axe des z à 2 unites du point central du premier follower
Joint2 = PointJoint(#PB_Any , EntityID(Follower1), 0, 0, 0, EntityID(Follower2), 0, 0, 2)

Repeat
  Event = WindowEvent()
 
  If ExamineKeyboard()
   
    ;Sortie du jeu
    If KeyboardPushed (#PB_Key_Escape)
     Break
    EndIf
       
    ;En avant ou Freinage
    If KeyboardPushed (#PB_Key_Up) And PlayerSpeed < 6
      PlayerSpeed + 0.1
    ElseIf KeyboardPushed (#PB_Key_Down) And PlayerSpeed > - 6
      PlayerSpeed - 0.1
    EndIf
   
    ;A gauche ou à droite
    If KeyboardPushed (#PB_Key_Left)
      RotateEntity(Player, 0, 1.5, 0, #PB_Relative)
    ElseIf KeyboardPushed (#PB_Key_Right)
      RotateEntity(Player, 0, -1.5, 0, #PB_Relative)
    EndIf
           
    ;Freinage d'urgence
    If KeyboardPushed(#PB_Key_Space)
      PlayerSpeed = 0
    EndIf
   
  EndIf
 
  ;Mouvement du joueur
  MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
  CameraFollow(Camera, EntityID(Player), 180, EntityY(Player) + 3, 6, 0.05, 0.05, #True)
 
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld(40)
  FlipBuffers() 
ForEver


■ En image, la deuxième façon de créer un joint ou plutot un point d'articulation qui sera placé entre deux entités comme le montre l'image suivante.
Image
Le comportement visuel ne sera pas le même que la première méthode.

Sans rien changer, exécuter à nouveau le code et sans avancer votre player, tourner à gauche ou à droite.

Maintenant remplacer les joints précédents (joint1 et joint2) par
Code:
Joint1 = PointJoint(#PB_Any , EntityID(Player), 0, 0, -1, EntityID(Follower1), 0, 0, 1)
et
Code:
Joint2 = PointJoint(#PB_Any , EntityID(Follower1), 0, 0, -1, EntityID(Follower2), 0, 0, 1)
et exécuter à nouveau.

Enjoy :)


Dernière édition par falsam le Dim 22/Sep/2013 12:18, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube (Initiation à la 3D)
MessagePosté: Dim 15/Sep/2013 8:31 
Hors ligne

Inscription: Mer 21/Jan/2004 17:48
Messages: 5162
sympa tout ces exemples.

_________________
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube (Initiation à la 3D)
MessagePosté: Dim 15/Sep/2013 9:57 
Hors ligne
Site Admin

Inscription: Mer 21/Jan/2004 11:03
Messages: 2565
Très explicite !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube (Initiation à la 3D)
MessagePosté: Dim 15/Sep/2013 20:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 29/Juil/2004 16:33
Messages: 2800
Localisation: Klyntar
Ce cube continue ce petit bout de chemin :P :roll:
Merci





@++

_________________
Windows 10 x64, PureBasic 5.71 Beta 1 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Histoire d'un Cube
MessagePosté: Mar 17/Sep/2013 14:21 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6856
Localisation: IDF (Yvelines)
Comtois, Fred et Venom merci pour vos encouragements. Etant en phase de découverte d'Ogre3D, je ne fais que poster au fur et à mesure de mon avancement dans ce monde en espérant qu'il n'y a pas d'erreur dans les explications que je donne.

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Dernière édition par falsam le Dim 22/Sep/2013 12:18, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Histoire d'un Cube : Rotation d'une entité
MessagePosté: Mar 17/Sep/2013 16:22 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6856
Localisation: IDF (Yvelines)
SPH a écrit:
Ha oui, j'oubliais : il serait bon de faire un code qui fasse tourner un cube et pas la camera
Ooops pas vu ce commentaire. Désolé SPH de cette réponse plus que tardive.

A mon avis tu as du trouver la solution grâce à l'utilisation de la fonction RotateEntity().
Code:
; Rotation d'une entité
InitEngine3D()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Histoire d'un cube - Rotation d'une entité")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -50, 100, 200)
WorldShadows(#PB_Shadow_Additive)

; Camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))
MoveCamera(Camera,2,5,10)
CameraLookAt(Camera,0,0,0)

; Texture manuel (Fond jaune et contour noir)
Texture = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture))
Box(0,0,512,512,RGB(0, 0, 0))
Box(4,4,504,504,RGB(255, 215, 0))
StopDrawing()

; Création du cube
Material = CreateMaterial(#PB_Any, TextureID(Texture))
MaterialFilteringMode(Material, #PB_Material_Anisotropic, 6) ;Meilleurs rendu du materiel

Mesh = CreateCube(#PB_Any, 3)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))

While #True
 
  Event = WindowEvent()
   
  ExamineKeyboard() 
 
  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf 
 
  ;Rotation du cube de 0.2° par rapport à la rotation précédente (#PB_Relative)   
  RotateEntity(Entity, 0, 0.2, 0, #PB_Relative)
 
  ; Affiche le rendu de la scène
  RenderWorld(40)
  FlipBuffers()
Wend

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Dernière édition par falsam le Dim 04/Jan/2015 0:39, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Histoire d'un Cube - Matériel transparent
MessagePosté: Mar 17/Sep/2013 17:12 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6856
Localisation: IDF (Yvelines)
En plus des trois couches rouge, verte et bleue, une texture peut posséder une quatrième couche : La couche alpha.

Cette couche ne modifie pas les couleurs de la texture. Elle sert à gérer la transparence de cette texture.

Quand la valeur alpha est à zéro, la texture est invisible, tandis qu'une valeur maximale à 255 spécifie que la texture est opaque.

Dans le code qui suit, nous allons enfermer un cube dans un autre en rotation qui pourra devenir transparent ou pas.

Les grandes lignes sont simples.
-Création d'une texture jaune avec un contour noir. On prendra soin d'utiliser le system de couleur RGBA.
-Création de deux cubes au point de coordonnée (0,0,0). Le premier cube (sans matériel) sera inclus dans un autre cube plus grand.
-On utilisera la fonction MaterialBlendingMode() pour indiquer la manière dont le materiel (La texture) sera mixée avec le monde 3D
Code:
MaterialBlendingMode(Material, #PB_Material_AlphaBlend)
ainsi que la fonction SetMaterialColor() pour modifie la couleur du materiel (Texture)
Code:
SetMaterialColor(Material, #PB_Material_DiffuseColor, RGBA(255, 215, 0, 128))

-Les touche + et - serviront à augmenter ou diminuer la valeur de la composante alpha de la texture.

Le code complet
Code:
; Rendre une couche matériel transparente

InitEngine3D()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Histoire d'un cube (le néant)")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -50, 100, 200)
WorldShadows(#PB_Shadow_Additive)

; Camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))
MoveCamera(Camera,2,5,10)
CameraLookAt(camera,0,0,0)

; Texture manuel avec une couche alpha (Fond jaune et contour noir)
Texture = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture))
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,512,512,RGBA(0, 0, 0, 255))
Box(4,4,504,504,RGBA(255, 215, 0, 255))
StopDrawing()

; Création du matériel
Material = CreateMaterial(#PB_Any, TextureID(Texture))

; Un premier cube qui sera inclus dans le suivant.
Mesh = CreateCube(#PB_Any, 1)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None)

; Change la manière dont le materiel (La texture) sera mixée avec le monde 3D
MaterialBlendingMode(Material, #PB_Material_AlphaBlend)

;Modifie la couleur du materiel (Texture).
;A laffichage la composante alpha du fond jaune de la texture sera réglée à 128
SetMaterialColor(Material, #PB_Material_DiffuseColor, RGBA(255, 215, 0, 128))
Alpha = 128

; Création du cube qui contient le précédent
Mesh = CreateCube(#PB_Any, 4)
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))

While #True
 
  Event = WindowEvent()
   
  ExamineKeyboard() 
 
  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf 
 
  ; Touche + augmente la valeur alpha
  If KeyboardPushed(#PB_Key_Add) And Alpha < 255
    Alpha + 1
    SetMaterialColor(Material, #PB_Material_DiffuseColor, RGBA(255, 215, 0, Alpha))
  EndIf
 
  ; Touhce - diminue la valeur alpha
  If KeyboardPushed(#PB_Key_Subtract) And Alpha > 0
    Alpha - 1
    SetMaterialColor(Material, #PB_Material_DiffuseColor, RGBA(255, 215, 0, Alpha))
  EndIf
 
  RotateEntity(Entity, 0, 0.5, 0, #PB_Relative)
 
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld(30)
 
  ; Affichage sur un sprite de la valeur de la composante alpha (transparence) de la couleur.
  PanelScore = CreateSprite(#PB_Any,1024,20)
  StartDrawing(SpriteOutput(PanelScore))
  Box(0, 0, 1024, 20, RGB(70, 130, 180))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(5,2,"Transparence "+ Str(Alpha))
  DrawText(130, 2, "- Touches + ou - pour augmenter ou diminuer la valeur Alpha - Esc pour quitter")
  StopDrawing() 
  DisplaySprite(PanelScore, 0, 746)
  FlipBuffers()
Wend


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Histoire d'un Cube : GUI (Interface Graphique Utilisateu
MessagePosté: Dim 22/Sep/2013 0:45 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6856
Localisation: IDF (Yvelines)
GUI est l'acronyme de l'expression anglaise Graphical User Interface, signifiant Interface Graphique d'Utilisateur.

Pour que l'interface graphique fonctionne vous devez ajouter un chemin absolu vers le dossier GUI contenant le thème graphique de cette interface.

Si, comme je le préconise dans le premier message, vous avez installé le dossier GUI dans le dossier data de votre application, vous allez indiqué ce chemin absolu de cette manière.
Code:
Add3DArchive("Data/GUI/", #PB_3DArchive_FileSystem)
Cette interface est représentée par une fenêtre initialisée avec la fonction
Code:
OpenWindow3D(#Fenetre3D, x, y, LargeurInterne, HauteurInterne, Titre$ [, Options])
A l'intérieur de cette fenêtre vous allez pouvoir placer des gadget3D comme par exemple un TextGadget3D(), un StringGadget3D(), un ButtonGadget3D(), etc ....

Pour afficher ou cacher l'interface graphique, utilisez ce code
Code:
ShowGUI(128 , #True)
Le premier paramètre permet de jouer sur la transparence de l'interface 3D (De 0 à 255). Le seconde paramètre affiche (#True) ou pas (#False) le curseur de la souris.
Tous les événements possibles dans cette fenêtre 3D sont gérés par la commande WindowEvent3D().
Code:
Repeat
  Event3D = WindowEvent3D()
  GEvent3D = EventGadget3D()
  Select Event3D
    Case #PB_Event3D_CloseWindow
      End
       
    Case #PB_Event3D_Gadget
      Select GEvent3D
           
      EndSelect       
  EndSelect
Until Event3D = 0
Les événements de la souris pourront être intercepter par exemple avec le code suivant :
Code:
If ExamineMouse()   
    InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
EndIf

Le code de synthèse ci-dessous, va vous montrer comment mettre en oeuvre cette interface graphique 3D.

Afin de rendre plus attrayant ce code, nous allons placer un cube et essayer de connaitre sa position 3D en cliquant sur celui-çi avec la souris. Nous mettrons en oeuvre la fonction MousePick() qui permet de connaitre l'objet se trouvant au point de coordonnées 2D X, Y. Cette fonction sera associé aux trois fonctions PickX(), PickY(), PickZ() pour connaitre la position de l'objet sélectionné sur les axe X,Y, Z.

Enfin nous afficherons le résultat sur notre interface graphique.
Code:
EnableExplicit

Enumeration MainForm
  #Mainform
EndEnumeration

Enumeration MainForm3D
  #MainForm3D
EndEnumeration

Enumeration Gadget3D
  #PickX
  #PickY
  #PickZ
EndEnumeration

Define.l Event, Event3D, GEvent3D

Global PickX.f, PickY.f, PickZ.f

Global Camera.i, CamX.f, CamY.f, CamZ.f

Global Mesh, Entity

InitEngine3D()
InitKeyboard()
InitSprite()
InitMouse()

;Pour que l'interface graphique fonctionne vous devez ajouter un chemin absolu
;Vers le dossier GUI contenant le théme graphique de cette interface.
Add3DArchive("Data/GUI/", #PB_3DArchive_FileSystem)

OpenWindow(#Mainform,0,0,1024,768, "l'interface graphique utilisateur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Mainform),0, 0, 1024, 768)
 
KeyboardMode(#PB_Keyboard_International)

;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)

;Un cube
Mesh = CreateCube(#PB_Any, 3)
CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None, 0, 0, 0)

;camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))

CamX = 2.0
CamY = 5.0
CamZ = 15.0

;Interface 3D
OpenWindow3D(#MainForm3D, 0, 0, 300, 300, "Position X,Y,Z de l'entité")

TextGadget3D(#PB_Any, 5, 10, 50, 20, "PickX")
TextGadget3D(#PickX, 70, 10, 100, 20, "0")

TextGadget3D(#PB_Any, 5, 40, 50, 20, "PickY")
TextGadget3D(#PickY, 70, 40, 100, 20, "0")

TextGadget3D(#PB_Any, 5, 70, 50, 20, "PickZ")
TextGadget3D(#PickZ, 70, 70, 100, 20, "0")

;Affiche les éléments de l'interface graphique (GUI),
;Le premier paramétre indique la transparence de l'interface graphique de 0 à 255)
;Le deuxiéme paramétre permet d'afficher ou pas le curseur de la souris.
ShowGUI(128 , #True)

Repeat
 
  ;-Evenements Window
  Repeat
    Event  = WindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        End
               
    EndSelect
  Until Event = 0
 
  ;-Evenement Window 3D
  Repeat
    Event3D = WindowEvent3D()
    GEvent3D = EventGadget3D()
    Select Event3D
      Case #PB_Event3D_CloseWindow
        End
       
      Case #PB_Event3D_Gadget
        Select GEvent3D
           
        EndSelect
       
    EndSelect
  Until Event3D = 0
 
  ;-Evenements souris
  If ExamineMouse()   
    InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
           
    If MouseButton(#PB_MouseButton_Left)
     
      PickX = 0
      PickY = 0
      PickZ = 0
     
      ;Quel est l'entité sur lequel on vient de cliquer
      Entity = MousePick(Camera, MouseX(), MouseY())
     
      If Entity <> -1
        PickX = PickX() ;Position sur l'axe x
        PickY = PickY() ;Position sur l'axe y
        PickZ = PickZ() ;Position sur l'axe z
      EndIf
     
      SetGadgetText3D(#PickX, StrF(PickX))
      SetGadgetText3D(#PickY, StrF(PickY))
      SetGadgetText3D(#PickZ, StrF(PickZ))   
    EndIf           
  EndIf 
   
  ;-Evenements clavier
  If ExamineKeyboard() 
    If KeyboardPushed (#PB_Key_Escape)
      Break
    EndIf
  EndIf
 
  MoveCamera(Camera, CamX, CamY, CamZ, #PB_Absolute) 
  CameraLookAt(Camera, 0,0,0)

  ;- Rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld(80)
  FlipBuffers() 
 
ForEver

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 67 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye