Dreamotion3D

Généralités sur la programmation 3D
titimoby
Messages : 12
Inscription : sam. 24/avr./2004 13:42
Localisation : France, Villeurbanne
Contact :

Message par titimoby »

je rémerge des brumes de 2004 ou je m'étais perdu :)
Juste pour dire que certaines fautes sont soit apparues soit toujours présentes dans la doc.

Le wiki est la seule référence ou bien le chm est censé être à jour ?

Par exemple dans le chapitre sur l'installation, opn peut lire :
"Le moteur a été testé sous Windows XP et Vista sans soucis apparent."

Le choix est alors de mettre souci au singulier ou bien d'accorder apparent au pluriel.

Quoiqu'il en soit, je ne ferai rien de plus qu'il y a quelques années, mais je peux noter les fautes que je vois en profitant de toute cette documentation fort intéressante.

Chouette boulot !
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

salut

petit problème avec un mesh créer avec sketchup et exporté au format 3ds
le mesh : Imagehttp://patrick.claude.free.fr/DEV/essai1.3ds
texturé avec la texture "mur" dans media

j'ai repris le code du tutor 6 Charger un mesh déjà construit:

en remplaçant le code

Code : Tout sélectionner

*mesh.CEntity = DM_LoadMesh( "sphere1.x" )
par

Code : Tout sélectionner

*mesh.CEntity = DM_LoadMesh( "essai1.3ds" )
et écran noir que dalle... ça marche très bien avec la sphère

format 3ds pas bon ? pas supporté ? j'uis nul ?

pat
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Salutation,

En parlant de 3D, comment peut on obtenir OGRE 3D, svp??
ouwai je sais, je suis à l'ouest :oops:

merci :D
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Il est déjà intégré à PB :)
Enfin un début... la suite est prévue pour les version qui arrive bientot parrait il.

Dans le fichier d'aide, il te suffit d'aller voir à la ligne "Bibliothèques pour les jeux 3D " :wink:
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Patrick88 a écrit :salut

petit problème avec un mesh créer avec sketchup et exporté au format 3ds
le mesh : Imagehttp://patrick.claude.free.fr/DEV/essai1.3ds
texturé avec la texture "mur" dans media

j'ai repris le code du tutor 6 Charger un mesh déjà construit:

en remplaçant le code

Code : Tout sélectionner

*mesh.CEntity = DM_LoadMesh( "sphere1.x" )
par

Code : Tout sélectionner

*mesh.CEntity = DM_LoadMesh( "essai1.3ds" )
et écran noir que dalle... ça marche très bien avec la sphère

format 3ds pas bon ? pas supporté ? j'uis nul ?

pat
Ton cube ne serait pas trop gros pour etre affiché? Essayer de jouer avec DM_ScaleEntity()
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

cederavic a écrit : Ton cube ne serait pas trop gros pour etre affiché? Essayer de jouer avec DM_ScaleEntity()
non, pas une histoire de taille... en fait ce sont les paramêtre d'exportation qui étaient mal selectionnés dans le logiciel.

(j'ai encore des soucis avec l'expotation des textures... mais bon) :?

je vais pouvoir continuer le tutor, l'esprit serein :wink:

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

Message par Backup »

j'ai bien peur, qu'il faille dire adieux a Dreamotion3D
ça fais longtemps quand meme le manque de nouvelles de tmyke !! :?
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Mouai, mais sont collegue à dit qu'il n'avais pas possibilité de venir sur internet ces moment à cause de son travail.
Mais que DM3D continuais à évoluer quand même :wink:

Il viendra surement nous donner des news quand sont travail ce calmera un peut.
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 »

He non, je ne suis pas mort (enfin pas encore). Je presente par avance toutes mes
excuses pour ce Blockout si long, même si ce n'est vraiment de mon fait a vrai dire.

Je prend le temps de me poser un jour ou deux , et je reprend le taureau par les cornes.

De plus j'ai commencer a ré-ecrire DM3D dans son ensemble (ça j'ai au moins pu le faire...) ,
et le projet va très certainement passer OpenSource, avec quelques petits aménagements,
bref des nouvelles serieuses d'ici un ou deux jours.

;)
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tmyke a écrit :He non, je ne suis pas mort (enfin pas encore)
ha dommage !! :lol: :lol: :lol:

bon , content de voir que t'es encore parmis nous, c'est la fete,
(d'ailleurs c'est MA fete (Saint Michel :D ))

Merci pour tes bonnes nouvelles .. :)
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

tmyke a écrit :He non, je ne suis pas mort (enfin pas encore). Je presente par avance toutes mes
excuses pour ce Blockout si long, même si ce n'est vraiment de mon fait a vrai dire.

