Dreamotion3D

Généralités sur la programmation 3D
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Dräc a écrit :
djes a écrit : Pour ta première question, il y a DM_CameraProjRatio, dont le dernier paramètre permet de changer la perspective.
Ce dernier parametre permet de régler le fond du champ de la caméra, c'est à dire la plan jusqu'où la scène doit etre rendue...
Non je ne pense pas, dixit la doc : "Affecte des nouvelle valeur de calcul pour la matrice de projection d'une Entity camera, en fonction d'une largeur, hauteur et profondeur de champ"
Jouer avec la profondeur de champ, c'est jouer avec la perspective.
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

J’ai beau chercher, je n’ai pas trouvé le moyen de maitrise la taille de la fenetre de rendu 3D !

Je ne suis pas sur d’utiliser les bons termes, mais DM_CameraViewPort() permet de place et de redimensionner une vue de la scène dans la fenetre de rendu 3D.
Or, les dimensions de la fenêtre de rendu 3D semblent liées à celles de la fenêtre mère.

Si j’ai bien saisi, cela a lieu avec DM_InitGraphics :

Code : Tout sélectionner

DM_hwnd = OpenWindow()
res= DM_InitGraphics(DM_hwnd, Depth, Fullscreen ,sync) 
Dès lors, a chaque rendu de la scène, si la fenetre mère contient des gadgets, ils sont effacés.
Est-il possible d’envisager de fixer la taille de la fenetre de rendu 3D comme étant différente de celle de la fenetre mère?

Pour aller plus loin, peut-on imaginer pouvoir choisir une taille pour la fenêtre de rendu 3D et que la scène ne soit pas distordue lorsque l’on redimensionne la fenêtre mère?
Actuellement, on perd tout logiquement le ratio lors du dimensionnement de la fenêtre mère.

Autre question, se sert-on vraiment des variables DM_WIDTH et DM_HEIGHT ?
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

bah ce que tu demandes, c'est de faire l'équivalent de openwindowedscreen

Dri
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

C'est effectivement ce que j'ai écrit précédemment...
Dräc a écrit :Incruster la scène dans tout ou partie d’une fenêtre Windows (à l’image d’un OpenWindowedScreen() ), afin de pouvoir intégrer la scène dans un éditeur qui utilise les gadgets PB.
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 »

Je comprend beaucoup mieux ta démarche. En fait et dans l'état actuel des
choses, cela n'est pas possible. En modifiant certaines init en interne du moteur
cela sera surement possible...
Mais en attendant, n'est-il pas possible pour profiter des Gadget, d'ouvrir dans la
fenetre principale, une fenetre fille, interne, sans bord et de faire l'init de DM3D
au sein de cette fenetre (via le Handle) et donc de profiter du reste de la
fenetre mère pour les menu et autres Gadgerts ?
Force et sagesse...
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

Dräc a écrit :J’ai beau chercher, je n’ai pas trouvé le moyen de maitrise la taille de la fenetre de rendu 3D !
je sait pas si tu a vue mon code dans le lien que je t'ai envoyé mais l'astuce que j'ai trouvé c'est de metre le rendue de DM3D dans une fenetre fille et de metre les gadget dans la fenetre mere comme sa plus de problem

Edit : tmyke a été plus rapide :p

sinon apres pas mal de bidoulle j'ai pas mal avancé sur mon petit editeur et j'obtient quelque chose de plutot sympathique :Image
par contre la commande DM_HeightTerrain() et plutot lente l'orsque j'utilise de gros pinceau pour editer la hauteur (la taille max est 20x20 soit 400 hauteur a modifier).
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, la fonction 'DM_HeightTerrain()' est asser lente surtout sur les pinceau asser gros, car
on agit directement sur le vertexBuffer de chaque Quad, vertex par vertex, donc voila pourquoi...

Ton code sur ton éditeur sera--t-il en ligne un jour sinon ?
Force et sagesse...
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

entierement non mais je donnerai surement une version lite pour faire profiter tout le monde.
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

@tmyke: merci pour la réponse. La solution proposée n'est pas très éloignée du besoin
@cha0s: biensur que j'ai trouvé, merci ;) Tu as aussi du scintillement lorsque tu balades la fenetre devant la zone de rendu?
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

autre suggestion : utiliser le gadgetid d'un containergadget au lieu du windowid d'une fenetre
c'est pas possible ?

Dri
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

Dräc a écrit :@tmyke: merci pour la réponse. La solution proposée n'est pas très éloignée du besoin
@cha0s: biensur que j'ai trouvé, merci ;) Tu as aussi du scintillement lorsque tu balades la fenetre devant la zone de rendu?
j'ai eu ce problem en effet au final j'ai reintegré le rendue de la scène dans la boucle principal et suprimé le thread .

