5000 Cubes

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 :

5000 Cubes

Message par falsam »

5000 Cubes texturés. Sur un pauvre i3 entrée de gamme, j'ai un affichage immédiat.

Code : Tout sélectionner

EnableExplicit

;Scene
Global Camera, Light

; Returns a random sign {-1, 1}
Macro RandomSign()
  ( Random(1)*2-1 ) 
EndMacro

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

GameLoad()

Procedure GameLoad()
  Protected Window, n 
    
  If InitEngine3D() And  InitKeyboard() And InitSprite() And InitMouse() And InitSound()
    Window = OpenWindow(#PB_Any, 0, 0, 0, 0, "", #PB_Window_Maximize | #PB_Window_BorderLess)
    SetWindowColor(Window, 0)
    
    ;-[Screen]
    OpenWindowedScreen(WindowID(Window),0, 0, WindowWidth(Window) , WindowHeight(Window))    
    KeyboardMode(#PB_Keyboard_International)  

    ;-[2D]
    
    ;-[3D]
    Add3DArchive(#PB_Compiler_Home + "Examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
        
    ;-Camera
    Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
    CameraBackColor(Camera, RGB(0, 0, 0))
    MoveCamera(Camera, 0, 0, -100)
    CameraLookAt(Camera, 0, 0, 0)
    
    ;-Light
    Light = CreateLight(#PB_Any, RGB(255, 255, 255), 0, 1000, 0, #PB_Light_Point)
    SetLightColor(Light, #PB_Light_SpecularColor, RGB(255, 255, 255))
    SetLightColor(Light, #PB_Light_DiffuseColor, RGB(255, 255, 255))
        
    ;Création de 5000 cubes
    CreateMaterial(0, TextureID(LoadTexture(-1, "glass_Dirt.png")))
    MaterialBlendingMode(0, #PB_Material_AlphaBlend)
    SetMaterialColor(0, #PB_Material_SpecularColor, RGB(255,255,255))
    
    CreateEntity(0, MeshID(CreateCube(-1, 8)), MaterialID(0))
    For n = 1 To 5000
       MoveEntity(CopyEntity(0, -1), Random(1000) * RandomSign(), Random(1000) * RandomSign(), Random(1000) * RandomSign()) 
    Next
    
    ;-Loop
    While #True
      Repeat : Until WindowEvent() = 0
      FlipBuffers()  
      RenderGame3D()
      RenderWorld()
      RenderGame2D()
    Wend
  Else
    
  EndIf 
EndProcedure

Procedure RenderGame3D()
  RotateCamera(Camera, 0.1, 0.1, 0.1, #PB_Relative)
  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Escape)
      Exit()
    EndIf  
  EndIf
  
  If ExamineMouse()
    
  EndIf 
EndProcedure

Procedure RenderGame2D()
EndProcedure

Procedure Exit()
  End
EndProcedure
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
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Image to scene 3d - v2

Message par Zorro »

Merci ,je testerai ton code demain
Là je suis avec ma tablette (au pieu lol)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Image to scene 3d - v2

Message par falsam »

Zorro a écrit :Là je suis avec ma tablette (au pieu lol)
On ne veut pas connaitre les détails :mrgreen:
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: Image to scene 3d - v2

Message par Micoute »

Excellent falsam, j'ai été bluffé. Merci pour le partage.
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
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Image to scene 3d - v2

Message par Zorro »

oui effectivement meme avec 50.000 cubes ça passe chez moi ....

je ne comprends pas d'ou viens le ralentissement dans l'autre code du coup ....

de toutes façons, je n'aime pas la 3D avec Purebasic
que ce soit le nom des commandes, la façon dont ça s'emboite....
bref, un je ne sais quoi qui ne me plait pas
trop compliqué tout ça , je dois etre trop vieux pour ses trucs :lol:
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Image to scene 3d - v2

Message par falsam »

Zorro a écrit :oui effectivement meme avec 50.000 cubes ça passe chez moi ....

je ne comprends pas d'ou viens le ralentissement dans l'autre code du coup ....

de toutes façons, je n'aime pas la 3D avec Purebasic
que ce soit le nom des commandes, la façon dont ça s'emboite....
bref, un je ne sais quoi qui ne me plait pas
trop compliqué tout ça , je dois etre trop vieux pour ses trucs :lol:
Houuuuuuuu fais un effort et tu verras qu'on peut s'amuser avec Ogre3D
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
Guillot
Messages : 522
Inscription : jeu. 25/juin/2015 16:18

Re: 5000 Cubes

Message par Guillot »

et dans une staticgeometry tu fais *20

remplacer la boucle ligne 50 par:

Code : Tout sélectionner

    CreateStaticGeometry(0,1000,1000,1000,0)
    For n = 1 To 100000
       AddStaticGeometryEntity(0,EntityID(0), Random(1000) * RandomSign(), Random(1000) * RandomSign(), Random(1000) * RandomSign()) 
    Next
    BuildStaticGeometry(0)
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: 5000 Cubes

Message par Cool Dji »

Vive la StaticGeometry(), chouette exemple Falsam !

Je suis sur un code où j'ai 40.000 spheres (36.000 pour les communes françaises et environ 4.000 pour les communes suisses) et ça passe bien. Par contre, quand je rajoute les 260.000 CreateLine3D() correspondant aux déplacements domicile-travail entre les communes, ça commence à ralentir un peu car je ne peux pas les passer en staticgeometry()...
Je pensais que le code dessous passait les Entity en Static mais si ensuite j'essaie de libérer les Entity, le compilateur m'indique que les Entity crées avec le mesch issu de Createline n'existent pas !

Code : Tout sélectionner

 ;CreateStaticGeometry(2,10000,10000,10000,#False)
  
For j=1 To 1000
   CreateLine3D(1000+j, 0, 0, 0, RGB(255, 255, 255), Random(10000)-5000, Random(10000)-5000, Random(10000)-5000, RGB(255, 255, 255))
   CreateEntity(1000+j, MeshID(1000+j), #PB_Material_None)
   AddStaticGeometryEntity(2,EntityID(1000+j),0,0,0)
Next

;BuildStaticGeometry(2)

 For j=1 To 1000
   FreeEntity(1000+j)  
 Next

Je vais repasser en 2D mais la gestion du déplacement et du zoom sur la carte était pratique avec la 3D...
Only PureBasic makes it possible
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: 5000 Cubes

Message par comtois »

Cool Dji a écrit :quand je rajoute les 260.000 CreateLine3D() correspondant aux déplacements domicile-travail entre les communes, ça commence à ralentir un peu
Tu peux faire tes lignes dans un seul mesh (ou une poignée, je ne sais plus la capacité maxi) en utilisant :
CreateMesh(#PB_Any, #PB_Mesh_LineList, #PB_Mesh_Static)

Code : Tout sélectionner

#CameraSpeed = 1
#scale = 3

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

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/fonts", #PB_3DArchive_FileSystem)
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    ;- Material
    CreateMaterial(0, LoadTexture(0, "White.jpg"))
    DisableMaterialLighting(0, #True)
    
    ;- Mesh Grid
    CreateMesh(3, #PB_Mesh_LineList, #PB_Mesh_Static)
    For i=0 To 1000
      MeshVertexPosition(Random(2000)-1000, 0, Random(2000)-1000) 
      MeshVertexColor(RGB(Random(255),Random(255),Random(255)))
      MeshVertexPosition(Random(2000)-1000, 0,Random(2000)-1000) 
      MeshVertexColor(RGB(Random(255),Random(255),Random(255)))
    Next
 
    FinishMesh(#False)
    
    SetMeshMaterial(3, MaterialID(0))
    Grid = CreateNode(#PB_Any, 0, 0, 0)
    AttachNodeObject(Grid, MeshID(3))
    
    
    
    ;-Camera
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 40, 10, #PB_Absolute)
    CameraFOV(0, 40)
    CameraLookAt(0, NodeX(Grid),  NodeY(Grid),  NodeZ(Grid))
    CameraBackColor(0, RGB(0, 0, 40))
    
    ;-Light
    CreateLight(0, RGB(255,255,255), -10, 60, 10)
    AmbientColor(RGB(90, 90, 90))
    
    Repeat
      Screen3DEvents()
      
      ExamineKeyboard()
      
      RotateNode(Grid, 0.3, 0.3, 0.3, #PB_Relative) 

      RenderWorld()
      
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End
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.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: 5000 Cubes

Message par Cool Dji »

Ok, merci Comtois, je teste ce soir :D

Je n'ai pas été limité en nombre de mesch mais effectivement mettre plusieurs lignes (ou toutes) dans le même ça peut simplifier.

Falsam, c'est la dernière fois que je parasite ton topic :mrgreen:
Only PureBasic makes it possible
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: 5000 Cubes

Message par falsam »

Cool Dji a écrit :Falsam, c'est la dernière fois que je parasite ton topic
Un parasite ? ou ça ? ^-^

Au contraire c'est instructif.
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
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: 5000 Cubes

Message par Cool Dji »

Oui, la prop de Comtois est instructive.
Merci, c'est impec...ça va me permettre de garder le mode 3D :D
Only PureBasic makes it possible
Avatar de l’utilisateur
threedslider
Messages : 381
Inscription : dim. 01/juil./2018 22:38

Re: 5000 Cubes

Message par threedslider »

trop impressionnant merci pour ton partage :)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: 5000 Cubes

Message par Kwai chang caine »

"J'avions" zappé :oops:
Merci pour le partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre