Histoire d'un Cube (Notions de base à la 3D)

Généralités sur la programmation 3D
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube : Les particules

Message par falsam »

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 : Tout sélectionner

; 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 : Tout sélectionner

; 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 : Tout sélectionner

ParticleEmitterDirection(Emiter, 0.00, 0.01, 0.00)
Dernière modification par falsam le dim. 22/sept./2013 12:16, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube : Il neige

Message par falsam »

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 : Tout sélectionner

; 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 : Tout sélectionner

ParticleEmitterDirection(Emiter0, 0.05, -0.1, 0.00)
Dernière modification par falsam le dim. 22/sept./2013 12:17, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Zoomer sur une scène

Message par falsam »

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 : Tout sélectionner

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
Dernière modification par falsam le mar. 17/sept./2013 14:31, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Zoomer sur une scène

Message par Ar-S »

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 : Tout sélectionner

Define.f CamX, CamY, CamZ
[/quote]

Très fluide ce dernier code (testé en 5.20 b12)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Histoire d'un Cube (Initiation à la 3D)

Message par blendman »

Un modo devrait mettre ce sujet dans les tutoriaux ;)
pat
Messages : 406
Inscription : mar. 24/nov./2009 15:13

Re: Histoire d'un Cube (Initiation à la 3D)

Message par pat »

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...
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube : CameraFollow()

Message par falsam »

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 : Tout sélectionner

; 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 : Tout sélectionner

; 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 : Tout sélectionner

; 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 modification par falsam le dim. 04/janv./2015 0:41, modifié 3 fois.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube : Créer un joint.

Message par falsam »

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 : Tout sélectionner

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 : Tout sélectionner

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 : Tout sélectionner

; 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 : Tout sélectionner

Joint1 = PointJoint(#PB_Any , EntityID(Player), 0, 0, -1, EntityID(Follower1), 0, 0, 1)
et

Code : Tout sélectionner

Joint2 = PointJoint(#PB_Any , EntityID(Follower1), 0, 0, -1, EntityID(Follower2), 0, 0, 1)
et exécuter à nouveau.

Enjoy :)
Dernière modification par falsam le dim. 22/sept./2013 12:18, modifié 1 fois.
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Histoire d'un Cube (Initiation à la 3D)

Message par comtois »

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.
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Re: Histoire d'un Cube (Initiation à la 3D)

Message par Fred »

Très explicite !
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Histoire d'un Cube (Initiation à la 3D)

Message par venom »

Ce cube continue ce petit bout de chemin :P :roll:
Merci





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube

Message par falsam »

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.
Dernière modification par falsam le dim. 22/sept./2013 12:18, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube : Rotation d'une entité

Message par falsam »

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 : Tout sélectionner

; 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
Dernière modification par falsam le dim. 04/janv./2015 0:39, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube - Matériel transparent

Message par falsam »

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 : Tout sélectionner

MaterialBlendingMode(Material, #PB_Material_AlphaBlend)
ainsi que la fonction SetMaterialColor() pour modifie la couleur du materiel (Texture)

Code : Tout sélectionner

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 : Tout sélectionner

; 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
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Histoire d'un Cube : GUI (Interface Graphique Utilisateu

Message par falsam »

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 : Tout sélectionner

Add3DArchive("Data/GUI/", #PB_3DArchive_FileSystem)
Cette interface est représentée par une fenêtre initialisée avec la fonction

Code : Tout sélectionner

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 : Tout sélectionner

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 : Tout sélectionner

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 : Tout sélectionner

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 : Tout sélectionner

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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre