Particules et environnement 2D

Généralités sur la programmation 3D
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Particules et environnement 2D

Message par Dräc »

Voila : J’aimerai mélanger les torchons et les serviettes : sur un jeu 2D utiliser des effets 3D comme les particules.

Or l’ensemble est fait pour fonctionner à l’envers : dans un jeu 3D on peut faire de la 2D.
Il faut en effet appeler RenderWorld() avant tout autre affichage.

Aussi comment fait t’on pour mettre en fond de scène 3D mon affichage 2D iso sans passer par les textures (car limité à 256x256) ?
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

J'ai une théorie sur comment faire.

Si tu veux avoir un fond en 3D dans un jeu 2D :

1. Il faut faire la modélisation du fond de ton jeu en 3D. Tout les objets, les murs, les accessoires, etc.
2. Au lancement du jeu, la scène 3D doit être chargé, c'est à dire tout les objets, les murs, les accessoires, etc doivent être chargé et localiser sur la scène.
3. Localiser la caméra disons dans le premier octant genre au point (50,50,50) et dire à la caméra LookAt à l'origine du monde 3D, le point (0,0,0) Pendant le jeu la caméra ne doit pas bouger. On peut ajouter des lumières, bien sûr.
4. Dessiner sur l'écran les autres éléments 2D du jeu.
sans passer par les textures (car limité à 256x256)
Je ne comprends pas là. Moi j'ai déja chargé des textures 1024X1024 et ça marché. Bien sûr, ça dépend de la mémoire disponible sur la carte vidéo.

Une autre chose, il est dit dans l'aide que les textures doivent être carrées. Ce n'est pas totalement vrai, elles peuvent être rectangulaires.

16X16
32X32
64X64
128X128
256X256
...X...

Et n'importe quelle combinaison suivante :

16X32
16X64
16X128
16X256
16X...
32X64
32X128
...

Lucas Arts et Totally Games dans le jeu X-Wing Alliance par exemple, lorsque l'on défait le fichier d'un model 3D, on récupère la géométrie et les textures. Et elles ne sont pas toutes carrées.

!! ATTENTION !! CE N'EST PAS TOUT FAIT LÉGAL DE FAIRE DE DÉCOMPILER L'ARCHIVE D'UN MODEL 3D D'UN JEU COMMERCIAL.

Mais c'est comme ça que j'ai découvert que les textures rectangulaires étaient possibles. Dans certain cas, ça permet d'économiser de l'espace mémoire sur la carte.

J'espère que ça peut t'aider.

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

Message par comtois »

j'avais fait un essai en récupérant une animation 3D dans un sprite

un truc du genre

Code : Tout sélectionner

Affiche la 3D ici 
RenderWorld()
GrabSprite(0,x,y,w,h)
Et ensuite affiche la 2D
puis l'animation 3D dans le sprite 
DisplayTransparentSprite(0,x,y)
FlipBuffer()
Tu peux réduire la taille de la camera à la taille de ton sprite en jouant sur CreateCamera()

mais je ne suis pas sûr que ça rende bien avec des particules ,tu peux toujours essayer.
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.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Voilas un code avec Arriere plan en 2D, un couche 3D par dessus puis premier plan 2D (un beau melange)

Code : Tout sélectionner

InitEngine3D()
InitSprite()