Je prend le temps de me poser un jour ou deux , et je reprend le taureau par les cornes.

De plus j'ai commencer a ré-ecrire DM3D dans son ensemble (ça j'ai au moins pu le faire...) ,
et le projet va très certainement passer OpenSource, avec quelques petits aménagements,
bref des nouvelles serieuses d'ici un ou deux jours.

;)

bon retour parmit nous, avec des news interessantes en plus :p.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Une version vite fait à l'arrache du PureBlock avec Dreamotion3D.

Comme l'axe Z est inversé par rapport à Ogre , tous les tests et les calculs sont à reprendre.

J'ai dû reprendre une ancienne version du fichier Dreamotion3D.pbi pour avoir le mode plein écran , pourquoi il a disparu dans la dernière version ?

J'ai utilisé cette fonction

Code : Tout sélectionner

Procedure DM_Graphics3D(width.l, height.l, depth.l, fullscreen.c, vsync.c, title.s = "Dreamotion 3D Engine",const.l= #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  	If fullscreen <>0
    		OpenScreen(width, height, depth, title)
    		DM_HWND = ScreenID()
    		DM_InitGraphics(DM_HWND, width, height, depth, fullscreen ,vsync) 
  	Else
    		DM_hwnd = OpenWindow(0, 0, 0, width, height, title, const)
    		OpenWindowedScreen(WindowID(0), 0, 0, width, height, 0, 0, 0)
	  	res= DM_InitGraphics(DM_HWND, width, height, depth, fullscreen ,vsync)
	  	If res = 0
	    		End
	  	EndIf
  	EndIf
	*DM_D3D 			= DM_GetD3D9()
	*DM_D3DDEVICE	= DM_GetDevice9()
	DM_WIDTH		= width
	DM_HEIGHT		= height
	ProcedureReturn DM_HWND
EndProcedure
J'ai pas réussi à faire fonctionner CameraPoint().

Code : Tout sélectionner


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

Enumeration
  #Nord
  #Est
  #Sud
  #Ouest
  #Vertical
EndEnumeration

#Taille=12
#Taille2 = #Taille/2

Structure f_Vecteur
  x.f
  y.f
  z.f
EndStructure

Structure i_Vecteur
  x.l
  y.l
  z.l
EndStructure

Structure s_Cube
  Angle.f
  p.f_Vecteur
  s.f_Vecteur
  t.f_Vecteur
  Type.l
  Sens.l
  Case1.I_Vecteur
  Case2.I_Vecteur
  Origine.I_Vecteur
EndStructure

Structure s_Vertex
  px.f
  py.f
  pz.f
  u.f
  v.f
EndStructure

Global Cube.s_Cube, Px.l, Pz.l, Perdu.l, MapX.l, MapZ.l
Define.l Options, i, j, n, Tombe

Restore Niveau1
Read MapX
Read MapZ
Dim Map(MapX+1,MapZ+1)
Read Cube\Origine\X
Read Cube\Origine\Z
For j=1 To MapZ
  For i = 1 To MapX
    Read Map(i,j)
  Next i
Next j

;Initialise le cube
Cube\p\x=Cube\Origine\X*#Taille
Cube\p\y=#Taille
Cube\p\z=Cube\Origine\Z*#Taille
Cube\Type = #Vertical
Cube\Sens = #Vertical

;- Ouverture de la fenêtre et de l'écran
InitSprite()
InitKeyboard()
DM_Graphics3D(1280, 1024, 32,  1, 1)

;- Declaration des procédures
Declare MakeMesh()
Declare Animation()
Declare CreateFaces()
Declare CreateFacesBlock()

Macro RENDER_WORLD()
   DM_BeginScene()
     DM_RenderWorld()
   DM_EndScene()
EndMacro

;-Mesh
Global   *ent.CEntity
CreateFaces()

Global   *entity.CEntity

Global *surface.CSurface
CreateFacesBlock()
MakeMesh()

Global *Bidon.CEntity
*bidon=DM_CreateMesh()


For j=1 To MapZ
  For i=1 To MapX
   
    If Map(i,j)=1
      Map(i,j)=DM_CopyEntity(*ent)
      DM_ScaleEntity(Map(i,j), #Taille, 2, #Taille)
      DM_PositionEntity(Map(i,j), i*#Taille, -1, j*#Taille)
    EndIf
  Next i
Next j     

DM_FreeEntity(*ent)

;-Camera
Global   *camera.CEntity
*camera   = DM_CreateCamera()
DM_PositionEntity(*camera, 0, 110, -16*#Taille)
DM_PositionEntity(*bidon, 5*#Taille, 0, 3*#Taille)
DM_PointEntity(*camera, *bidon)
DM_CameraClsColor(*camera, 5, 5, 85)
DM_CameraZoom(*camera, -0.42)

;-Light
DM_AmbientLight(185,  185,  185)
Global *light
*light=DM_CreateLight()
DM_LightColor(*light, 255,  255,  255, 255)
DM_PositionEntity(*light,500,500,500)
   
;- **** MAIN ****

*brush=DM_GetBrush(*entity)
DM_EntityLast(*entity)
DM_BrushAlpha(*brush, 150,2,3)

Repeat
 
  If ExamineKeyboard()
   
    If Cube\Sens = #Vertical
      If KeyboardPushed(#PB_Key_Left)
        Cube\Sens = #Ouest : MakeMesh()
      ElseIf KeyboardPushed(#PB_Key_Right)
        Cube\Sens = #Est   : MakeMesh()
      ElseIf KeyboardPushed(#PB_Key_Up)
        Cube\Sens = #Nord  : MakeMesh()
      ElseIf KeyboardPushed(#PB_Key_Down)
        Cube\Sens = #Sud   : MakeMesh()
      EndIf
    EndIf
  EndIf
 
  Animation()
  RENDER_WORLD()
 

Until KeyboardPushed(#PB_Key_Escape)

DM_ClearGraphics()
End
 

Procedure MakeMesh()
  Define.f x,y,z,u,v
  With Cube
  Select \type
    Case #Vertical
      \s\x = 1 : \s\y = 2 : \s\z = 1
    Case #Nord, #Sud
      \s\x = 1 : \s\y = 1 : \s\z = 2
    Case #Ouest, #Est
      \s\x = 2 : \s\y = 1 : \s\z = 1
  EndSelect
 
  Select \Sens
    Case #Nord
      \t\x = 0.5 : \t\y = 0.5 : \t\z = -0.5
    Case #Sud
      \t\x = 0.5 : \t\y = 0.5 : \t\z = 0.5
    Case #Ouest
      \t\x = 0.5 : \t\y = 0.5 : \t\z = 0
    Case #Est
      \t\x = -0.5 : \t\y = 0.5 : \t\z = 0
    Case #Vertical
      \t\x = 0 : \t\y = 0.5 : \t\z = 0
  EndSelect
 
  *surface=DM_GetSurface(*entity)
  Restore sommets
  For i = 0 To 23
    Read x
    Read y
    Read z
    Read u
    Read v
    DM_VertexCoords(*surface, i,(x + \t\x) * \s\x*#Taille, (y + \t\y) * \s\y*#Taille, (z + \t\z) * \s\z*#Taille)
  Next i
     
   
  DM_PositionEntity(*entity, \p\x-\t\x*\s\x*#Taille, 0, \p\z-\t\z*\s\z*#taille)
  EndWith
EndProcedure

Procedure Animation()
  Define.f Delta
  Delta = 4.5
 
  Select Cube\Sens

    Case #Ouest
      Cube\Angle + Delta
      DM_RotateEntity(*Entity,0,0,Cube\Angle)

      If Int(Cube\Angle) = 90
        Cube\Angle = 0 : Cube\Sens = #Vertical
        If Cube\Type = #Vertical
          Cube\Type = #Ouest
          Cube\p\x - 1.5*#Taille
        ElseIf Cube\Type = #Est Or Cube\Type = #Ouest
          Cube\Type = #Vertical
          Cube\p\x - 1.5*#Taille
        Else
          Cube\p\x - #Taille
        EndIf
      EndIf
     
    Case #Est
      Cube\Angle - Delta
      DM_RotateEntity(*Entity,0,0,Cube\Angle)
   
      If Int(Cube\Angle) = -90
        Cube\Angle = 0 : Cube\Sens = #Vertical
         
        If Cube\Type = #Vertical
          Cube\Type = #Est
          Cube\p\x + 1.5*#Taille
        ElseIf Cube\Type = #Est Or Cube\Type = #Ouest
          Cube\Type = #Vertical
          Cube\p\x + 1.5*#Taille
        Else
          Cube\p\x + #Taille
        EndIf
       
      EndIf   
     
  Case #Nord
      Cube\Angle + Delta
      DM_RotateEntity(*Entity,Cube\Angle, 0, 0)

      If Int(Cube\Angle) = 90
        Cube\Angle = 0 : Cube\Sens = #Vertical
 
        If Cube\Type = #Vertical
          Cube\Type = #Nord
          Cube\p\z + 1.5*#Taille
        ElseIf Cube\Type = #Nord Or Cube\Type = #Sud
          Cube\Type = #Vertical
          Cube\p\z + 1.5*#Taille
        Else
          Cube\p\z + #Taille
        EndIf
       
      EndIf
           
  Case #Sud
      Cube\Angle - Delta
      DM_RotateEntity(*Entity,Cube\Angle,0,0)
     
      If Int(Cube\Angle) = -90
        Cube\Angle = 0 :  Cube\Sens = #Vertical
 
        If Cube\Type = #Vertical
          Cube\Type = #Sud
          Cube\p\z - 1.5*#Taille
        ElseIf Cube\Type = #Nord Or Cube\Type = #Sud
          Cube\Type = #Vertical
          Cube\p\z - 1.5*#Taille
        Else
          Cube\p\z - #Taille
        EndIf

      EndIf
  EndSelect
     
EndProcedure

 
Procedure CreateFacesBlock()
  Protected *bb.CBrush
  Protected *texture.CTexture
  Define i
  Define x.f,y.f,z.f, u.f, v.f
  Define s1.w,s2.w,s3.w

   *entity = DM_CreateMesh()
  *surface = DM_CreateSurface(*entity)

  Restore sommets
  For i = 0 To 23
    Read x : Read y : Read z
    Read u : Read v
    DM_AddVertex(*surface, x, y, z , u,v )
    DM_VertexColor(*surface, i, 255,255,255,255)
  Next i

  For i = 1 To 12 
    Read s1 : Read s2 : Read s3
    DM_AddTriangle(*surface, s1,s2,s3)
  Next i


   *bb = DM_CreateBrush("cube")
 
  *texture = DM_CreateTexture(256,256)
  DM_SetBuffer(*texture)
  DM_BeginScene()
    DM_ClsScreen($66,$66,$77,50) ; efface le buffer avec une couleur
    DM_SetColor($99, $99 ,$99,255) ; change couleur du trait
    DM_DrawRect(0,0,255,255)  ; dessin d'un rectangle 2D
 
  DM_EndScene()
  DM_SetBuffer(#Null)
 
 
  DM_BrushTexture(*bb, *texture,0)
  ; modifie l'état de rendu de la Brush pour voir de tous les cotés
  ;DM_BrushAddRender(*bb, #D3DRS_CULLMODE, #D3DCULL_NONE)
  ; affecte la brush créee a notre entity
  DM_PaintEntity(*entity, *bb)
  ; génératon auto des normales de l'entity créée
  DM_UpdateNormal(*entity) 
   ProcedureReturn
EndProcedure
 
Procedure CreateFaces()
  Protected *bb.CBrush
  Protected *texture.CTexture
  Protected *surface1.CSurface
  Define i
  Define x.f,y.f,z.f, u.f, v.f
  Define s1.w,s2.w,s3.w
 
 
  ; défine mesh
   ; 4 faces, 8 vertices, 2 surfaces
   *ent = DM_CreateMesh()
  *surface1 = DM_CreateSurface(*ent)
   ; define vertices and texture coordinate   
  Restore sommets
  For i = 0 To 23
    Read x : Read y : Read z
    Read u : Read v
    DM_AddVertex(*surface1, x, y, z , u,v )
    DM_VertexColor(*surface1, i, 255,255,255,255)
  Next i
  For i = 1 To 12 
    Read s1 : Read s2 : Read s3
    DM_AddTriangle(*surface1, s1,s2,s3)
  Next i


  ;--------------------------------------------------------
  ; c'est ici
  ;--------------------------------------------------------
  ; -------------------------------
   ; create little Brush
   ; -------------------------------
   *bb = DM_CreateBrush("cube")
 
  ; creation d'une texture vide de 256x256
  *texture = DM_CreateTexture(256,256)
  ; ré-oriente le buffer de sortie graphique vers notre texture
  DM_SetBuffer(*texture)
  ; debut d'un rendu
  DM_BeginScene()
    DM_ClsScreen(255,255,255,0) ; efface le buffer avec une couleur
    DM_DrawRect(0,0,255,255)  ; dessin d'un rectangle 2D
  DM_SetColor(0, 0 ,0,255) ; change couleur du trait
   ;' fin rendu
  DM_EndScene()
  ; de nouveau le buffer vers l'ecran
  DM_SetBuffer(#Null)
 
 
  DM_BrushTexture(*bb, *texture,0)
  ; modifie l'état de rendu de la Brush pour voir de tous les cotés
  ;DM_BrushAddRender(*bb, #D3DRS_CULLMODE, #D3DCULL_NONE)
  ; affecte la brush créee a notre entity
  DM_PaintEntity(*ent, *bb)
  ; génératon auto des normales de l'entity créée
  DM_UpdateNormal(*ent) 
EndProcedure
;{ Définition du cube
DataSection
Sommets:
;Dessus 0 à 3
Data.f -0.5,0.5,-0.5
Data.f 0,0

Data.f 0.5,0.5,-0.5
Data.f 0,1

Data.f 0.5,0.5,0.5
Data.f 1,1

Data.f -0.5,0.5,0.5
Data.f 1,0

;Dessous 4 à 7
Data.f -0.5,-0.5,0.5
Data.f 0,0

Data.f 0.5,-0.5,0.5
Data.f 0,1

Data.f 0.5,-0.5,-0.5
Data.f 1,1

Data.f -0.5,-0.5,-0.5
Data.f 1,0

;Devant 8 à 11
Data.f -0.5,0.5,0.5
Data.f 0,0

Data.f 0.5,0.5,0.5
Data.f 0,1

Data.f 0.5,-0.5,0.5
Data.f 1,1

Data.f -0.5,-0.5,0.5
Data.f 1,0

;Derrière 12 à 15
Data.f 0.5,0.5,-0.5
Data.f 0,0

Data.f -0.5,0.5,-0.5
Data.f 0,1

Data.f -0.5,-0.5,-0.5
Data.f 1,1

Data.f 0.5,-0.5,-0.5
Data.f 1,0

;Cote gauche 16 à 19
Data.f -0.5,0.5,-0.5
Data.f 0,0

Data.f -0.5,0.5,0.5
Data.f 0,1

Data.f -0.5,-0.5,0.5
Data.f 1,1

Data.f -0.5,-0.5,-0.5
Data.f 1,0

;Cote droit 20 à 23
Data.f 0.5,0.5,0.5
Data.f 0,0

Data.f 0.5,0.5,-0.5
Data.f 0,1

Data.f 0.5,-0.5,-0.5
Data.f 1,1

Data.f 0.5,-0.5,0.5
Data.f 1,0

Triangles:
;Face en Haut
Data.w 2,1,0
Data.w 0,3,2
;Face en Bas
Data.w 6,5,4
Data.w 4,7,6
;Face Avant
Data.w 10,9,8
Data.w 8,11,10
;Face Arrière
Data.w 14,13,12
Data.w 12,15,14
;Face Gauche
Data.w 18,17,16
Data.w 16,19,18
;Face Droite
Data.w 22,21,20
Data.w 20,23,22

Niveau1:
Data.l 10,6
Data.l 2, 2
Data.l 1,1,1,0,0,0,0,0,0,0
Data.l 1,1,1,1,1,1,0,0,0,0
Data.l 1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,1,1,1,1,1
Data.l 0,0,0,0,0,1,1,2,1,1
Data.l 0,0,0,0,0,0,1,1,1,0
EndDataSection
;}
Dernière modification par comtois le dim. 21/oct./2007 15:02, modifié 4 fois.
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 »

comtois a écrit : J'ai dû reprendre une ancienne version du fichier Dreamotion3D.pbi pour avoir le mode plein écran ,
pourquoi il a disparu dans la dernière version ?
Elle semblais poser des soucis de compatibilité sur certaines machines. Mais avec la version actuelle,
tu peux aussi passer par le plein écran. Dans le code que tu fournis ci-dessus, avec la fonction
native, j'ai bien le plein ecran (alors soucis la encore entre divers ordi...)
comtois a écrit : J'ai pas réussi à faire fonctionner CameraPoint().
Tout dépend ce que tu soihaitais faire, en fait CameraPoint retorune le vecteur LookAt de
la camera spécifiée.

sinon le code tourne bien ;)
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ça manque cruellement de doc ! ok je comprends mieux à quoi sert CameraPoint()

Je voulais faire un CameraLookAt(), donc du coup il faut utiliser PointEntity()
Mais le deuxième paramètre est obligatoirement une entity ? je voudrais juste spécifier un point 3D. ou alors il y a quoi dans la structure Centity ? je pourrais définir une variable de ce type, sans créer d'entity, et la passer en paramètre ?

Comment je fais pour rendre transparent le block ? comme dans la version avec Ogre ?

A tout hasard, il n'y a pas un paramètre pour définir comment l'axe Z sera orienté et utilisé par le moteur 3D ?
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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Genial :D

si Comtois se met a Dreammotion3D , Tmyke va etre obligé de travailler dessus :lol:
parceque le Comtois, y va en trouver des manques :lol:
Répondre