Dr. Dri a écrit :autre suggestion : utiliser le gadgetid d'un containergadget au lieu du windowid d'une fenetre
c'est pas possible ?
Dri
j'ai essayé avec un image gadget et a par le crash de l'apli j'ai rien obtenue d'autre ,je me suis bassé sur l'exemple de iricht.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Un ImageGadget doit contenir une image alors qu'un ContainerGadget peut contenir n'importe quel autre gadget ou fenetre !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

bah faut tester... en tout cas openwindowedscreen fonctionne dans un conainer

Code : Tout sélectionner

  If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf
  
  If OpenWindow(0, 0, 0, 260, 160, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(0))
      ButtonGadget(0, 200, 135, 45, 20, "Quit")
      ContainerGadget(1, 20, 0, 160, 160)
    EndIf
    If OpenWindowedScreen(GadgetID(1), 0, 0, 160, 160, 0, 0, 0)
      CreateSprite(0, 20, 20)
      If StartDrawing(SpriteOutput(0))
        Box(0, 0, 20, 20, RGB(255, 0, 155))
        Box(5, 5, 10, 10, RGB(155, 0, 255))
        StopDrawing()
      EndIf
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
      End
    EndIf
  EndIf

  direction = 2
  Repeat
    ; It's very important to process all the events remaining in the queue at each frame
    ;
    Repeat
      Event = WindowEvent()
      
      Select Event 
        Case #PB_Event_Gadget
          If EventGadget() = 0
            End
          EndIf
        
        Case #PB_Event_CloseWindow
          End 
      EndSelect
    Until Event = 0
  
    FlipBuffers() 
    ClearScreen(RGB(0, 0, 0))
    DisplaySprite(0, x, x)
    x + direction
    If x > 140 : direction = -2 : EndIf
    If x < 0   : direction =  2 : EndIf
    Delay(1)
  ForEver
Dri
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 »

Impect, et en extrapolant, le code suivant marche donc très bien apparement:

Code : Tout sélectionner

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


Global *mesh.CEntity
Global *camera.CEntity

If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
    End
  EndIf
 
  If OpenWindow(0, 0, 0, 260, 160, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(0))
      ButtonGadget(0, 200, 135, 45, 20, "Quit")
      ContainerGadget(1, 20, 0, 160, 160)
    EndIf
    If OpenWindowedScreen(GadgetID(1), 0, 0, 160, 160, 0, 0, 0)
      DM_hwnd = GadgetID(1)
      DM_InitGraphics(DM_hwnd, 32, 0 ,1)
 	  *DM_d3d9 	= 	DM_GetD3D9()
	   *DM_d3dDev9 = 	DM_GetDevice9()
      DM_WIDTH	=	160
      DM_HEIGHT	=	160
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
      End
    EndIf
  EndIf

  SetCurrentDirectory("media/")
  *mesh  = DM_LoadEntity("tiger.x")
  *camera   = DM_CreateCamera()
  DM_MoveEntity(*camera, 0,0,-100.0)

  Repeat
    ; It's very important to process all the events remaining in the queue at each frame
    ;
    Repeat
      Event = WindowEvent()
     
      Select Event
        Case #PB_Event_Gadget
          If EventGadget() = 0
            End
          EndIf
       
        Case #PB_Event_CloseWindow
          End
      EndSelect
    Until Event = 0
    
    DM_TurnEntity(*mesh,0,1,0)
  	DM_BeginScene()
    	DM_RenderWorld()
  	DM_EndScene()

  ForEver
  
 DM_ClearGraphics()
End
Force et sagesse...
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Il est vrai que tout étant "fenêtre" sous Windows, on peut certainement décliner les exemples à outrance.

C'est plutôt un bon point!
Un bémol cependant sur la méthode OpenWindowedScreen().
Cela n'a pas bcp d'interet à mes yeux car alors on crée un double Buffer dont on ne se servira pas.

Sinon, tmyke, je te vois initialiser DM_WIDTH et DM_HEIGHT dans les codes, mais servent-ils vraiment pas la suite. J'ai beau les faire varier, je ne vois aucun résultat sur le rendu?

Autre question: j'imagine qu'il est prévu de pouvoir imposer une image de fond.
Typiquement, toutes les présentations n'ont qu'un ciel uni.

Je suis un peu tordu, mais je suis interessé à superposer sur une vue 2D classique (Tilebased game) une vue 3D afin de bénéficier des performances d'un moteur 3D (bien comprendre alors que la camera peut avoir n’importe quelle orientation).
Je suis conscient que l'intérêt est limité et hybride, mais cette solution peut etre obtenue de 2 manières:

- Soit permettre la superposition du rendu 3D de DM sur n'importe quel fond. Cela implique la gestion de la transparence.
Dans ce cas, la méthode OpenWindowedScreen() précédente a un interet.

- Soit que DM autorise l'afficher de sprites (ou une image) positionnés en arriere plan et qui seraient statiques vis à vis de la scène.

La premiere méthode me semble là plus pertinente, du moment qu’il est possible d’imposer une couleur de transparence et un niveau d’opacité des entities… (c'est une des fonctionnalité offerte par la bibliothèque 3D de PB)
Répondre