Dreamotion3D

Généralités sur la programmation 3D
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 »

D'abord, voila comment cela marche sous DM3D:

les ligne 3D sont des entity comme les autres, avec leurs coordonnées dans l'espace.
Tu définis d'abord le tableau vide, avec le maximum de point qu'il
pourra contenir, puis tu l'alimente.

voici un petit code qui illustre mieux cela: touche 'N' la premier Cube monte,
la ligne le suit. Touche 'B', tu fais monter l'Entity line complete .

Code : Tout sélectionner

; Fichiers Include 
IncludePath "Include\"  :  IncludeFile "dreamotion3d.pbi"



  ;  Initialisation des différents modules
  If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 
    End
  EndIf

  ; Initialise la fenêtre graphique
  DM_Graphics3D(800, 600, 32,  0, 1) 
  ; Définit la couleur ambiante
  DM_AmbiantLight(0,  0,  0)
  DM_CreateLight(3)
  
  ; ---------------------------------------
  ;            meshs
  ; ---------------------------------------
  *cube1.CEntity = DM_CreateCube()
  *cube2.CEntity = DM_CreateCube()
  DM_TranslateEntity(*cube2,10,0,0)

  ;creation de line 3D
  *line.CEntity = DM_CreateLine(2)
  DM_LinePoint(*line, DM_EntityX(*cube1), DM_EntityY(*cube1),DM_EntityZ(*cube1), 0,255,0)
  DM_LinePoint(*line, DM_EntityX(*cube2), DM_EntityY(*cube2),DM_EntityZ(*cube2), 0,255,0)
  
  ; autres fonctions
  ; DM_CloseLine(*entity.CEntity)
  ; DM_LinePosition(*entity.CEntity, numPoint.l,  x.f, y.f, z.f)
 
  ; ---------------------------------------
  ;          Gestion des caméras
  ; ---------------------------------------
  *camera   = DM_CreateCamera()
  DM_MoveEntity(*camera, 0,0,-20.0)
  DM_CameraClsColor(*camera, 125, 125, 125)
  
  ; ---------------------------------------
  ;           Boucle principale
  ; ---------------------------------------
  Repeat
  	ExamineKeyboard()
  	ExamineMouse() 
  	ShowCursor_(1)
  	 		
    If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
  	  Quit=1
    EndIf
  	 	
    If KeyboardPushed(#PB_Key_N)
        DM_TranslateEntity(*cube1, 0,0.2,0)
        DM_LinePosition(*line, 0, DM_EntityX(*cube1), DM_EntityY(*cube1),DM_EntityZ(*cube1))
    EndIf 
    
    If KeyboardPushed(#PB_Key_B)
        DM_TranslateEntity(*line, 0,0.2,0)
    EndIf 

  	; ---------------
  	;      Rendu
  	; ---------------
  	DM_BeginScene()
    	DM_RenderWorld()
   	DM_EndScene()
  	
Until Quit=1
DM_ClearGraphics()
End
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Merci pour l'exemple :D

je pensais plus a un system de ligne fait avec une entity

que la ligne soit composé d'entity par exemple le cylindre

ce qui permettrait un système ou l'on pourrai faire partir
le cylindre sur une coordonné x,y,z et faire arriver l'autre bout du cylindre
en x2,y2,z2 !!
de cette façon tu fait entrer la possibilité d'utiliser des "Tuyaux" dans le moteur3D :D

si a la place du cylindre on utilisait un cube, cela permettrait des tuyaux carré :D
ect.. avec d'autre Formes :D

De la plomberie en quelque sorte :lol:
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 »

A je comprend mieux, cela doit etre faisable avec les fonctions de DM3D,
genre orientation du cube sur l'axe de la ligne, puis les bons ScaleMesh() et
voila. Je cogite cela et je te tiens au courant...
:wink:
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

en utilisant Besenhame, j'arrive a faire sur y et z

mais je bloc pour integrer les y en plus !!

quelqu'un connais un algo de ligne de bresenham 3D ?
un LineXYZ() en quelque sorte :D
avec ça ce serai pas trop dur d'y arriver :D

le problem d'utiliser des objet multiple, c'est que ça rame vite :D
l'ideal serai d'avoir a dispo un seul objet "ligne3D" qui permette ce genre de chose, tout en proposant des formes variés :D
(mais la , ce serai la cerise sur la gateau :lol:)

un peut comme l'extincteur d'ecran Windows (les tuyaux :lol: )



voici un petit exemple de ce que j'obtiens avec bresenham 2D

Code : Tout sélectionner

IncludePath "D:\PureBasic\dobro\Exemple Perso\3Dreammotion\Samples\include\" ; mettre le bon chemin
IncludeFile "dreamotion3d.pbi"
#ecran=1
largeur_ecran=800
hauteur_ecran=600
titre$="coucou"

Declare  Linexy3D(x1,y1,x2,y2,Couleur)
If InitSprite () = 0 Or InitKeyboard () = 0 Or InitMouse () = 0
    End
EndIf





 OpenWindow(#ecran, 0, 0, largeur_ecran, hauteur_ecran,titre$,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered ) 
WindowID = WindowID(#ecran) 
OpenWindowedScreen(WindowID(#ecran) , 0, 0,largeur_ecran, hauteur_ecran, 0, 0,0) 
DM_Graphics3DGadget(largeur_ecran, hauteur_ecran, WindowID, 1)  ; <<<- cette fonction fait l'ecran 3D en gadget !!
*Camera = DM_CreateCamera()
DM_CameraClsColor(*Camera, 50, 50, 50)
DM_TurnEntity(*Camera, 25, -15, 0, glob.b=#False) ; baisse la tete de 25° et tourne la tete a gauche de 15°
DM_TranslateEntity(*Camera,30,25,-50); monte de 25, et recule de 50

*cube=DM_CreateCube()
DM_CreateLight(3)


x1=0
y1=0
x2=100
y2=0 
Linexy3D(x1,y1,x2,y2,Couleur)



Repeat
    ExamineKeyboard ()
    ExamineMouse () 
   
    ;-;-3D Control Camera fin de dessin
    If KeyboardPushed(#PB_Key_Up ) 
        poz=1
        DM_MoveEntity(*Camera, 0,0,0.8); on recule/avance la camera
    ElseIf KeyboardPushed(#PB_Key_Down )  
        poz=-1 
        DM_MoveEntity(*Camera, 0,0,-0.8); on recule/avance la camera
    ElseIf KeyboardPushed(#PB_Key_Left ) 
        DM_MoveEntity(*Camera, -0.8,0,0); on recule/avance la camera
        
    ElseIf KeyboardPushed(#PB_Key_Right ) 
        DM_MoveEntity(*Camera, 0.8,0,0); on recule/avance la camera
    EndIf      
    
    If MouseButton ( #PB_MouseButton_Left )
        Quit=1
        ShowCursor_(1) ; montre le curseur 
    EndIf
    DM_TurnEntity(*Camera, MouseDeltaY ()/8, MouseDeltaX ()/8,0) 
    
    
   
;      Render  c'es ce qui permet de voir le resultat !
DM_BeginScene() 
DM_RenderWorld() 
DM_EndScene() 


Until KeyboardReleased ( #PB_Key_Escape ) Or WindowEvent ()= #PB_Event_CloseWindow
 DM_ClearGraphics()
CloseWindow(#ecran)


Procedure  Linexy3D(x1,y1,x2,y2,Couleur)
    ; StartDrawing(ScreenOutput())
    FrontColor(Couleur)
    x = x1
    z = -y1
    dx = x2 - x1
    dy = y2 - y1
    If dx > 0
        xinc = 5
    Else
        xinc = -5
    EndIf
    If dy > 0
        yinc = 5
    Else
        yinc = -5
    EndIf 
    
    dx = Abs(dx)
    dy = Abs(dy)
    *trace3d=DM_CreateCube.l( #Null) 
    DM_PositionEntity( *trace3d, x, Y, z)
    If  dx > dy
        cumul = dx / 2
        For i = 1 To dx 
            x + xinc
            cumul + dy
            If (cumul >= dx)
                cumul - dx
                z + yinc
            EndIf 
            *trace3d=DM_CreateCube.l( #Null) 
            DM_PositionEntity( *trace3d, x, Y, z)
        Next 
    Else
        cumul = dy / 2
        For i = 1 To  dy
            z + yinc
            cumul + dx
            If cumul >= dy
                cumul - dy
                x + xinc
            EndIf 
            *trace3d=DM_CreateCube.l(  #Null) 
            DM_PositionEntity( *trace3d, x, Y, z)
        Next   
    EndIf  
    ; StopDrawing()
EndProcedure   

  
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

tu fais ton mesh manuel, un carré, tu as juste à placer les vertex aux bonnes coordonnées, les triangles sont toujours les mêmes .
Je faisais comme ça avec Ogre.ça rendait pas trop mal.
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.
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 fait, c'est meme beaucoup plus simple que je ne le pensais au
départ, voici donc un petit code qui correspond a ce que tu cherches:

Code : Tout sélectionner

; Fichiers Include 
IncludePath "Include\"  :  IncludeFile "dreamotion3d.pbi"

; Globales
Global	anglex.f, angley.f, flagXDown.w
Global	mox.f, omx.f, moy.l, omy.l
Global  Quit.b


  ;  Initialisation des différents modules
  If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 
    End
  EndIf

  ; Initialise la fenêtre graphique
  DM_Graphics3D(800, 600, 32,  0, 1) 
  ; Définit la couleur ambiante
  DM_AmbiantLight(0,  0,  0)
  DM_CreateLight(3)
  
  ; ---------------------------------------
  ;  meshs deux cubes symbolisant les deux
  ;  points, a remplacer par des entity pivots
  ; ---------------------------------------
  *cube1.CEntity = DM_CreateCube()
  DM_EntityColor(*cube1, 255,100,0,0)
  *cube2.CEntity = DM_CreateCube()
  DM_TranslateEntity(*cube2,-10,3,4)
  DM_EntityColor(*cube2, 255,100,0,0)
  
  ; calcul le centre des deux point
  center.D3DXVECTOR3
  center\x = (DM_EntityX(*cube1) + DM_EntityX(*cube2))/2.0
  center\y = (DM_EntityY(*cube1) + DM_EntityY(*cube2))/2.0
  center\z = (DM_EntityZ(*cube1) + DM_EntityZ(*cube2))/2.0
  distance.f = DM_EntityDistance(*cube1, *cube2)/2
  
  ; creation du cube qui va servir de ligne  
  *ll = DM_CreateCube()
  DM_EntityColor(*ll, 100,255,0,0)
  ; positionne au centre de la ligne
  DM_PositionEntity(*ll, center\x, center\y, center\z)
  ; l'oriente vers une deux deux extrémités
  DM_PointEntity(*ll,*cube1)
  ; fait la bonne mise a l'echelle, c'est tout
  DM_ScaleEntity(*ll, 1,1,distance) ;
  
  
  ; ---------------------------------------
  ;          Gestion des caméras
  ; ---------------------------------------
  *camera   = DM_CreateCamera()
  DM_MoveEntity(*camera, 0,5,-20.0)
  DM_CameraClsColor(*camera, 125, 125, 125)
  
  ; ---------------------------------------
  ;           Boucle principale
  ; ---------------------------------------
  Repeat
  	ExamineKeyboard()
  	ExamineMouse() 
  	ShowCursor_(1)
  	 		
    If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
  	  Quit=1
    EndIf
  	 	
  	; Gestion de la caméra
    If KeyboardPushed(#PB_Key_Up)
  	 	DM_MoveEntity(*camera, 0,0,1)
    ElseIf KeyboardPushed(#PB_Key_Down) 
  	  DM_MoveEntity(*camera, 0,0,-1)
    EndIf
    If MouseButton(#PB_MouseButton_Left)
  		If flagXDown=0
  			omx = MouseX()
  			omy = MouseY()
  			flagXDown=11
  		Else
  			moy = MouseY()-omy
  			angley=(moy/5.0)
  			omy= MouseY()
  			mox = MouseX()-omx
  			anglex=(mox/5.0)
  			omx= MouseX()
  			DM_TurnEntity(*camera, angley,anglex,0)
  		EndIf
  	Else
  	 		flagXDown=0
    EndIf
  	; ---------------
  	;      Rendu
  	; ---------------
  	DM_BeginScene()
    	DM_RenderWorld()
   	DM_EndScene()
  	
Until Quit=1
DM_ClearGraphics()
End
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

comtois a écrit :tu fais ton mesh manuel, un carré, tu as juste à placer les vertex aux bonnes coordonnées, les triangles sont toujours les mêmes .
Je faisais comme ça avec Ogre.ça rendait pas trop mal.
heu ! oui tu sais moi et la 3D c'est pas le pied :lol:

sinon tu connaitrai l'algo de bresenham adapté a la 3D ?
qui prend en compte le "Z" en plus du xy... 8O

je me sert du code que tu avais posté (cool d'ailleurs)

il relie tres bien 2 coordonées (x,y)------->(x2,y2)
il me faudrai l'equivalent (x,y,z)---------->(x2,y2,z2)
:D

avec ça je pourrai faire ce que je veux (ou presque :lol:)
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 »

T'as du poster juste après moi, donc pas vue mon post ... :?:
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ok ! Merci , je vais essayer de comprendre ça :D
effectivement ça pourrai bien me dépanner :lol:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

VOILA !! :D :D

je l'ai mis en procedure, pour que ce soit plus simple

ce serai geant d'ajouter cette fonction a Dream !! :D

voici ce que je voulais !!


ligne3D(x1,y1,z1,x2,y2,z2, RGB(255,10,200))



IncludePath "D:\PureBasic\dobro\Exemple Perso\3Dreammotion\Samples\include\" ; mettre le bon chemin
IncludeFile "dreamotion3d.pbi"
#ecran =1
largeur_ecran=800
hauteur_ecran=600
titre$= "coucou"


Declare ligne3D(x1,y1,z1,x2,y2,z2,Couleur)
If InitSprite () = 0 Or InitKeyboard () = 0 Or InitMouse () = 0
     End
EndIf





OpenWindow ( #ecran , 0, 0, largeur_ecran, hauteur_ecran,titre$, #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
WindowID = WindowID ( #ecran )
OpenWindowedScreen ( WindowID ( #ecran ) , 0, 0,largeur_ecran, hauteur_ecran, 0, 0,0)
DM_Graphics3DGadget(largeur_ecran, hauteur_ecran, WindowID , 1) ; <<<- cette fonction fait l'ecran 3D en gadget !!
*Camera = DM_CreateCamera()
DM_CameraClsColor(*Camera, 50, 50, 50)
DM_TurnEntity(*Camera, 25, -15, 0, glob.b= #False ) ; baisse la tete de 25° et tourne la tete a gauche de 15°
DM_TranslateEntity(*Camera,30,25,-50) ; monte de 25, et recule de 50

*cube=DM_CreateCube()
DM_CreateLight(3)


x1=0
y1=0
z1=0
x2=100
y2=0
z2=0
ligne3D(x1,y1,z1,x2,y2,z2, RGB (255,10,200))



Repeat
     ExamineKeyboard ()
     ExamineMouse ()
    
     ;-;-3D Control Camera fin de dessin
     If KeyboardPushed ( #PB_Key_Up )
        poz=1
        DM_MoveEntity(*Camera, 0,0,0.8 ) ; on recule/avance la camera
     ElseIf KeyboardPushed ( #PB_Key_Down )
        poz=-1
        DM_MoveEntity(*Camera, 0,0,-0.8 ) ; on recule/avance la camera
     ElseIf KeyboardPushed ( #PB_Key_Left )
        DM_MoveEntity(*Camera, -0.8,0,0) ; on recule/avance la camera
        
     ElseIf KeyboardPushed ( #PB_Key_Right )
        DM_MoveEntity(*Camera, 0.8,0,0) ; on recule/avance la camera
     EndIf
    
     If MouseButton ( #PB_MouseButton_Left )
        Quit=1
         ShowCursor_ (1) ; montre le curseur
     EndIf
    DM_TurnEntity(*Camera, MouseDeltaY ()/8, MouseDeltaX ()/8,0)
    
    
    
     ; Render c'es ce qui permet de voir le resultat !
    DM_BeginScene()
    DM_RenderWorld()
    DM_EndScene()
    
    
Until KeyboardReleased ( #PB_Key_Escape ) Or MouseButton ( #PB_MouseButton_Left )
DM_ClearGraphics()
CloseWindow ( #ecran )


Procedure ligne3D(x1,y1,z1,x2,y2,z2,Couleur)
    
    Rouge= Red (Couleur)
    Vert = Green (Couleur)
    Bleu= Blue (Couleur)
    
     ; ---------------------------------------
     ; meshs deux cubes symbolisant les deux
     ; points, a remplacer par des entity pivots
     ; ---------------------------------------
    *cube1.CEntity = DM_CreateCube()
    DM_EntityColor(*cube1, 255,100,0,0)
    *cube2.CEntity = DM_CreateCube()
     ;DM_TranslateEntity(*cube2,-10,3,4)
    DM_EntityColor(*cube2, 255,100,0,0)
     ; *********************************
     ; *********************************
    
    
    
    DM_PositionEntity(*cube1, x1, y1, z1)
    DM_PositionEntity(*cube2, x2, y2, z2)
    
     ; calcul le centre des deux point
    center.D3DXVECTOR3
    center\x = (DM_EntityX(*cube1) + DM_EntityX(*cube2))/2.0
    center\Y = (DM_EntityY(*cube1) + DM_EntityY(*cube2))/2.0
    center\z = (DM_EntityZ(*cube1) + DM_EntityZ(*cube2))/2.0
    distance.f = DM_EntityDistance(*cube1, *cube2)/2
    
     ; creation du cube qui va servir de ligne
    *ll = DM_CreateCube()
    DM_EntityColor(*ll,Rouge,Vert,Bleu,0)
     ; positionne au centre de la ligne
    DM_PositionEntity(*ll, center\x, center\Y, center\z)
     ; l'oriente vers une deux deux extrémités
    DM_PointEntity(*ll,*cube1)
     ; fait la bonne mise a l'echelle, c'est tout
    DM_ScaleEntity(*ll, 1,1,distance) ;
    
EndProcedure

Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ps : sans oublier le parametre de taille de la ligne bien sur ! :D
Merci encore
Anonyme

Message par Anonyme »

Salut les gens !
Tmyke , des nouvelles du moteur ? :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 »

Cpl.Bator a écrit :Salut les gens !
Tmyke , des nouvelles du moteur ? :D
En ce moment je me prend la tete avec les moteurs physiques.
J'ai commencé l'adaptation de la version 2.7.0 de PhysX,
mais j'avoue que cela me prend tout mon temps, et en plus
j'en chie grave. Je me suis dis, tiens, essayons Newton,
mais a peine commencé le wrap pour PB, dès que j'ai vue
comment Newton rame par raport a PhysX, alors j'ai laissé
tombé. Donc, pour résumé, je continue sur PhysX 2.7.0, mais
je ne le fais plus que ponctuellement pour me recentrer sur
le moteur graphique, ou je travaille la doc, quelques bug
encore gènant (sur le terrain par exemple), et je commence
les fonction d'octree.
Et puis je cogite pour faire un petit jeux, pour le plaisir
mais aussi en guise de porte fanion de DM3D.

Enfin, tu vois, je ne manque pas d'occupation, faudrais que
j'arrete de travailler pour me consacrer a 100% a DM3D, mais
faut bien nourrir sa famille :(
Force et sagesse...
Anonyme

Message par Anonyme »

Oui , la famille est prioritaire ^^
Je participe au concour lançé par Polux, je compte utiliser ton moteur pour mon shmup. j'ai voulu utiliser mes supersprite3D, mais trop de problème de clipping, donc d3d fera l'affaire ^^
La bonne nouvelle c'est que j'ai internet ^^
la mauvaise , "entre guillemet" c'est que je passe du status de chomeur à mon propre patron , donc je ne vais pas avoir beaucoup de temps en semaine. Donc tu auras sans aucun doute des rapports de bugs le week end.
je commence
les fonction d'octree.
Impecable ^^ , pense aussi au "multi-terrain", je parle de pouvoir en créer 3 ou 4 puis de les mettres bout a bout, et cela combiné avec l'octree devrais donnée de bon resultats, je te souhaite bon courage pour la suite ^^
et ne zappe pas le shadow mapping :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 »

Bonne nouvelle si tu reviens dans les parages le WE. Pour les avancés du
moteur, comme d'hab, je poste pour tenir au courant
:wink:

PS: le concour lancé par Polux, quel en est le principe (pas trouvé ici...) ?
[EDIT] Ok, j'ai vue (BGames)
Force et sagesse...
Répondre