La 3D pour les nuls

Généralités sur la programmation 3D
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

La 3D pour les nuls

Message par SPH »

Salut,

tout d'abords, apparement, les exemples 3D fournis dans PB6.0 LTS fonctionnent. Je dis cela car j'ai entendu que certains (falsam ?) avaient eu un résultat inverse.
Je fais ce post qui amènera à la création d'un Tetris 3D.

Pour commencer, est-ce que l'un d'entre vous pourrait me dire si ce code est la base de la 3D ? :

Code : Tout sélectionner

ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "3D de base")

Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)

Repeat
  ExamineKeyboard()
  ExamineMouse()
  
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)
Quel est la plus simple instruction pour afficher un carré 3D ?

Merci 😎

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

Re: La 3D pour les nuls

Message par falsam »

La base pour du full screen est presque bonne.

:arrow: Manque l'instruction RenderWorld() pour créer le rendu de la scène 3D avant l'instruction FlipBuffers() qui va effacer le rendu actuel et faire apparaitre le nouveau rendu.

:?: N'oublie pas de mettre EnableExplicit() au début de ton code afin d'éliminer tout risque de variables non déclarées.
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: La 3D pour les nuls

Message par case »

falsam a écrit : mar. 07/mars/2023 22:52 . N'oublie pas de mettre EnableExplicit() au début de ton code afin d'éliminer tout risque de variables non déclarées.
et perdre ainsi toute la joie du débogage ? :)
ImageImage
Avatar de l’utilisateur
falsam
Messages : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: La 3D pour les nuls

Message par falsam »

SPH a écrit : mar. 07/mars/2023 14:15 Quel est la plus simple instruction pour afficher un carré 3D ?
Sérieusement ! Un carré 3D ? :mrgreen:

Bon ok. Le code pour un carré.

Code : Tout sélectionner

EnableExplicit

Define camera, light, mesh, entity

ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "3D de base")

; Camera
camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(camera, 0, 0, -6) 
CameraLookAt(camera, 0, 0, 0)

; Si pas de ciel, couleur de fond
CameraBackColor(camera, RGB(211, 211, 211))