OpenWindow(0, 0, 0, 640, 480, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "2D / 3D")
  OpenWindowedScreen(WindowID(), 0, 0, 640, 480, 0, 0, 0)
  
  CreateSprite(0, 1280, 480)
  StartDrawing(SpriteOutput(0))
    For t = 0 To 2000
      c = Random(245) + 10
      Circle(Random(1279), Random(479), Random(6) + 1, RGB(c, c, c))
    Next
  StopDrawing()
  
  CreateSprite(1, 1280, 480)
  StartDrawing(SpriteOutput(1))
    For t = 0 To 100
      Circle(Random(1279), Random(479), Random(16) + 8, Random(#White))
    Next
  StopDrawing()
  
  CreateTexture(0, 32, 32)
  StartDrawing(TextureOutput(0))
    For t = 1 To 16
      c = t * 16
      Circle(16, 16, 16 - t, RGB(c, c, c))
    Next
  StopDrawing()
  
  
  CreateMaterial(0, TextureID(0))
      DisableMaterialLighting(0, 1)
      MaterialBlendingMode   (0, 1)
    
  For x = -100 To 100 Step 20
    CreateParticleEmitter(n, 10, 1, 1, 0)
      ParticleMaterial    (n, MaterialID(0))
      ParticleTimeToLive  (n, 2, 2)
      ParticleEmissionRate(n, 20)
      ParticleSize        (n, 30, 30)
      ParticleColorRange  (n, Random(#White), Random(#White))
      ParticleEmitterLocate(n, x, 0, 0)
    n + 1
  Next
  
  CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0, 0, 200, 200)
    CameraLookAt(0, 0, 0, 0)
    CameraBackColor(0, -1)
  
  Repeat
  
    Repeat
    
      wEvent = WindowEvent()
      
      Select wEvent
        
        Case #WM_CLOSE
          Quit = #True
      
      EndSelect
      
    Until wEvent = #False
    
    ;- Arriere plan
    ClearScreen(0,0,64)
    
    x0 + 8
    If x0 > 1280
      x0 = 0
    EndIf
    
    ClipSprite(0, x0, 0, 640, 480)
    DisplayTransparentSprite(0, 0, 0)
    
    ClipSprite(0, 0, 0, x0 - 640, 480)
    DisplayTransparentSprite(0, 1280 - x0, 0)
    
    ;- 3D
    a.f + 0.02
    z.f = 300 * Cos(a)
    y.f = 300 * Sin(a)
    CameraLocate(0, y, y, z)
    CameraLookAt(0, 0, 0, 0)
    RenderWorld()
    
    ;- Premier plan
    x1 + 3
    If x1 > 1280
      x1 = 0
    EndIf
    
    ClipSprite(1, x1, 0, 640, 480)
    DisplayTransparentSprite(1, 0, 0)
    
    ClipSprite(1, 0, 0, x1 - 640, 480)
    DisplayTransparentSprite(1, 1280 - x1, 0)
    
    FlipBuffers()
    
  Until Quit = #True
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

sympa la démo :P

je devrais relire la doc plus souvent, ça m'avait échappé ce truc :?
CameraBackColor(#Camera, Couleur)
Description

Change la couleur de fond de la #Camera. Quand une nouvelle camera est créé, son fond est transparent pour permettre de mixer facilement un fond 2D avec une scene 3D. RGB() peut être utilisée pour obtenir une couleur valide. Si la couleur specifié est '-1', alors le fond est considéré comme transparent.
merci pour l'info :)
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.
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

On s’est mal compris…

Actuellement mon « jeu » est en 2Diso avec un décor fait de tiles.

Si je veux utiliser le moteur de particules, je suis obligé d’utiliser le moteur 3D et donc d’afficher une scène.

Afin que les particules s’affichent devant mon décor 2D, il faut intégrer le décor 2D dans la scène sur un plan situé derrière les particules.

Pour cela il faut un support compatible avec le moteur 3D pour dessiner mon decor 2D en arrière plan.
Typiquement il pourrait s’agir du terrain
J’y dessine dedans mon decor avec les tiles, la camera regardant la terrain selon la normale.

Cependant, pour cela il faut passer par les textures.
Or moi, j’ai des tiles de 32x32 et mon decor 2D est une composition variable de ces tiles

La Skybox apparaît très intéressante aussi: les faces du cubes sont à l’infini. Mais là encore on passe par les textures pour avoir un rendu.

Pour moi texture = une seul image.

Faut-il donc qu’à chaque boucle, je dessine mes tiles 2D sur une texture et non sur l’écran ?
Ainsi mes tiles ne devront plus etre des sprites mes des images !?

Quel est donc ma meilleure technique pour pouvoir afficher un décor 2D fait de tiles dans une scène 3D ?

@Polux : dans LJ, la traînée du réacteur du vaisseau sont certainement créées par des particules. Comment affiches tu alors l’arrière plan du jeu ?
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

@cederavic: je regarde cela et je te dis dans un instant...
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Merci bcp cederavic!
La réponse est effectivement dans l’instruction : CameraBackColor(0, -1), permettant de superposer le rendu 3D !!

Cool et Ouf!
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

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

Message par Backup »

@Cederavic : Excellent !! :D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

petite question

est-ce que le code de Cederavic tourne chez vous avec la beta 1.03 ?
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.
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

La beta de quoi ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

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.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

Nion elle ne tourne pas (j'ai du remetre l'autre version pour pondre ce code)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

merci , j'avais un doute :)
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.
Répondre