Dreamotion3D

Généralités sur la programmation 3D
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Ok merci, j'ai déjà mieu compris certaine choses, et je vais lire et relire ce que tu a écris pour bien tout comprendre :wink:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

L'exemple PurePatator ne fonctionne pas comme mon exemple WaterWorld, il n'y a plus la marche arrière, on ne bloque plus la rotation en hauteur.
Alors je commence à chercher pourquoi, premier constat, pour gérer la rotation en hauteur je dois croiser les tests

Dans WaterWorld j'avais ça

Code : Tout sélectionner

  If Mouse\x > 0 And DM_EntityPitch(*camera) < 60
    DM_TurnEntity(*camera, Mouse\x, 0, 0)
  ElseIf Mouse\x < 0 And DM_EntityPitch(*camera) > -60
    DM_TurnEntity(*camera, Mouse\x, 0, 0)
  EndIf
Dans PurePatator , pour que ça fonctionne de la même façon je suis obligé de mettre ça :

Code : Tout sélectionner

  If Mouse\x > 0 And DM_EntityPitch(*camera) > -60
    DM_TurnEntity(*camera, Mouse\x, 0, 0)
  ElseIf Mouse\x < 0 And DM_EntityPitch(*camera) < 60
    DM_TurnEntity(*camera, Mouse\x, 0, 0)
  EndIf
Qu'est-ce qui a changé entre ces deux versions ?

Pour la marche arrière je n'ai pas encore regardé pourquoi ça ne marche plus, et je n'ai pas encore regardé pourquoi tu avais ajouté ça :

Code : Tout sélectionner

        ; récupère les vertex associé, '*resul' étant le mesh resultant du test de Raycasting
        n_face.l = 0
        n_surface.l = 0
        *surfP.CSurface=DM_GetSurface(*resul)
        ; recherche la surface correspondante
        n_surface = DM_CountSurface(*resul)
        If(n_surface>1)
          For i = 1 To n_surface
           *surf.CSurface = DM_GetSurface(*resul, i-1)
           n_face = n_face + DM_CountTriangles(*surf)
           If(n_face>face)
             *surfP = DM_GetSurface(*resul, i-1)
             ; face relative à la surface
             face = face - (n_face - DM_CountTriangles(*surfP) )
             i=999999999
           EndIf
          Next
        EndIf 
Qu'est-ce qui a changé ? je n'ai pas encore essayé de reprendre l'ancien code pour voir ce que ça donnerait, mais si tu as déjà une explication simple à donner, je suis preneur.
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 »

Pour la marche arrière, ce n'est pas normal, j'ai du mettre en ligne le mauvais
sample, non achevé (une de mes étourderie de plus).
En fait j'ai pris en compte les remarques, et refais les déplacements, tu peux maintenant
avancer, reculer, aller de coté, et surtout faire les deux en meme temps
(en biais si tu préfères).

Pour le bloquage en hauteur, il a disparu surtout par erreur, lors de mes mise aux points
ou je l'avais fait sauté. Pour ta remarque sur la différence entre l'ancienne méthode
et la nouvelle sur le bloquage en hauteur, c'est un bug, donc merci d'avoir mis le
doigt dessus, il y a une inversion dans la fonctions DM_EntityPitch() au niveau du signe.


Pour la symbolisation de la face touché, le code rejouté est en fait indispensable, car
avec le nouveau moteur, la gestion en interne des Mesh est légérement différente. Chaque
Mesh est composé de surface, et donc la scene n'est plus une entité unifiée, quand tu as
la face fournis par le moteur physique, il faut ensuite trouver la bonne surface, puis
enfin la bonne face. Voila pourquoi.

J'ai mis en ligne la dernière version de DM3D cet après-midi, cela ne corrige pas encore
le bug sur le signe de EntityPitch(), mais la version de PurePatator doit etre plus
complete, en particulier sur le mouvement (reculer, straf, ...)
(dernière mise a jour de DM3D indispensable pour que cela tourne)
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Merci c'est beaucoup plus clair maintenant. Cool on peut enfin se déplacer en biais , voila une bonne nouvelle.

Avec PureBasic il existe une façon plus élégante que ça
i=999999999
pour sortir d'une boucle, essaye avec Break :)

Je vais attendre la prochaine mise à jour avant de télécharger(avec DM_EntityPitch() corrigé).
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 »

Pour le Break, c'est du tout bon, et pour la mise a jour, demain dans l'après midi
au plus tard...
:wink:
Force et sagesse...
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Salut,

Voila, j'ai un petit problème, je vous met la cituation dans un exemple :

J'ai un objet a l'écran, par exemple une sphere, et je voudrais arrivé a faire tourner cette sphère dans le sens anti horlogique. Jusque la tout va bien.

Mais en même temps, je voudrais faire tourner la caméra dans le même sens en même temps. Tout en gardant une distance constante entre les deux.
ça reviendrais en quelque sorte a faire une rotation de la caméra sur l'axe Y de la sphère...

Pouvez vous me dire comment faire ?
Car j'ai esseyer plein de truc mais là je deviens fou mdr

