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 :

Re: Histoire d'un Cube

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
RotateEntity()

Touche PageUp et PageDown dans ce code pour la rotation de l'entité.

Code : Tout sélectionner

;Naissance d'un cube

; Coordonnées x,y,z de la caméra
Define.f CamX, CamY, CamZ, Y

InitEngine3D()
Parse3DScripts()
InitKeyboard()
InitSprite()

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

;
; Les axes
Red = RGB(255, 0, 0) ;Couleur de l'axe x
Green = RGB(0, 255, 0) ;Couleur de l'axe y 
Blue = RGB(0, 255, 255) ;Coleur de l'axe z

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)

;
; Naissance d'un cube

; Une forme : C'est notre MESH qui ici sera un cube
Mesh = CreateCube(#PB_Any, 2)

; Une texture (Cette texture peut être loader avec l'instruction LoadTexture()
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,128,256,RGB(255, 68, 0))
Box(128,0,128,256,RGB(0, 255, 0))
StopDrawing()

; Un MATERIEL c'est la partie visible de notre cube qui sera constitué de notre texture
Material = CreateMaterial(#PB_Any,TextureID(texture))

; Création de notre entité : ENTITE = MESH + MATERIEL
; Par défaut il se positionne au point de coordonnée 0,0,0
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))

;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CamX=2.0
CamY=1.0
CamZ=15

; La caméra regarde en dirextion d'un point au coordonnées x=0, y=0, z=0
CameraLookAt(camera,0,0,0)


