Cubefield

Généralités sur la programmation 3D
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Cubefield

Message par bombseb »

Bon voilà, pour un début en 3D, c'est plutot sympas :D
je suis partit du programme d'exemple "Physicsmaterial"

une question, que faut t-il comme fichier pour faire tourner l'exe ?
j'ai mis la dll dreamotion3D.dll avec l'exe mais j'ai toujours un message d'erreur...

Code : Tout sélectionner

; Include files 
IncludePath "C:\Program Files\PureBasic\Dreamotion3D\SamplesDM3D\include\"
IncludeFile "dreamotion3d.pbi"


; Globales
Global  Quit.b

#nbCubes = 2000

  Global	*camera.CEntity
  Global	Dim *mesh.CEntity(#nbCubes)
  Global *light.CEntity
  Global *font.CFont
  
  
  Global Dim rx(#nbCubes)
  Global Dim ry(#nbCubes)
  Global Dim rz(#nbCubes)
  
  ;  Init PB modules
  If InitSprite() = 0 Or InitKeyboard() = 0 ;Or InitMouse() = 0 
    End
  EndIf

  ; set graphic window 3D
  DM_Graphics3D(800, 600, 32,  1, 1)
  ; load font
  *font = DM_LoadFont( "Tahoma",9 , 0)
  DM_TextColor(*font, 198,198,198,255)

  ;  Set ambient color
  DM_AmbiantLight(80,80,110)
  ;--------------------------------------------------------------
  ; little light...
  ;--------------------------------------------------------------
  ;*light = DM_CreateLight(3)

  e = 2000
  
  ; create 5 random cubes
  For i=0 To #nbCubes
    *mesh(i) = DM_CreateCube()
    DM_ScaleMesh(*mesh(i), 10,10,10)
    ;DM_PositionEntity(*mesh, 10, 10 ,-8+8*i)
    DM_PositionEntity(*mesh(i), Random (e)-e/2, Random (e)-e/2 ,Random (e*2)-e)
    ;DM_PositionEntity(*mesh, 0,0,0)
    DM_EntityColor(*mesh(i), Random(255),Random(255),Random(255),255)
    
    rx(i) = Random (10) - 5
    ry(i) = Random (10) - 5
    rz(i) = Random (10) - 5
    
  Next
  
  
  ; ---------------------------------------
  ;          create camera
  ; ---------------------------------------
  *camera   = DM_CreateCamera()
;  DM_MoveEntity(*camera, 0,50,-100)
  DM_MoveEntity(*camera, 0,0,0)
  DM_RotateEntity(*camera, 0,0,0)
  DM_CameraClsColor(*camera, 0, 0, 0)
  
  *light.CEntity =  DM_CreateLight(#D3DLIGHT_directional)
  DM_LightColor(*light, 255,0,0, 255)
  DM_LightRange(*light, 1000)
  DM_MoveEntity(*light, 0,0,1000)  
  
  Repeat
  	ExamineKeyboard()
  	;ExamineMouse() 
  	;ShowCursor_(1)
  	
  	; if Escape Key, exit	   	
    If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
  	  Quit=1
    EndIf
    
    DM_TurnEntity(*camera, 0,0,2)
    DM_MoveEntity(*camera, 0,0,40)

    DM_MoveEntity(*light, 0,0,40)
    
    For i=0 To #nbCubes
      DM_TurnEntity(*mesh(i), rx(i), ry(i), rz(i))
      If Abs(DM_EntityZ(*camera, #True) - DM_EntityZ(*mesh(i), #True)) > e
      ;If dist > e
        cameraz = DM_EntityZ(*camera, #False)
        DM_PositionEntity(*mesh(i), Random (e)-e/2, Random (e)-e/2 ,cameraz + e-5)
      EndIf
    Next
    
  
  	; ---------------
  	;      Render pass
  	; ---------------
  	DM_BeginScene()
    DM_RenderWorld()
    
  	; draw text
 	  DM_DrawText(*font, 10, 15, "FPS : "+Str(DM_FPS()))
    DM_EndScene()
  	
Until Quit=1
DM_ClearGraphics()
End
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

Re: Cubefield

Message par minirop »

bombseb a écrit :une question, que faut t-il comme fichier pour faire tourner l'exe ?
normalement juste la DLL d3d.dll
bombseb a écrit :j'ai mis la dll dreamotion3D.dll avec l'exe mais j'ai toujours un message d'erreur...
on peux pas trop aider dans le noir ! (traduction : tu as quoi comme message d'erreur ?)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

sympath tes petits cubes en rotation :D

Alors ? Dreamotion3D, c'est pas le Top pour la 3D en Purebasic ??

je ne comprends pas pourquoi Tmyke et Fred ne s'arrange pas pour en faire Le moteur de PureBasic :D
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Normalement, seule la DLL de DM3D (Dreamotion3D.DLL) suffit.
Ceci dit, sur beaucoups de system, la DLL 'd3dx9_30.dll' n'est pas installé dans
le répertoire system32 de windows, c'est pour cela que lors de l'installation
de Dreamotion3D, elle est placé dans le repetoire 'compilers' de PB.

Si tu veux etre tranquille, tu prend cette DLL et tu l'as place dans le repertoire system32 de windows,
ou a defaut dans cela de ton exe..

je pense que cela devrait régler en partie ton soucis a ce niveau

;)
Force et sagesse...
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

oui effectivement je crois qu'il me manquais la dll de dx :D maintenant ca marche
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

Voici une autre version avec une caméra qui bouge aléatoirement...

Code : Tout sélectionner

; Include files 
IncludePath "C:\Program Files\PureBasic\Dreamotion3D\SamplesDM3D\include\"
IncludeFile "dreamotion3d.pbi"


; Globales
Global  Quit.b

#nbCubes = 2000

  Global	*camera.CEntity
  Global	Dim *mesh.CEntity(#nbCubes)
  Global *light.CEntity
  Global *font.CFont
  
  
  Global Dim rx(#nbCubes)
  Global Dim ry(#nbCubes)
  Global Dim rz(#nbCubes)
  
  ;  Init PB modules
  If InitSprite() = 0 Or InitKeyboard() = 0 ;Or InitMouse() = 0 
    End
  EndIf

  ; set graphic window 3D
  DM_Graphics3D(800, 600, 32,  1, 1)
  ; load font
  *font = DM_LoadFont( "Tahoma",9 , 0)
  DM_TextColor(*font, 198,198,198,255)

  ;  Set ambient color
  DM_AmbiantLight(80,80,110)
  ;--------------------------------------------------------------
  ; little light...
  ;--------------------------------------------------------------
  ;*light = DM_CreateLight(3)

  e = 2000
  
  ; create 5 random cubes
  For i=0 To #nbCubes
    *mesh(i) = DM_CreateCube()
    s = Random (5)+5
    DM_ScaleMesh(*mesh(i), s,s,s)
    DM_PositionEntity(*mesh(i), Random (e)-e/2, Random (e)-e/2 ,Random (e*2)-e)
    DM_EntityColor(*mesh(i), Random(255),Random(255),Random(255),255)
    rx(i) = Random (10) - 5
    ry(i) = Random (10) - 5
    rz(i) = Random (10) - 5
  Next
  
  
  ; ---------------------------------------
  ;          create camera
  ; ---------------------------------------
  *camera   = DM_CreateCamera()
;  DM_MoveEntity(*camera, 0,50,-100)
  DM_MoveEntity(*camera, 0,0,0)
  DM_RotateEntity(*camera, 0,0,0)
  DM_CameraClsColor(*camera, 0, 0, 0)
  
  *light.CEntity =  DM_CreateLight(#D3DLIGHT_directional)
  DM_LightColor(*light, 255,0,0, 255)
  DM_LightRange(*light, 1000)
  DM_MoveEntity(*light, 0,0,1000)  
  
  rotx.f = 0
  roty.f = 0
  
  rotx2.f = 0
  roty2.f = 0
  
  vitesse = 20
  
  Repeat
  	ExamineKeyboard()
  	
  	; if Escape Key, exit	   	
    If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
  	  Quit=1
    EndIf
    
    
    rotx2 = rotx2 * 0.5 + (Random (100) - 50)/1000
    roty2 = roty2 * 0.5 + (Random (100) - 50)/1000

    rotx = rotx * 0.99 + rotx2
    roty = roty * 0.99 + roty2
    
    DM_TurnEntity(*camera, rotx,roty,0)
    DM_MoveEntity(*camera, 0,0,vitesse)
    
    DM_TurnEntity(*light, rotx,roty,rotz)
    DM_MoveEntity(*light, 0,0,vitesse)
    
    For i=0 To #nbCubes
      DM_TurnEntity(*mesh(i), rx(i), ry(i), rz(i))
      dist = DM_EntityDistance (*camera, *mesh(i))
      If dist > e
        DM_EntityParent (*mesh(i), *camera) 
        cameraz = DM_EntityZ(*camera, #False)
        DM_PositionEntity(*mesh(i), Random (e)-e/2, Random (e)-e/2 ,Random (e/2)+e/2)
        DM_EntityParent (*mesh(i), null) 
      EndIf
    Next
    
    ; ---------------
  	;      Render pass
  	; ---------------
  	DM_BeginScene()
    DM_RenderWorld()
    
  	; draw text
 	  DM_DrawText(*font, 10, 15, "FPS : "+Str(DM_FPS()))
 	  DM_DrawText(*font, 10, 30, Str (#nbCubes) + " cubes !")
    DM_EndScene()
  	
Until Quit=1
DM_ClearGraphics()
End
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

En effet, c'est bien cool, si a la place de cube, c'etait des cailloux on se croirait en train
de naviguer dans un champ d'asteroides...

:)
Force et sagesse...
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

oui j'y ai pensé, mais des champs d'asteroides j'en traverse tout les jours
les champs de cubes c'est déja plus rare :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

magnifique !! :D

ça ferai un beaux screensaver ça :D
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

oui c'est ce que je me disait aussi, mais j'ai un peu la flemme d'implementer les fonctions du .scr :oops:
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

C'est trés joli bravo !!

Par contre à la ligne 80 du second code (77 du 1er) à :

Code : Tout sélectionner

If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
Il faut supprimer la partie

Code : Tout sélectionner

Or WindowEvent()=#PB_Event_CloseWindow

Sinon message d'erreur car aucune fenetre n'a été ouverte. :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

regarde pour faire un screensaver simple
tu ajoute les lignes ou j'ai marqué "ajout pour le screensaver"
tu verra que j'ai pas ajouté grand chose :D
a compiller en *.scr et a mettre dans windows/system32/
pour le retrouver dans le menu screensaver de windows :D

ne pas oublier lors de la distribution, de joindre les dll qui vont avec :D
et de changer le chemin d'include au debut du listing (la c'est ma config ):D


; Include files
IncludePath "D:\PureBasic4\Dreamotion3D\SamplesDM3D\include\"
;IncludeFile "D:\PureBasic4\Dreamotion3D\SamplesDM3D\include\d3dx9.pbi"
IncludeFile "D:\PureBasic4\Dreamotion3D\SamplesDM3D\include\dreamotion3d.pbi"



; Globales
Global Quit.b

#nbCubes = 2000

Global *camera.CEntity
Global Dim *mesh.CEntity( #nbCubes )
Global *light.CEntity
Global *font.CFont
 
 
Global Dim rx( #nbCubes )
Global Dim ry( #nbCubes )
Global Dim rz( #nbCubes )
 
   ; Init PB modules
If InitSprite () = 0 Or InitKeyboard () = 0 Or InitMouse () = 0
     End
EndIf

   ; set graphic window 3D
DM_Graphics3D(800, 600, 32, 1, 1)
   ; load font
*font = DM_LoadFont( "Tahoma" ,9 , 0)
DM_TextColor(*font, 198,198,198,255)

   ; Set ambient color
DM_AmbiantLight(80,80,110)
   ;--------------------------------------------------------------
   ; little light...
   ;--------------------------------------------------------------
   ;*light = DM_CreateLight(3)

e = 2000
 
   ; create 5 random cubes
For i=0 To #nbCubes
    *mesh(i) = DM_CreateCube()
    s = Random (5)+5
    DM_ScaleMesh(*mesh(i), s,s,s)
    DM_PositionEntity(*mesh(i), Random (e)-e/2, Random (e)-e/2 , Random (e*2)-e)
    DM_EntityColor(*mesh(i), Random (255), Random (255), Random (255),255)
    rx(i) = Random (10) - 5
    ry(i) = Random (10) - 5
    rz(i) = Random (10) - 5
Next
 
 
   ; ---------------------------------------
   ; create camera
   ; ---------------------------------------
*camera = DM_CreateCamera()
; DM_MoveEntity(*camera, 0,50,-100)
DM_MoveEntity(*camera, 0,0,0)
DM_RotateEntity(*camera, 0,0,0)
DM_CameraClsColor(*camera, 0, 0, 0)
 
*light.CEntity = DM_CreateLight( #D3DLIGHT_directional )
DM_LightColor(*light, 255,0,0, 255)
DM_LightRange(*light, 1000)
DM_MoveEntity(*light, 0,0,1000)
 
rotx.f = 0
roty.f = 0
 
rotx2.f = 0
roty2.f = 0
 
vitesse = 20
 
Repeat
     ExamineKeyboard ()
    
     ExamineMouse () ; ajout pour screen saver
    xmouse2= MouseDeltaX ()/25 ; ajout pour screen saver
    ymouse2= MouseDeltaY ()/25 ; ajout pour screen saver
    
    
    
     ; if Escape Key, exit
     If KeyboardReleased ( #PB_Key_Escape )
        Quit=1
     EndIf
    
    
    rotx2 = rotx2 * 0.5 + ( Random (100) - 50)/1000
    roty2 = roty2 * 0.5 + ( Random (100) - 50)/1000
    
    rotx = rotx * 0.99 + rotx2
    roty = roty * 0.99 + roty2
    
    DM_TurnEntity(*camera, rotx,roty,0)
    DM_MoveEntity(*camera, 0,0,vitesse)
    
    DM_TurnEntity(*light, rotx,roty,rotz)
    DM_MoveEntity(*light, 0,0,vitesse)
    
     For i=0 To #nbCubes
        DM_TurnEntity(*mesh(i), rx(i), ry(i), rz(i))
        dist = DM_EntityDistance (*camera, *mesh(i))
         If dist > e
            DM_EntityParent (*mesh(i), *camera)
            cameraz = DM_EntityZ(*camera, #False )
            DM_PositionEntity(*mesh(i), Random (e)-e/2, Random (e)-e/2 , Random (e/2)+e/2)
            DM_EntityParent (*mesh(i), null)
         EndIf
     Next
    
     ; ---------------
     ; Render pass
     ; ---------------
    DM_BeginScene()
    DM_RenderWorld()
    
     ; draw text
    DM_DrawText(*font, 10, 15, "FPS : " + Str (DM_FPS()))
    DM_DrawText(*font, 10, 30, Str ( #nbCubes ) + " cubes !" )
    DM_EndScene()
    
Until Quit=1 Or xmouse<>xmouse2 Or ymouse<>ymouse2 Or KeyboardPushed ( #PB_Key_All )
DM_ClearGraphics()
End

Otm@
Messages : 7
Inscription : dim. 10/juin/2007 17:10

Message par Otm@ »

Salut ,

Une question de neophyte ... avec cette dll il y a t il moyen de jouer les camera inclus dan un fichier.3ds .. j' ai essayer qq moteur et on (ptre certain se reconnaitrons) a du mal a jouer une scene 3D avec les mouvement de camera firectement autrement que le lire par nous meme et de jouer la camera ...

++
bombseb
Messages : 445
Inscription : jeu. 25/août/2005 22:59
Localisation : 974
Contact :

Message par bombseb »

Salut Otma !!
content de te voir ici 8)
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Otm@ a écrit :Salut ,

Une question de neophyte ... avec cette dll il y a t il moyen de jouer les camera inclus dan un fichier.3ds .. j' ai essayer qq moteur et on (ptre certain se reconnaitrons) a du mal a jouer une scene 3D avec les mouvement de camera firectement autrement que le lire par nous meme et de jouer la camera ...

++
non, pas a l'heure actuel, seules les geometrie des mesh et leur material associé
sont importés.
Il est vrai que le format 3DS permet de concerver en fait bien des élément en plus
des géometries de mesh, comme les camera et les lumières. Mais pour le moment ce
n'est pas encore implenté...

:?
Force et sagesse...
Répondre