Merci.
Anonyme

Message par Anonyme »

Tu veut dire que ta sphère est le point de pivot de ta caméra, et que ta camera regarde la sphère, non?
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Oui c'est ça que je veux dire.
Anonyme

Message par Anonyme »

En fait il faut créer un pivot
ensuite lorsque que tu créer la camera, tu lui assigne un pivot en parent
et tu tourne le pivot pour faire tourner ta camera autour du pivot !


Code : Tout sélectionner

; Fichiers Include 
IncludePath "..\Include\"
  IncludeFile "d3dx9.pbi"
  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(1024,768, 32,  1, 0)
  ; Charge une font
  *font = DM_LoadFont( "Arial",8 , 1)
  DM_SetColorText (*font, 198,198,198,255)
  ; Définit la couleur ambiante
  DM_AmbiantLight(150,  150,  150)


  
  *Sphere = DM_CreateSphere()
  *pivot = DM_CreatePivot()  
  
  *camera = DM_CreateCamera(*pivot)
  
    DM_TranslateEntity(*camera,0,5,-10)
    DM_CameraZoom(*camera,120)
    DM_PointEntity(*camera,*Sphere)
    
   
    
    
    
    
    ;Creation d'une grille  
    
    For u = -5 To 5
      *Line = DM_CreateLine(2)
      DM_LinePoint(*Line,u*2,0,-10,255,255,255)
      DM_LinePoint(*Line,u*2,0,10,255,255,255)
    Next
    
    For v = -5 To 5
      *Line = DM_CreateLine(2)
      DM_LinePoint(*Line,10,0,v*2,255,255,255)
      DM_LinePoint(*Line,-10,0,v*2,255,255,255)
    Next
    
    
    
    
    
    
  ; ---------------------------------------
  ;           Boucle principale
  ; ---------------------------------------
  ; si plein ecran, permet d'avoir la fleche
  ;change_curseur( #IDC_ARROW  )
  Repeat
    	ExamineKeyboard()
    	ExamineMouse() 
    	ShowCursor_(1)
  	If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
  	  Quit=1
  	EndIf

    DM_TurnEntity(*pivot,0,1/10,0)
    
    
  	; ---------------
  	;      Rendu
  	; ---------------
  	DM_BeginScene()
    	DM_RenderWorld()
  	  ; Affichage du texte
  	  DM_DrawText(*font, 10, 15, "FPS: "+Str(DM_FPS()))	  
      DM_EndScene()
      
      
      
      
  Until Quit=1

  DM_ClearGraphics()
  End


@++
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Super, merci :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 »

Excelent, le meme sans pivot, car dans ce cas la sphere suffit comme
réference parental pour la camera...

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(1024,768, 32,  0, 1)
 ; Définit la couleur ambiante
  DM_AmbiantLight(150,  150,  150)
  DM_CreateLight(3)

  *Sphere = DM_CreateSphere()
  *camera = DM_CreateCamera(*sphere)
     DM_TranslateEntity(*camera,0,5,-20)
   
  ;Creation d'une grille 
   For u = -5 To 5
      *Line = DM_CreateLine(2)
      DM_LinePoint(*Line,u*2,0,-10,255,255,255)
      DM_LinePoint(*Line,u*2,0,10,255,255,255)
    Next
   
    For v = -5 To 5
      *Line = DM_CreateLine(2)
      DM_LinePoint(*Line,10,0,v*2,255,255,255)
      DM_LinePoint(*Line,-10,0,v*2,255,255,255)
    Next
  
  ; ---------------------------------------
  ;           Boucle principale
  ; ---------------------------------------
  ; si plein ecran, permet d'avoir la fleche
  ;change_curseur( #IDC_ARROW  )
  Repeat
       ExamineKeyboard()
       ExamineMouse()
       ShowCursor_(1)
     If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
       Quit=1
     EndIf

    DM_TurnEntity(*sphere,0,1/10,0)
  
     ; ---------------
     ;      Rendu
     ; ---------------
     DM_BeginScene()
       DM_RenderWorld()
      DM_EndScene()
         
  Until Quit=1

  DM_ClearGraphics()
  End 
Force et sagesse...
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Je ne comprend pas ton exemple là :?
Si je fait tourner la sphere, la caméra tourne automatiquement avec ?? :?
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 »

Oui, essais. En fait, j'ai lié la camera directement a la Sphere, je ne passe
pas par un pivot comme Cpl.Bator. Tu peux lier les objets entre-eux sans
passer par des pivots.
Le pivot est une entité virtuelle qui sert surtout dans certains type de liens
entre entités, non situé au niveau du centre géométrique d'un objet .

donc DM_CreateCamera(*sphere) = camera asservie a la sphere
Force et sagesse...
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Ok merci, c'est cool :D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

tmyke a écrit :Pour le Break, c'est du tout bon, et pour la mise a jour, demain dans l'après midi
au plus tard...
:wink:
J'ai loupé l'annonce ou la mise à jour n'est pas encore sortie ?
Ceci dit prends ton temps, je ne veux pas télécharger dès que tu changes une ligne :)
Répondre