While #True
  
  Event = WindowEvent()
  
  ExamineKeyboard() 
  
  ; Touche Escape pour fermer l'application
  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 
  
  If KeyboardPushed(#PB_Key_PageDown)
    Y=-0.5
  ElseIf KeyboardPushed(#PB_Key_PageUp)
    Y=0.5
  Else
    Y=0
  EndIf 
  
  RotateEntity(Entity, X, Y, Z, #PB_Relative)
    
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend
Dernière modification par falsam le dim. 22/sept./2013 12:14, 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
SPH
Messages : 4721
Inscription : mer. 09/nov./2005 9:53

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

Message par SPH »

Pour faire un cube ayant une texture differente sur chaque face, je suppose que l'on ne doit plus utiliser Mesh = CreateCube(#PB_Any, 1) ?

Tiens, en défi, je cherche a faire un cube qui tourne et qui, dans chaque face montre un cube qui tourne !
Mais je n'arrive pas a animer les faces :

Code : Tout sélectionner

;Naissance d'un cube

; Coordonnées x,y,z de la caméra
Define.f CamX, CamY, CamZ, Y

Define.f 

InitEngine3D()
Parse3DScripts()
InitKeyboard()
InitSprite()

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

;
; Les axes
Red = RGB(255, 0, 0) ;Couleur de l'axe x
Green = RGB(0, 255, 0) ;Couleur de l'axe y 
Blue = RGB(0, 255, 255) ;Coleur de l'axe z

; 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)

;
; Naissance d'un cube

; Une forme : C'est notre MESH qui ici sera un cube
Mesh = CreateCube(#PB_Any, 6)

; Une texture (Cette texture peut être loader avec l'instruction LoadTexture()
Texture = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(Texture))
Box(0,0,256,256,RGB(200, 100, 0))
Box(2,2,253,253,RGB(255, 200, 0))
StopDrawing()

; Un MATERIEL c'est la partie visible de notre cube qui sera constitué de notre texture
Material = CreateMaterial(#PB_Any,TextureID(texture))

; Création de notre entité : ENTITE = MESH + MATERIEL
; Par défaut il se positionne au point de coordonnée 0,0,0
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material))

;
; Une camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CamX=0
CamY=0
CamZ=15

; La caméra regarde en dirextion d'un point au coordonnées x=0, y=0, z=0
CameraLookAt(camera,0,0,0)


While #True
  
  Event = WindowEvent()
  
  ExamineKeyboard() 
  
  ; Touche Escape pour fermer l'application
  If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
    Break
  EndIf 
  
  X=-0.2
  Y=-0.5
  Z=-0.7
  
  RotateEntity(Entity, X, Y, Z, #PB_Relative)
    
  MoveCamera(camera, CamX, CamY, CamZ, #PB_Absolute)
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend
End
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube : Permis de conduire

Message par falsam »

Il est temps de compliquer un peu la vie de notre cube qui veut maintenant se déplacer.

Cet épisode intègre les tutos précédents auquel s'ajoute la notion de physique

Pour que les collisions soient gérées par le moteur physique, une entité doit avoir un corps. Dans le cas contraire il est en mode fantôme. On peut passer à travers l'entité.

Le moteur physique s'occupera de tous les calculs en fonction des paramètres de masse, frottement (friction) et restitution.

Vous allez voir comment poser des obstacles mobiles ainsi que des obstacles statics.

J'ai aussi introduit une notion d'inertie du joueur quand les touches de déplacement ne sont pas utilisées.

Touche de directions Gauche, Droit, Haut et Bas pour se diriger.
Touche PageHaut et PageBas pour le Jet-Pack
Touche Espace pour le freinage d'urgence.

Le code est largement documenté et n'hésitez pas à placer le curseur sur une des instructions et d'appuyer sur la touche F1.

Enjoy :)

Code : Tout sélectionner

; Naissance d'un cube : Permis de conduire (Gestion des collisions)

EnableExplicit

InitEngine3D()
InitKeyboard()
InitSprite()

Global Window, Event
Global Camera

Global Texture, Material ;Materiel (Texture) qui servira à toutes les entités 
Global Player, PlayerSpeed.d
Global Ground_Mesh, Ground
Global Cube_Mesh, Cube
Global ObstacleMobile, ObstacleStatic

Global N, X.f, Y.f

Window = OpenWindow(#PB_Any,0,0,1024,768,"Cube 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))

;
; Un cube qui servira pour le joueur et les obstacles
Cube_Mesh = CreateCube (#PB_Any, 1)

;
; Creation du sol (Obstacle static)
Ground_Mesh = CreatePlane(#PB_Any, 50, 50, 1, 1, 6, 6)
Ground = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material))
CreateEntityBody(Ground, #PB_Entity_StaticBody, 0,0,1)

;
; Le joueur
Player = CreateEntity(#PB_Any, MeshID(Cube_Mesh), #PB_Material_None, 0, 2, 0)
;ScaleEntity(Player, 1, 2, 0.5)
CreateEntityBody(Player, #PB_Entity_BoxBody, 1, 1, 0)

;
; Quelques obstacles mobile
Y=0.50

For N=1 To 20
  X+1
  If X=6
    X=1
    Y+1
  EndIf  
  
  ObstacleMobile = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material), X, Y, 10)
  CreateEntityBody(ObstacleMobile, #PB_Entity_BoxBody, 1, 1, 1) 
Next

; Quelques obstacles static (Contour de la platform)
ObstacleStatic = CreateEntity(#PB_Any, MeshID(Cube_Mesh), #PB_Material_None, 0, 0.8, 24.6)
ScaleEntity(ObstacleStatic, 25, 1.5, 0.5)
CreateEntityBody(ObstacleStatic, #PB_Entity_StaticBody)

ObstacleStatic = CreateEntity(#PB_Any, MeshID(Cube_Mesh), #PB_Material_None, 0, 0.8, -24.6)
ScaleEntity(ObstacleStatic, 25, 1.5, 0.5)
CreateEntityBody(ObstacleStatic, #PB_Entity_StaticBody)

ObstacleStatic = CreateEntity(#PB_Any, MeshID(Cube_Mesh), #PB_Material_None, -24.6, 0.8, 0)
ScaleEntity(ObstacleStatic, 25, 1.5, 0.5)
RotateEntity(ObstacleStatic, 0, 90, 0)
CreateEntityBody(ObstacleStatic, #PB_Entity_StaticBody)

ObstacleStatic = CreateEntity(#PB_Any, MeshID(Cube_Mesh), #PB_Material_None, 24.6, 0.8, 0)
ScaleEntity(ObstacleStatic, 25, 1.5, 0.5)
RotateEntity(ObstacleStatic, 0, 90, 0)
CreateEntityBody(ObstacleStatic, #PB_Entity_StaticBody)

;Une platform 
ObstacleStatic = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material), 10, 2.5, -15)
ScaleEntity(ObstacleStatic, 5, 5, 5)
RotateEntity(ObstacleStatic, 0, 90, 0)
CreateEntityBody(ObstacleStatic, #PB_Entity_StaticBody)

Repeat
  Event = WindowEvent()
  
  If ExamineKeyboard()
    
    ;Sortie du jeu
    If KeyboardPushed (#PB_Key_Escape)
     Break
    EndIf
    
    ;Inertie du joueur quand les touches de direction sont inactives 
    If PlayerSpeed > 0 
      ;Le joueur était en train d'avancer : on le ralenti
      PlayerSpeed - 0.05
    ElseIf PlayerSpeed < 0
      ;Le joueur était en train de reculer : on le ralenti
      PlayerSpeed + 0.05
    Else
      PlayerSpeed = 0
    EndIf
    
    ;En avant ou en arriére
    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
       
    MoveEntity(Player, 0, 0, PlayerSpeed, #PB_Absolute|#PB_Local)
    
    ;CamearaFollow (PB 5.20) permet de suivre l'entité 
    CameraFollow(Camera, EntityID(Player), -180, EntityY(Player)+2, 6, 0.05, 0.05, #True)   
    
    ;Jet Pack une impulsion sur l'axe des y (hauteur)
    If KeyboardPushed(#PB_Key_PageUp)
      ApplyEntityImpulse(Player, 0, 5, 0)
    EndIf   
    
    If KeyboardPushed(#PB_Key_PageDown)
      ApplyEntityImpulse(Player, 0, -5, 0)
    EndIf   
    
    ;Freinage d'urgence
    If KeyboardPushed(#PB_Key_Space)
      PlayerSpeed = 0
    EndIf
    
  EndIf
  
  ; Affiche le rendu de la scène
  RenderWorld(40)
  FlipBuffers()  
ForEver
Comme d'habitude, toutes les remarques visant à améliorer ce code (Oui je ne suis pas un expert) sont les bienvenues.
Dernière modification par falsam le dim. 04/janv./2015 0:42, modifié 11 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: Histoire d'un Cube (Initiation à la 3D)

Message par Ar-S »

Excellent !
~~~~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
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

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

Message par G-Rom »

il ne faut pas que tu forces l'entité à aller vers le bas :
MoveEntity(Player, 0, -1, PlayerSpeed, #PB_Absolute|#PB_Local)
Car tu est sur le "mur cassable" , ton cube aura tendance a sautiller et détruire le mur , laisse la physique gérer la gravité.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Histoire d'un Cube

Message par falsam »

G-Rom a écrit :il ne faut pas que tu forces l'entité à aller vers le bas
Tu as raison c'était idiot ce que j'ai fait ! Code corrigé.
Dernière modification par falsam le dim. 22/sept./2013 12:15, 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 : Ramasser des piéce

Message par falsam »

Le code précédent était une première approche plutôt passive de la gestion des collisions.
Ce nouveau code a pour objectif d'implanter une dynamique des collisions.

L'objectif est de ramasser des pièces.
-Chaque pièce est une entité physique (sans masse ni friction, ni restitution)
-Chaque pièce est stockée dans une liste chainée.
-Avec un cube, vous percuterez chacune des pièces.
Mise en oeuvre de l'instruction EntityCollide(#Entity, #Entity2)
-Quand une pièce est percutée on l'élimine.

Code : Tout sélectionner

;Naissance d'un cube : Ramasser des pièces (Gestion des collisions)

; Coordonnées x,y,z du Cube Avatar
Define.f X, Y, Z

Structure Obstacle
  Id.i ;Identification entité
EndStructure

NewList Money.Obstacle()

InitEngine3D()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Affichage des coordonnées du cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

; 
; Une texture qui servira pour le sol, le cube et les piéces
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 matériel qui servira pour le sol, le cube et les piéces
Material = CreateMaterial(#PB_Any,TextureID(texture))

;
; Le sol 
Ground_Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)
Ground = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, 0, 0)
CreateEntityBody(Ground, #PB_Entity_StaticBody, 2, 0, 1)

; 
; Le cube avatar
Cube_Mesh = CreateCube(#PB_Any, 1) 
Cube_Entity = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material))
MoveEntity(Cube_Entity, 0, 2, 5)
CreateEntityBody(Cube_Entity, #PB_Entity_BoxBody, 2,0,0)

;
; Les pièces
Money_Mesh = CreateCylinder(#PB_Any, 1, 1)
X=-5
For N=-3 To 3
  X=N*2
  
  AddElement(Money())
  With Money()
    \Id = CreateEntity(#PB_Any, MeshID(Money_Mesh), MaterialID(Material), x,1,0)
    ScaleEntity(\Id, 0.5, 0.2, 0.5)
    RotateEntity(\Id, 0, 0, 90)
    CreateEntityBody(\Id, #PB_Entity_BoxBody, 0, 0, 0)
  EndWith
Next

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

;
; Une camera 
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(131, 204, 249))

While #True
  
  Event = WindowEvent()
    
  If ExamineKeyboard()  
  
    ; Touche Escape pour fermer l'application
    If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
      Break
    EndIf  
  
    If KeyboardPushed(#PB_Key_Left)
      X=-1  
    ElseIf KeyboardPushed(#PB_Key_Right)
      X=1
    Else 
      X=0
    EndIf
  
    If KeyboardPushed(#PB_Key_Up)
      Z=-1  
    ElseIf KeyboardPushed(#PB_Key_Down)
      Z=1
    Else
      Z=0
    EndIf
    
    ;Quel sont les piéces qui sont entrer en collision avec le cube
    ForEach(Money())
      If EntityCollide(Cube_Entity, Money()\Id)
        FreeEntity(Money()\Id) ;Destruction de la piéce
        DeleteElement(Money()) ;Supprime l'élément courant de la liste
      EndIf
    Next
  EndIf
  
  MoveEntity(Cube_Entity, X,0,Z, #PB_Absolute|#PB_Local)
  MoveCamera(Camera, 0, 5 , 15, #PB_Absolute)
  CameraLookAt(camera,EntityX(Cube_Entity),EntityY(Cube_Entity),EntityZ(Cube_Entity))
   
  ; Affiche le rendu de la scène
  RenderWorld(60)
  FlipBuffers()
Wend
Dernière modification par falsam le dim. 04/janv./2015 0:42, 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
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

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

Message par venom »

Bravo, exelent tutos :P
Bonne continuation pour la suite 8)





@++
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 :

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

Message par falsam »

venom a écrit :Bravo, exelent tutos :P
Merci pour tes encouragements :)
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 : Ajoutons un score

Message par falsam »

Dans notre code précédent nous avons vu comment gérer les collisions en ramassant des pièces. Nous allons maintenant ajouter un score qui correspond au nombre de pièces ramassées.

C'est l'occasion de voir comment intégrer des sprites 2D dans un monde 3D.

- Le calcul du score est fait au moment ou le cube percute une piéce (Ligne 98)
- S'agissant d'un sprite, l'affichage du score ne peut se faire qu'aprés l'instruction RenderWorld().

Touche de directions Gauche, Droit, Haut et Bas pour se diriger.

Code : Tout sélectionner

;Naissance d'un cube : Ramasser des pièces (Gestion des collisions)

; Coordonnées x,y,z du Cube Avatar
Define.f X, Y, Z

Structure Obstacle
  Id.i ;Identification entité
EndStructure

NewList Money.Obstacle()

InitEngine3D()
InitKeyboard()
InitSprite()

window = OpenWindow(#PB_Any,0,0,1024,768,"Affichage des coordonnées du cube")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

; 
; Une texture qui servira pour le sol, le cube et les piéces
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, le cube et les piéces
Material = CreateMaterial(#PB_Any,TextureID(texture))

;
; Le sol 
Ground_Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)
Ground = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, 0, 0)
CreateEntityBody(Ground, #PB_Entity_StaticBody, 2, 0, 1)

; 
; Le cube avatar
Cube_Mesh = CreateCube(#PB_Any, 1) 
Cube_Entity = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material))
MoveEntity(Cube_Entity, 0, 2, 5)
CreateEntityBody(Cube_Entity, #PB_Entity_BoxBody, 2,0,0)

;
; Les pieces
Money_Mesh = CreateCylinder(#PB_Any, 1, 1)
X=-5
For N=-3 To 3
  X=N*2
  
  AddElement(Money())
  With Money()
    \Id = CreateEntity(#PB_Any, MeshID(Money_Mesh), MaterialID(Material), x,1,0)
    ScaleEntity(\Id, 0.5, 0.2, 0.5)
    RotateEntity(\Id, 0, 0, 90)
    CreateEntityBody(\Id, #PB_Entity_BoxBody, 0, 0, 0)
  EndWith
Next

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

;
; Une camera 
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(131, 204, 249))

While #True
  
  Event = WindowEvent()
    
  If ExamineKeyboard()  
  
    ; Touche Escape pour fermer l'application
    If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
      Break
    EndIf  
  
    If KeyboardPushed(#PB_Key_Left)
      X=-1  
    ElseIf KeyboardPushed(#PB_Key_Right)
      X=1
    Else 
      X=0
    EndIf
  
    If KeyboardPushed(#PB_Key_Up)
      Z=-1  
    ElseIf KeyboardPushed(#PB_Key_Down)
      Z=1
    Else
      Z=0
    EndIf
    
    ;-Quel sont les piéces qui sont entrer en collision avec le cube
    ForEach(Money())
      If EntityCollide(Cube_Entity, Money()\Id)
        Score + 1              ; Ajout d'un point au score
        FreeEntity(Money()\Id) ;Destruction de la piéce
        DeleteElement(Money()) ;Supprime l'élément courant de la liste
      EndIf
    Next
  EndIf
  
  MoveEntity(Cube_Entity, X,0,Z, #PB_Absolute|#PB_Local)
  MoveCamera(Camera, 0, 5 , 15, #PB_Absolute)
  CameraLookAt(camera,EntityX(Cube_Entity),EntityY(Cube_Entity),EntityZ(Cube_Entity))
  

  ; Affiche le rendu de la scène
  RenderWorld(60)
  
  ;-Affichage des scores (Doit etre intégré après l'instruction RenderWorld()
  PanelScore = CreateSprite(#PB_Any,100,20)
  StartDrawing(SpriteOutput(PanelScore))
  Box(0,0,100,20, RGBA(178, 34, 34, 255))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(5,2,"Piéces "+ Str(Score))
  StopDrawing()  
  DisplaySprite(PanelScore, 0, 0)
  FlipBuffers()
Wend
Dernière modification par falsam le dim. 04/janv./2015 0:43, 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
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message par Micoute »

Merci Falsam pour tes cours de 3D que je suis avec enthousiasme et soif d'apprendre et je trouve super que tu ais commencé par les bases, ce qui permet d'évoluer en comprenant la syntaxe et le cheminement de la programmation en 3D.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
raven
Messages : 222
Inscription : jeu. 06/janv./2005 15:45

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

Message par raven »

merci falsam,je suis également tes tutos sur la 3d,c'est super ce que tu fait :wink:
Pb5.24 Lts/5.31 Windows 7 64 nvidia 560 ti E8500 8g ram
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Histoire d'un Cube : Un peu de relief

Message par falsam »

Ce code est réduit à son strict minimum. Nous allons voir de quel manière on va :
- Créer un ciel
- Ajouter du soleil
- Ajouter du brouillard
- Ajouter de l'eau
- Ajouter un terrain

Télécharger le fichier compressé suivant.
Mer et Ciel.zip (Source 4.31 Mo)

Le dossier que vous venez de télécharger contient trois sous dossiers
-Terrain Contient des textures de terrains ainsi que des textures en noir et blanc définissant le relief d'un terrain. Plus les points sont proches du blanc et plus on monte en altitude.

-Skybox Un (Une) skybox est une grande boîte texturée à l'intérieur qui permet d'afficher un ciel dans toutes les directions dans lesquelles vous regardez. Le dossier SkyBox contient des fichiers compressés contenant chacun les 6 faces internes d'un cube matérialisant un ciel.

-Water Vous l'avez compris, ce dossier contient les textures qui vont permettre de matérialiser l'eau.

Je poste le code complet et commenté, mais sans les textures il ne fonctionne pas.

Code : Tout sélectionner

;Histoire d'un cube - Un peu de relief

Define CamX.f, CamY.f

InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
  
    
Window = OpenWindow(#PB_Any,0,0,1024,700,"3d",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(Window), 0, 0, 1024, 700, 0, 0,0)

;
;Nous utiliserons l'instruction Add3DArchive() pour ajouter les chemins absolus ou relatifs
;de ces trois dossiers dans la liste actuelle des répertoires disponibles pour les fonctions 3D.
Add3DArchive("Data/Terrain/", #PB_3DArchive_FileSystem)
Add3DArchive("Data/Skybox/Stormy.zip", #PB_3DArchive_Zip) 
Add3DArchive("Data/Water", #PB_3DArchive_FileSystem) 
    
WorldShadows(#PB_Shadow_TextureAdditive)
  
; 
; Camera
Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(Camera,  800, 200, 0)
  
;
; Lumiere (Obligatoire pour la création du terrain)
Light = CreateLight(#PB_Any ,RGB(190, 190, 190), 0, 100, 0, #PB_Light_Directional)
     
;
; Eau, Soleil, Brouillard
SkyBox("stormy.jpg")
CreateWater(Camera, 0, 100, 0, 0, #PB_World_WaterLowQuality | #PB_World_WaterCaustics | #PB_World_WaterSmooth | #PB_World_WaterFoam | #PB_World_WaterGodRays)
Sun(10000, 10000, -100000, RGB(238, 173, 148))
Fog(RGBA(253, 245, 230, 155), 100, 1, 2000)
  
;
; Terrain
SetupTerrains(LightID(Light), 3000, #PB_Terrain_NormalMapping)
  
;  
; Initialisation du terrain 
Terrain = CreateTerrain(#PB_Any, 512+1, 3000, 200, 1, "Terrain", "Dat")
  
; Ajout des differente textures, construction du terrain et sauvegarde 
; Le premier parametre est le numéro de la couche (0 pour la premiere couche)
; le second parametre correspond à la taille que doit occuper la texture sur le terrain
; Corriger 256 par la taille du terrain défini lors de la création : 3000
; Et regarder la taille des fleurs et feuilles .
; Vous pouvez faire d'autres essais de texture en remplaçant grass1.png par grass2.png
AddTerrainTexture(Terrain,  0, 256, "grass1.png",  "grass1.png") ;
  
;Le relief est défini par une image composée de degradés noir et blanc
;Plus les points sont proche du blanc, plus nous montons en hauteur
;Vous pouvez faire d'autres essais de relief avec le fichier heightmap513.png par exemple
DefineTerrainTile(Terrain, 0, 0,  "heightmap514.jpg", 0, 0)
  
;Construction du terrain (ça peut prendre du temps)
BuildTerrain(Terrain) 
  
;Sauvegarde du terrain (#False = Non mais en fait ça fonctionne quand meme) 
SaveTerrain(Terrain, #False)
  
Repeat
   
  If ExamineMouse()
    CamY = -MouseDeltaX()/10 
    CamX = -MouseDeltaY()/10  
 
  EndIf
   
  RotateCamera(Camera, CamX, CamY, 0, #PB_Relative)
   
  If ExamineKeyboard()  	  
    If KeyboardPushed(#PB_Key_Escape)
      End
    EndIf  
  EndIf
   
  RenderWorld()
  FlipBuffers()

ForEver
Attention si vous changez les paramètres de construction du terrain ou bien les textures, vous devez supprimer le fichier Terrain_00000000.Dat du dossier Terrain.
Dernière modification par falsam le jeu. 27/mars/2014 9:14, 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 - Les nodes

Message par falsam »

Les nodes (noeuds) sont des conteneurs qui peuvent être utilisés pour grouper des objets comme par exemple des entités.
Une fois qu'une entité est attaché à un node, sa position et ses mouvements sont relatifs à la position du node.

L'objectif est de :
-Créer un node sur lequel on attachera 5 cubes : 1 Cube central et les autres sur chaque points cardinaux.
-Exercer une rotation du node sur l'axe Y, chaque cube étant eux aussi en rotation.
-Déplacer le node avec les fléches de direction du clavier.

Code : Tout sélectionner

;Histoire d'un cube : Les nodes

Define.f X,Z

InitEngine3D()
InitKeyboard()
InitSprite()

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

; Mesh
Cube_Mesh = CreateCube(#PB_Any, 1) 
Ground_Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)

; Materiel
Texture1 = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture1))
Box(0,0,512,512,RGB(0, 0, 0))
Box(1,1,510,510,RGB(255, 216, 0))
StopDrawing()
Material1 = CreateMaterial(#PB_Any,TextureID(texture1))

; Création du sol 
Ground_Entity = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material1), 0, 0, 0)
CreateEntityBody(Ground_Entity, #PB_Entity_StaticBody, 2, 0, 1)

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

;
; Création d'un node sur lequel seront attaché les entités.
; Le cube 0 sera au meme emplacement que le node.
Node = CreateNode(#PB_Any, 0, 0, 0) 

Cube0 = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material1), 0, 2, 0)
AttachNodeObject(Node, EntityID(Cube0))

Cube1 = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material1), 2, 2, 0)
AttachNodeObject(Node, EntityID(Cube1))

Cube2 = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material1), -2, 2, 0)
AttachNodeObject(Node, EntityID(Cube2))

Cube3 = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material1), 0, 2, 2)
AttachNodeObject(Node, EntityID(Cube3))

Cube4 = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material1), 0, 2, -2)
AttachNodeObject(Node, EntityID(Cube4))


;
; Une camera 
Camera = CreateCamera(#PB_Any,0,0,100,100)

While #True
  
  Event = WindowEvent()
    
  If ExamineKeyboard()    
    If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
      Break
    EndIf      
    
    If KeyboardPushed(#PB_Key_Left)
      X-0.1
    ElseIf KeyboardPushed(#PB_Key_Right)
      X+0.1
    EndIf
    
    If KeyboardPushed(#PB_Key_Up)
      Z-0.1
    ElseIf KeyboardPushed(#PB_Key_Down)
      Z+0.1
    EndIf
      
  EndIf
  
  ; Rotation du node et non plus de l'entité
  RotateNode(Node, 0, 1, 0, #PB_Relative)  
    
  ; Rotation de chacun des cubes
  ; Les deux premiers cubes étaient placés sur l'axe X
  ; Les deux suivant sur l'axe Z
  RotateEntity(cube1, -0.5, 0, 0, #PB_Relative)
  RotateEntity(cube2, 0.5, 0, 0, #PB_Relative)
  
  RotateEntity(cube3, 0, 0, -0.5, #PB_Relative)
  RotateEntity(cube4, 0, 0, 0.5, #PB_Relative)
  
  MoveCamera(Camera, 4, 4 , 15, #PB_Absolute)
  CameraLookAt(camera,0,0,0)
  
  MoveNode(Node, x, 0, z, #PB_Absolute)
    
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend
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 :

Re: Histoire d'un Cube : Texte 3D

Message par falsam »

Avec ce nouvel épisode de la vie de notre cube, nous allons voir comment créer un texte qui sera attaché à une entité.

La bibliothèque Text3D est destinée à faciliter l'affichage du texte dans le monde de la 3D.

Attention : La création d'un texte 3D ne fonctionne pas si vous n'indiquez pas le chemin d'installation de polices de caractères qui seront utilisés lors de la création du texte.

Vous devez copier le dossier fonts se trouvant dans les exemples 3D dans un dossier que vous nommerez par exemple Data qui se trouvera dans le dossier ou se trouve votre code devant afficher votre texte 3D.

Ajoutez

Code : Tout sélectionner

Add3DArchive("Data/fonts", #PB_3DArchive_FileSystem)
dans votre code.

Un exemple de code. Notre cube vous donnera l'heure. Utilisez les flèches de direction du clavier pour diriger le cube.

Code : Tout sélectionner

;Histoire d'un cube : Texte 3D

Define.f X,Z

InitEngine3D()
InitKeyboard()
InitSprite()

Add3DArchive("Data/fonts", #PB_3DArchive_FileSystem)
Parse3DScripts()

window = OpenWindow(#PB_Any,0,0,1024,768,"Texte 3D")
OpenWindowedScreen(WindowID(window),0,0,1024,768)

; Mesh
Cube_Mesh = CreateCube(#PB_Any, 1) 
Ground_Mesh = CreatePlane(#PB_Any, 20, 20, 3, 6, 6, 6)

; Materiel
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))

; Création du sol 
Ground = CreateEntity(#PB_Any, MeshID(Ground_Mesh), MaterialID(Material), 0, 0, 0)
EntityPhysicBody(Ground, #PB_Entity_StaticBody, 2, 0, 1)

;
; Un cube
Cube = CreateEntity(#PB_Any, MeshID(Cube_Mesh), MaterialID(Material), 0, 2, 0)

Text = CreateText3D(#PB_Any, "")
Text3DColor(Text, RGBA(255, 0, 0, 255))
ScaleText3D(Text, 0.4,0.4,0.4,#PB_Absolute)
Text3DAlignment(Text, #PB_Text3D_HorizontallyCentered)

AttachEntityObject(Cube, "", Text3DID(Text))
MoveText3D(Text, 0.2, 1, 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 camera 
Camera = CreateCamera(#PB_Any,0,0,100,100)

While #True
  
  Event = WindowEvent()
    
  If ExamineKeyboard()    
    If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
      Break
    EndIf  
    
    If KeyboardPushed(#PB_Key_Left)
      X-0.1
    ElseIf KeyboardPushed(#PB_Key_Right)
      X+0.1
    EndIf
    
    If KeyboardPushed(#PB_Key_Up)
      Z-0.1
    ElseIf KeyboardPushed(#PB_Key_Down)
      Z+0.1
    EndIf
    
  EndIf
  
  MoveEntity(Cube, X, 2, Z, #PB_Absolute)
  
  Text3DCaption(Text, FormatDate("%hh:%ii:%ss", Date()))
  
  MoveCamera(Camera, 4, 4 , 15, #PB_Absolute)
  
  CameraLookAt(camera,0,0,0)
  
  ; Affiche le rendu de la scène
  ClearScreen(RGB(0, 0, 0))
  RenderWorld()
  FlipBuffers()
Wend
Dernière modification par falsam le mar. 22/oct./2013 14:58, 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%
Répondre