; Lumiere
light = CreateLight(#PB_Any, RGB(211, 211, 211), -100, 100, 0)
AmbientColor(RGB(154, 205, 50))

; Un carré le plus simplement possible
mesh = CreatePlane(#PB_Any, 2, 2, 1, 1, 1, 1)
entity = CreateEntity(#PB_Any, MeshID(mesh), #PB_Material_None)
RotateEntity(entity, -90, 0, 0)

; Boucle 3D
Repeat
  ExamineKeyboard()
  ExamineMouse()
  
  RenderWorld() 
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)
Configuration : Windows 11 Famille 64-bit - PB 6.20 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 : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: La 3D pour les nuls

Message par falsam »

la procédure CreateSquare(Mesh, Size.f) va te permettre de créer un carré plus simplement

Exemple pour un carré de 1 unité de cotés

Code : Tout sélectionner

mesh = CreateSquare(#PB_Any, 1)
entity = CreateEntity(#PB_Any, MeshID(mesh), #PB_Material_None)
Code complet incluant la procédure CreateSquare()

Code : Tout sélectionner

EnableExplicit

Define camera, light, mesh, entity

Declare CreateSquare(Mesh, Size.f)

ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "3D de base")

; Camera
camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(camera, 0, 0, 10) 
CameraLookAt(camera, 0, 0, 0)

; Si pas de ciel, couleur de fond
CameraBackColor(camera, RGB(184, 134, 11))

; Lumiere
light = CreateLight(#PB_Any, RGB(211, 211, 211), -100, 100, 0)
AmbientColor(RGB(211, 211, 211))

; Un carré le plus simplement possible
mesh = CreateSquare(#PB_Any, 1)
entity = CreateEntity(#PB_Any, MeshID(mesh), #PB_Material_None)

; Boucle 3D
Repeat
  ExamineKeyboard()
  ExamineMouse()
    
  RenderWorld() 
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)

Procedure CreateSquare(Mesh, Size.f)
  Size/2
  
  If mesh = #PB_Any 
    Mesh = CreateMesh(#PB_Any, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)
  Else
    CreateMesh(Mesh, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)
  EndIf
  
  MeshVertexPosition(-Size, -Size, 0)
  MeshVertexNormal(0, 0, 1)
  MeshVertexTextureCoordinate(0, 1)
  
  MeshVertexPosition(Size, -Size, 0)
  MeshVertexNormal(0, 0, 1)
  MeshVertexTextureCoordinate(1, 1)
  
  MeshVertexPosition(Size, Size, 0)
  MeshVertexNormal(0, 0, 1)
  MeshVertexTextureCoordinate(1, 0)
  
  MeshVertexPosition(-Size, Size, 0)
  MeshVertexNormal(0, 0, 1)
  MeshVertexTextureCoordinate(0, 0)
  
  MeshFace(0, 1, 2)
  MeshFace(2, 3, 0)
  
  FinishMesh(#True)
  
  UpdateMeshBoundingBox(Mesh)   
  BuildMeshShadowVolume(Mesh)

  ProcedureReturn Mesh
EndProcedure

Configuration : Windows 11 Famille 64-bit - PB 6.20 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 : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: La 3D pour les nuls

Message par falsam »

Mise à jour de la procédure CreateSquare(Mesh, Size.f)

Une petite erreur de profondeur (axe z)

Je te présente le code précédent avec application d'une texture sur le carré.

Code : Tout sélectionner

EnableExplicit

Define camera, light, mesh, material, entity

Declare CreateSquare(Mesh, Size.f)

ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "3D de base")
Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

; Camera
camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(camera, 0, 0, 10) 
CameraLookAt(camera, 0, 0, 0)

; Si pas de ciel, couleur de fond
CameraBackColor(camera, RGB(184, 134, 11))

; Lumiere
light = CreateLight(#PB_Any, RGB(255, 255, 255), -100, 100, 0)


; Un carré le plus simplement possible
mesh = CreateSquare(#PB_Any, 1)
material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))
MaterialCullingMode(material, #PB_Material_NoCulling)
entity = CreateEntity(#PB_Any, MeshID(mesh), MaterialID(material))

; Boucle 3D
Repeat
  ExamineKeyboard()
  ExamineMouse()
  
  RotateEntity(entity, 0, 0.5, 0, #PB_Relative)
    
  RenderWorld() 
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)

Procedure CreateSquare(Mesh, Size.f)
  Size/2
  
  If mesh = #PB_Any 
    Mesh = CreateMesh(#PB_Any, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)
  Else
    CreateMesh(Mesh, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)
  EndIf
  
  MeshVertexPosition(-Size, -Size, 0)
  MeshVertexNormal(0, 0, 1)
  MeshVertexTextureCoordinate(0, 1)
  
  MeshVertexPosition(Size, -Size, 0)
  MeshVertexNormal(0, 0, 1)
  MeshVertexTextureCoordinate(1, 1)
  
  MeshVertexPosition(Size, Size, 0)
  MeshVertexNormal(0, 0, 1)
  MeshVertexTextureCoordinate(1, 0)
  
  MeshVertexPosition(-Size, Size, 0)
  MeshVertexNormal(0, 0, 1)
  MeshVertexTextureCoordinate(0, 0)
  
  MeshFace(0, 1, 2)
  MeshFace(2, 3, 0)
  
  FinishMesh(#True)
  
  UpdateMeshBoundingBox(Mesh)   
  BuildMeshShadowVolume(Mesh)

  ProcedureReturn Mesh
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.20 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 : 4944
Inscription : mer. 09/nov./2005 9:53

Re: La 3D pour les nuls

Message par SPH »

Ok merci, on fera avec 😁

!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.12LTS- 64 bits
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Re: La 3D pour les nuls

Message par SPH »

Ok, je me suis penché sur le code.
Question : je suppose qu'il n'y a qu'une camera et une light !?

J'ai voulu rajouter un carré mais je dois m'y prendre mal. Enfin, presque puisqu'il apparait. il a une autre texture et ne tourne pas (c'est volontaire). Mais j'aurais voulu le placer autre part. Quelle est l'instruction pour cela ?

Egalement : la caisse qui tourne produit une affreuse texture quand elle est presque sur la tranche. Mais ça, ça doit venir de la texture qui n'est que de 64*64.

Code : Tout sélectionner

EnableExplicit

Define camera, light, mesh, material, entity
Define camera2, light2, mesh2, material2, entity2

Declare CreateSquare(Mesh, Size.f)

ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "3D de base")
Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

; Camera
camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(camera, 0, 0, 10) 
CameraLookAt(camera, 0, 0, 0)

; Si pas de ciel, couleur de fond
CameraBackColor(camera, RGB(184, 134, 11))

; Lumiere
light = CreateLight(#PB_Any, RGB(255, 255, 255), -100, 100, 0)


; Un carré le plus simplement possible
mesh = CreateSquare(#PB_Any, 1)
material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))
MaterialCullingMode(material, #PB_Material_NoCulling)
entity = CreateEntity(#PB_Any, MeshID(mesh), MaterialID(material))

; Un carré le plus simplement possible
mesh2 = CreateSquare(#PB_Any, 1)
material2 = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "Dirt.jpg")))
MaterialCullingMode(material2, #PB_Material_NoCulling)
entity2 = CreateEntity(#PB_Any, MeshID(mesh2), MaterialID(material2))


; Boucle 3D
Repeat
  ExamineKeyboard()
  ExamineMouse()
  
  RotateEntity(entity, 0, 0.5, 0, #PB_Relative)
    
  RenderWorld() 
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)

Procedure CreateSquare(Mesh, Size.f)
  Size/2
  
  If mesh = #PB_Any 
    Mesh = CreateMesh(#PB_Any, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)
  Else
    CreateMesh(Mesh, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)
  EndIf
  
  MeshVertexPosition(-Size, -Size, 0)
  MeshVertexNormal(0, 0, 1)
  MeshVertexTextureCoordinate(0, 1)
  
  MeshVertexPosition(Size, -Size, 0)
  MeshVertexNormal(0, 0, 1)
  MeshVertexTextureCoordinate(1, 1)
  
  MeshVertexPosition(Size, Size, 0)
  MeshVertexNormal(0, 0, 1)
  MeshVertexTextureCoordinate(1, 0)
  
  MeshVertexPosition(-Size, Size, 0)
  MeshVertexNormal(0, 0, 1)
  MeshVertexTextureCoordinate(0, 0)
  
  MeshFace(0, 1, 2)
  MeshFace(2, 3, 0)
  
  FinishMesh(#True)
  
  UpdateMeshBoundingBox(Mesh)   
  BuildMeshShadowVolume(Mesh)

  ProcedureReturn Mesh
EndProcedure

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

Re: La 3D pour les nuls

Message par falsam »

SPH a écrit : mer. 08/mars/2023 16:19 la caisse qui tourne produit une affreuse texture quand elle est presque sur la tranche. Mais ça, ça doit venir de la texture qui n'est que de 64*64.
Rien à voir avec la texture. C'est un carré, donc pas de texture possible sur la tranche.

Dans ce cas il faut mettre un cube que tu redimensionnes si tu veux une texture sur la tranche.
SPH a écrit : mer. 08/mars/2023 16:19 j'aurais voulu le placer autre part. Quelle est l'instruction pour cela ?
MoveEntity() pour déplacer une entité.
:arrow: https://www.purebasic.com/french/docume ... ntity.html

Ton nouveau code

Code : Tout sélectionner

EnableExplicit

Define camera, light, mesh, material, entity
Define camera2, light2, mesh2, material2, entity2

Declare CreateSquare(Mesh, Size.f)

ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "3D de base")
Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

; Camera
camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(camera, 0, 0, 10) 
CameraLookAt(camera, 0, 0, 0)

; Si pas de ciel, couleur de fond
CameraBackColor(camera, RGB(184, 134, 11))

; Lumiere
light = CreateLight(#PB_Any, RGB(255, 255, 255), -100, 100, 0)


; Création du premier cube
mesh = CreateCube(#PB_Any, 1)
material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))
entity = CreateEntity(#PB_Any, MeshID(mesh), MaterialID(material))

; On redimentionne le cube.
ScaleEntity(entity, 1, 1, 0.25)

; Mise en place du second cube
;mesh2 = CreateSquare(#PB_Any, 1) ; Inutile tu peux te servir du premier mesh
material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "Dirt.jpg")))
entity2 = CreateEntity(#PB_Any, MeshID(mesh), MaterialID(material))
ScaleEntity(entity2, 1, 1, 0.5)

; Positionnement de l'entité à droite de la précédente
MoveEntity(entity2, 2, 0, 0)

; Boucle 3D
Repeat
  ExamineKeyboard()
  ExamineMouse()
  
  RotateEntity(entity, 0, 0.5, 0, #PB_Relative)
    
  RenderWorld() 
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)
Configuration : Windows 11 Famille 64-bit - PB 6.20 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 : 7323
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: La 3D pour les nuls

Message par falsam »

Information complémentaire en image sur la représentation 3D d'OGRE3D.

Image
Configuration : Windows 11 Famille 64-bit - PB 6.20 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 : 4944
Inscription : mer. 09/nov./2005 9:53

Re: La 3D pour les nuls

Message par SPH »

Je sais qu'il n'y a pas d'épaisseur sur le carré. J'appelle "tranche" le carré PRESQUE tourné à 90°
Tu verras, l'image de la caisse se dégrade (un peu comme le code que tu as posté sur le flou du sol de ton ogre qui marche) :?

!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.12LTS- 64 bits
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Re: La 3D pour les nuls

Message par SPH »

Ton dernier code est parfait ! Je pourrais faire des pièces de Tetris en 3D

Merci :wink:

!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.12LTS- 64 bits
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Re: La 3D pour les nuls

Message par SPH »

Salut à tous.

Bon, comme j'ai fini mon jeu, je me met (sérieusement) à la 3D.

Voici un code créant une "scène" (des pièces de Tetris).
J'ai aussi fait mumuse avec la caméra.

Au prochain code, si j'y arrive, je ferais tourner la pièce Tetris sur son axe haut/bas.

est-ce que c'est pas mal ou bien je fais fausse route ? :?: :o

Code : Tout sélectionner

EnableExplicit

Define Dim camera(100),Dim light(100),Dim mesh(100),Dim material(100),Dim entity(100)
; Define camera, light, mesh, material, entity
; Define camera2, light2, mesh2, material2, entity2
Define xx.f, yy.f, zz.f, xx2.f, yy2.f, zz2.f
; Define Dim create.l(100)
Define i.l,x.l,y.l
Define b.b
Declare CreateSquare(Mesh, Size.f)

ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "3D de base")
Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

; Camera
camera(0) = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(camera(0), 0, 0, 20) 
CameraLookAt(camera(0), 0, 0, 0)

; Si pas de ciel, couleur de fond
CameraBackColor(camera(0), RGB(184, 134, 11))

; Lumiere
light(0) = CreateLight(#PB_Any, RGB(255, 255, 255), -100, 100, 0)


; Création du premier cube

For i=0 To 6
  For y=0 To 3
      For x=0 To 3
    Read.b b
    If b=1
    mesh(i) = CreateCube(#PB_Any, 1)
      material(i) = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))
      entity(i) = CreateEntity(#PB_Any, MeshID(mesh(i)), MaterialID(material(i)))
      ; On redimentionne le cube.
      ScaleEntity(entity(i), 1, 1, 0.1)
      MoveEntity(entity(i), x+(i-3)*4.5, y, 0)
    EndIf
    
    Next
  Next
Next

; Mise en place du second cube
;mesh2 = CreateSquare(#PB_Any, 1) ; Inutile tu peux te servir du premier mesh
;material = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "Dirt.jpg")))
; entity2 = CreateEntity(#PB_Any, MeshID(mesh), MaterialID(material))
; ScaleEntity(entity2, 1, 1, 0.1)
; 
; ; Positionnement de l'entité à droite de la précédente
; MoveEntity(entity2, 1, 0, 0)

; Boucle 3D

Repeat
  ExamineKeyboard()
  ExamineMouse()
   xx=Sin(xx2)*8
   xx2+0.007
   yy=Cos(yy2)*9
   yy2+0.0128
   zz=Cos(zz2)*10
   zz2+0.022
  
  ;RotateEntity(entity, xx, yy, 0, #PB_Relative)
  RotateCamera(camera(0),xx,yy,zz,#PB_Absolute)
  
  RenderWorld() 
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)

DataSection
  Data.b 0,0,0,0
  Data.b 0,1,1,0
  Data.b 0,1,1,0
  Data.b 0,0,0,0
  ;;;
  Data.b 0,0,0,0
  Data.b 0,0,0,0
  Data.b 1,1,1,1
  Data.b 0,0,0,0
  ;;;
  Data.b 0,0,0,0
  Data.b 0,0,1,0
  Data.b 1,1,1,0
  Data.b 0,0,0,0
  ;;;
  Data.b 0,0,0,0
  Data.b 1,0,0,0
  Data.b 1,1,1,0
  Data.b 0,0,0,0
  ;;;
  Data.b 0,0,0,0
  Data.b 0,1,0,0
  Data.b 1,1,1,0
  Data.b 0,0,0,0
  ;;;
  Data.b 0,0,0,0
  Data.b 1,1,0,0
  Data.b 0,1,1,0
  Data.b 0,0,0,0
  ;;;
  Data.b 0,0,0,0
  Data.b 0,1,1,0
  Data.b 1,1,0,0
  Data.b 0,0,0,0
  ;;;
EndDataSection


!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.12LTS- 64 bits
Avatar de l’utilisateur
SPH
Messages : 4944
Inscription : mer. 09/nov./2005 9:53

Re: La 3D pour les nuls

Message par SPH »

Salut,

je code mais je ne raisonne pas en 3D. par exemple, je me réfère a un tableau pour afficher des pièces déjà pausées.
Pourriez-vous m'indiquer quelle instruction permet de "lier" 4 carrés pour former une pièce de Tétris, une instruction pour la gravité et une instruction pour killer une caisse ?
Merci

Code : Tout sélectionner

EnableExplicit

Define Dim camera(2000),Dim light(2000),Dim mesh(2000),Dim material(2000),Dim entity(2000)
; Define camera, light, mesh, material, entity
; Define camera2, light2, mesh2, material2, entity2
Define xx.f, yy.f, zz.f, xx2.f, yy2.f, zz2.f
; Define Dim create.l(100)
Define i.l,u.l,n.l,x.l,y.l,taille_x,taille_y,piece
Define b.b
Declare CreateSquare(Mesh, Size.f)

ExamineDesktops()
InitEngine3D(#PB_Engine3D_DebugLog) : InitSprite() : InitKeyboard() : InitMouse()
OpenScreen(DesktopWidth(0), DesktopHeight(0), 32, "3D de base")
Add3DArchive(#PB_Compiler_Home + "examples\3D\Data\Textures", #PB_3DArchive_FileSystem)

; Camera
camera(0) = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(camera(0), 8, 6, 30) 
CameraLookAt(camera(0), 0, 0, 0)
RotateCamera(camera(0), 0 ,0 ,180)
; Si pas de ciel, couleur de fond
CameraBackColor(camera(0), RGB(184, 134, 11))

; Lumiere
light(0) = CreateLight(#PB_Any, RGB(255, 255, 255), -100, 100, 0)


; Création du premier cube
taille_x=16
taille_y=12


Dim tableau.b(taille_x,taille_y)

i=0
For y=0 To taille_y
  For x=0 To taille_x
    If y>taille_y/2; Or y=0
      If Random(1)=0
        tableau(x,y)=1
        mesh(i) = CreateCube(#PB_Any, 1)
        material(i) = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))
        entity(i) = CreateEntity(#PB_Any, MeshID(mesh(i)), MaterialID(material(i)))
        ; On redimentionne le cube.
        ScaleEntity(entity(i), 1, 1, 0.1)
        MoveEntity(entity(i), x, y, 0)
        i+1    
      EndIf
    EndIf
  Next
Next


Dim piece.b(27,3,3) ; toutes les pieces de tetris dans ce dim piece()
For n=0 To 6
  For y=0 To 3
    For x=0 To 3
      Read.b piece(n,x,y)
      piece(n+7,3-y,x)=piece(n,x,y)
      piece(n+14,3-x,3-y)=piece(n,x,y)
      piece(n+21,y,3-x)=piece(n,x,y)
    Next
  Next
Next







;Goto ok
u=24
i=0
For piece=1 To 27 Step 3
  ;piece=2+7+7+7
  For y=0 To 3
    For x=0 To 3
      If piece(piece,x,y)=1
        mesh(i+900) = CreateCube(#PB_Any, 1)
        material(i+900) = CreateMaterial(#PB_Any, TextureID(LoadTexture(#PB_Any, "caisse.png")))
        entity(i+900) = CreateEntity(#PB_Any, MeshID(mesh(i+900)), MaterialID(material(i+900)))
        ; On redimentionne le cube.
        ScaleEntity(entity(i+900), 1, 1, 0.1)
        MoveEntity(entity(i+900), x+u, y, 0)
      EndIf
      i+1
    Next
  Next
  u-4
Next
; 
ok:

; Boucle 3D
xx=0.125

Repeat
  ExamineKeyboard()
  ExamineMouse()
  
  If KeyboardPushed(#PB_Key_Up)   ; Appuyez sur la touche [Echap] pour quitter
  EndIf
  
  If KeyboardPushed(#PB_Key_Down)   ; Appuyez sur la touche [Echap] pour quitter
  EndIf
  
  For y=0 To taille_y
    i=0
    For x=0 To taille_x
      i+tableau(x,y)
    Next
    If i=taille_x
      ; supprimer cette ligne remplie
      Beep_(500,100)
      For u=y To 1 Step -1
        For i=0 To taille_x
          tableau(i,u-i)=tableau(i,u)
        Next
      Next
      
    EndIf
  Next
  
  
  ;MoveEntity(entity(1), xx, 0, 0)
  RenderWorld() 
  FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(#PB_MouseButton_Middle)
End

;{

DataSection
  Data.b 0,0,0,0
  Data.b 0,1,1,0
  Data.b 0,1,1,0
  Data.b 0,0,0,0
  ;;;
  Data.b 0,0,0,0
  Data.b 0,0,0,0
  Data.b 1,1,1,1
  Data.b 0,0,0,0
  ;;;
  Data.b 0,0,0,0
  Data.b 0,0,1,0
  Data.b 1,1,1,0
  Data.b 0,0,0,0
  ;;;
  Data.b 0,0,0,0
  Data.b 1,0,0,0
  Data.b 1,1,1,0
  Data.b 0,0,0,0
  ;;;
  Data.b 0,0,0,0
  Data.b 0,1,0,0
  Data.b 1,1,1,0
  Data.b 0,0,0,0
  ;;;
  Data.b 0,0,0,0
  Data.b 1,1,0,0
  Data.b 0,1,1,0
  Data.b 0,0,0,0
  ;;;
  Data.b 0,0,0,0
  Data.b 0,1,1,0
  Data.b 1,1,0,0
  Data.b 0,0,0,0
  ;;;
EndDataSection
;}

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

Re: La 3D pour les nuls

Message par falsam »

SPH a écrit : mer. 29/mars/2023 21:24 une instruction pour la gravité
Tu dois ajouter un corps à ton entité.
:arrow: CreateEntityBody()
Exemple avec ton entité 1 dans ton tableau

Code : Tout sélectionner

If KeyboardReleased(#PB_Key_G) And IsEntity(Entity(1)) 
    CreateEntityBody(Entity(1), #PB_Entity_BoxBody, 0.5, 0, 0) 
EndIf
SPH a écrit : mer. 29/mars/2023 21:24 une instruction pour killer une caisse
Utiliser la fonction FreeEntity()
Exemple avec ton entité 4

Code : Tout sélectionner

If KeyboardReleased(#PB_Key_K) And IsEntity(Entity(4))
    FreeEntity(Entity(4)) 
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre