IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

[DX9][C#] Affichage cube avec vertex buffer


Sujet :

DirectX

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut [DX9][C#] Affichage cube avec vertex buffer
    Salut !!

    Voilà je cherche à contuire un mesh constitué de cube de manière par rapport à certains paramètres saisis en entré.

    J'ai fais un système d'offset qui permet de placer les cube à des coordonées différents pour par qu'ils soient tous supperposés les uns sur les autres.
    Mon problème c que je n'arrive pas à afficher mes cubes ?
    Comment et dans quoi faut-il les enregistrer ?
    Merci.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je n'ai pas très bien compris ton problème. Tu as mis au point le système de placement des cubes, mais tu n'arrives pas à les afficher ?

    En gros deux solutions :

    - Tu calcules les coordonnées de tous tes cubes et tu les places tous dans un gros vertex buffer qui ne bougera plus.

    - Tu calcules une matrice de transformation pour chaque instance de ton cube, mais tu affiches toujours la même géometrie (8 sommets dans ton vertex buffer).

    Par ailleurs, ton lien est cassé (les "..." sont présents dans l'URL).

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    Ok je pense voir à peu près comment faire.
    De toute manière je ne peux travailler que sur un seul vertexbuffer à la fois ?
    Je sais pas si il est possible de créer un vertexbuffer pour chaque cube ?
    Est-ce plus intéressant, ou dois-je plutot faire (comme tu le dis) avec une seul vertexbuffer ?
    Quel méthode sera la mieux optimisée ?

    Merci pour ton avis.

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    Bon j'ai toujours mon problème ...

    Après l'appel de la fonction qui me créer un cube, je fais un vertexbuffer.SetData(vert, 0, LockFlags.None); pour mettre à jour mon vertexbuffer.
    Le fait de faire ça après chaque création écrase t-il le contenu précédent ?
    Ne vais-je pas avoir au final que le dernier cube créer ?
    Comment faire pour tout créer et mettre à jour le vertexbuffer que quand tout a été créer ?

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    De toute manière je ne peux travailler que sur un seul vertexbuffer à la fois ?
    Pourquoi ?

    Je sais pas si il est possible de créer un vertexbuffer pour chaque cube ?
    Pourquoi pas ?

    Est-ce plus intéressant, ou dois-je plutot faire (comme tu le dis) avec une seul vertexbuffer ?
    Quel méthode sera la mieux optimisée ?
    Un tas de vertex buffers de 8 sommets chacun, c'est à peu près ce qu'on peut faire de pire. Utilise un seul buffer de 8 sommets, ou un seul de N sommets, mais un seul quoiqu'il arrive.

    Le fait de faire ça après chaque création écrase t-il le contenu précédent ?
    Je ne comprends pas ce que tu veux dire. Si tu effectues à chaque fois une nouvelle création, que voudrais-tu écraser ?

    Comment faire pour tout créer et mettre à jour le vertexbuffer que quand tout a été créer ?
    Commençons par le commencement : comment crées-tu ton cube ?

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    J'ai repris le code trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    private void OnVertexBufferCreate(object sender, EventArgs e)
    {
    	    CustomVertex[] verts = new CustomVertex[numVerts]; // 36 ici
     
    			//triangle 1
                verts[0] = CreateVertex(-100, -100, -100, 0, 0);
                verts[1] = CreateVertex(100, -100, -100, 1, 0);
                verts[2] = CreateVertex(-100, 100, -100, 0, 1);
     
    			//triangle 2
                verts[3] = CreateVertex(-100, 100, -100, 0, 1);
                verts[4] = CreateVertex(100, -100, -100, 1, 0);
                verts[5] = CreateVertex(100, 100, -100, 1, 1);
                ....
                ....
                verts[33] =  CreateVertex(-100, 100, 100, 0, 1);
    	    verts[34] =  CreateVertex(100, 100, -100, 1, 0);
    	    verts[35] =  CreateVertex(100, 100, 100, 1, 1);
     
    	    vertexBuffer.SetData(verts, 0, LockFlags.None);
     
    }

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    J'ai l'impression que je m'y prends très mal ...
    Ca fait pas longtemps que je suis sur directx aussi donc ... faut bien comrpendre comment ça fonctionne ...
    J'ai trouvé un ptit tuto qui à l'air bien

    http://pluralsight.com/wiki/default....exBuffers.html

    Est-ce que c un peu comme ça que je dois faire ?

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Oui, tu t'y prends mal.

    Pour l'instant commence avec la technique la plus simple : un seul vertex buffer contenant un seul cube.

    Crée un vertex buffer et remplit le avec un cube unitaire centré sur l'origine
    Pour chaque instance de ton cube que tu veux placer dans la scène, tu définis une matrice de transformation (translation, rotation, scale, ... -- une simple translation suffira pour le moment).
    Au début de ta fonction d'affichage, tu envoies une fois pour toute ton vertex buffer à DirectX
    Pour chaque instance de cube à afficher, envoie sa matrice à DirectX, puis affiche ton cube

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    Bon ok, là j'ai utilisé un vertexbuffer avec un indexbuffer pour afficher mon cube.
    (J'ai trouvé un tuto que j'ai suivis).
    Juste comme ça ,c'est possible sans indexbuffer d'afficher un cube avec 8 points (et pas 36) ?
    Là maintenant je dois affecter un matrice pour chaque cube créer puis l'envoyer à directx ?
    Je vois pas trop comment procéder ? Si tu as un exemple, je suis preneur.
    Je suis pas un cadeau désolé

    Merci.

  10. #10
    Membre éclairé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Par défaut
    Salut, je prends la conversation en route mais bon... voilà comment je crée un un cube dans un mesh... à la fin du traitement oublie pas de sauvegarder la variable "newMesh". Elle contient bien entendu la géometrie du cube.

    En espérant que ca t'aiderai

    #region Create Box
    public void CreateBoxMesh(float setDimensions)
    {
    Mesh newMesh = new Mesh(12, 8, MeshFlags.Managed, VertexFormats.Position, NXEngine.NX3DDevice);
    float Dimensions = setDimensions;

    newMesh.SetVertexBufferData(new CustomVertex.PositionOnly[]{
    new CustomVertex.PositionOnly(Dimensions,-Dimensions,Dimensions),
    new CustomVertex.PositionOnly(Dimensions,-Dimensions,-Dimensions),
    new CustomVertex.PositionOnly(-Dimensions,-Dimensions,-Dimensions),
    new CustomVertex.PositionOnly(-Dimensions,-Dimensions,Dimensions),
    new CustomVertex.PositionOnly(Dimensions,Dimensions,Dimensions),
    new CustomVertex.PositionOnly(Dimensions,Dimensions,-Dimensions),
    new CustomVertex.PositionOnly(-Dimensions,Dimensions,-Dimensions),
    new CustomVertex.PositionOnly(-Dimensions,-Dimensions,Dimensions)}, 0);

    newMesh.SetIndexBufferData(new short[]{
    0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4, 5, 1, 2, 2,
    6, 5, 0, 4, 3, 3, 4, 7, 6, 2, 3, 3, 7, 6, 4, 0,
    1, 1, 5, 4}, 0);
    }
    #endregion


    __________________________
    Mon blog

  11. #11
    Membre éclairé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Par défaut
    Citation Envoyé par lancer83
    Juste comme ça ,c'est possible sans indexbuffer d'afficher un cube avec 8 points (et pas 36) ?
    Je me suis jamais posé la question mais il me semble que non...

    Citation Envoyé par lancer83
    Là maintenant je dois affecter un matrice pour chaque cube créer puis l'envoyer à directx ?
    Ben la matrice tu la calcule avant de balancer ta géometry (avant le render). Je vois pas du tout l'intéret d'affecter une matrice à chaque cube. Quand tu passes dans ta boucle de rendu tu calcules ta World Matrix puis tu lance le rendu et ainsi de suite pour tous tes cubes.

    Citation Envoyé par lancer83
    Je vois pas trop comment procéder ? Si tu as un exemple, je suis preneur.
    Voir plus haut
    Pour le rendu grosso modo imaginons que tu es un tableau de mesh contenant tout tes cubes :

    - Fait une boucle sur ton tableau
    - Calcule la matrice World en fonction de la transformation du cube (Scale, Rotation, Position)
    - Tu balances la matrice dans le device
    - Tu lances le rendu de ton cube
    - et ainsi de suite...

    __________________________
    Mon blog

  12. #12
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    Vu que je débute, tout exemple m'est bénéfique !!
    Je te remercie, je pense voir à peu près comment réaliser ma chose (enfin j'espère ).
    Il faut juste que je comprenne bien comment marchent les matrices de transformations et ça devrait être bon
    Encore merci.

    Je reviendrai si je rencontre d'autre problèmes ...
    Je vais commence à creuser un peu ...
    Vite à ma pelle !!

  13. #13
    Membre éclairé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Par défaut
    Citation Envoyé par lancer83
    Il faut juste que je comprenne bien comment marchent les matrices de transformations
    Tu as 3 matrices : Projection, View et World

    La projection en général tu la calcules une fois. Elle va projeter ton mesh 3d sur ta fenêtre de rendu 2d... tu n'auras besoin de la mettre à jour seulement si tu changes la dimensions de ta fenêtre de rendu par exemple.

    La matrice view tu dois la calculer à chaque frame en fonction de ta caméra et de ses composantes.

    La matrice world c'est la matrice de transformation de ton mesh. Tu la calcule en appliquant les transformations spécifiques a ton mesh à savoir : son échelle (scale), sa rotation et sa position
    Par exemple :

    WorldMatrix = Matrix.Scaling(Scale) * Matrix.RotationX(Rotation.X) * Matrix.RotationY(Rotation.Y) *Matrix.RotationZ(Rotation.Z) * Matrix.Translation(Position);


    Ou scale, rotation et position sont les composantes de transformations de ton mesh.

    Une fois tes matrices calculées tu les appliques dans la structure "Transform" de ton device direct3d avant le rendu de ta scene.

    Voilà en espérant que cela t'éclairera sur les matrices.
    Si tu as d'autres questions hésite pas

    __________________________
    Mon blog

  14. #14
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    Oui c exactement ce qu'il me faut un tableau de mesh dans lequel sont stockés tous mes cubes avec leur position respective !!

    Mais j'ai encore un soucis pour changer la matrice de mes cubes.
    Je vois pas trop ou il faut le faire dans le code ??

    Si tu devait dessiner 2 cubes l'un à coté de l'autre, comment ferais-tu ?
    Par rapport aux bouts de codes que je t'ai mis, tu peux me dire ce qui n'est pas bon et ce qui faudrait ajouter dedans ?

    Pour l'instant en utilisant les fonctions ci-dessous je n'arrive pas à avoir 2 cube de taille différente sur l'affichage

    Fonction qui me créer un mesh que je sauvegarde dans un tableau de mesh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    public void creerEmplacementMesh(float l, float L, float prof)
            {
                mesh = new Mesh(12, 8, MeshFlags.Managed, VertexFormats.Position, DirectxManager.device3D);
                float longueur = l;
                float largeur = L;
                float profondeur = prof;
     
                // On attribut dans le Mesh les caractéristique du cube
                mesh.SetVertexBufferData(new CustomVertex.PositionOnly[]{
                new CustomVertex.PositionOnly(-longueur,-largeur,-profondeur),
                new CustomVertex.PositionOnly(longueur,-largeur,-profondeur),
                new CustomVertex.PositionOnly(-longueur,largeur,-profondeur),
                new CustomVertex.PositionOnly(longueur,largeur,-profondeur),
                new CustomVertex.PositionOnly(-longueur,-largeur,profondeur),
                new CustomVertex.PositionOnly(longueur,-largeur,profondeur),
                new CustomVertex.PositionOnly(-longueur,largeur,profondeur),
                new CustomVertex.PositionOnly(longueur,largeur,profondeur)}, 0);
     
                // Affectation des caractéristiques d'un emplacement.
                mesh.SetIndexBufferData(new short[]{0,3,1,0,2,3,0,1,4,1,5,4,0,4,2,2,4,6,
                                                    1,7,5,1,3,7,4,5,6,5,7,6,2,6,3,3,6,7}, 0);
     
     
                meshTab[NUMERO_EMPLACEMENT] = mesh; // save du mesh
                NUMERO_EMPLACEMENT++; // incrementation de l'indice du tableau
            }
    Fonction render() pour ma form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void Render()
    		{            
    			DirectxManager.Begin();
     
    			this.device = DirectxManager.Device;			
    			DirectxManager.Clear(Color.CadetBlue);            
                            plan.Render();              
                            SetupLights();		 
     
    			DirectxManager.End();			
    		}
    La fonction qui me sert à ajouter un objet (qui possede le mesh) dans un ArrayList "objets" : class Plan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void AjouterObject3D(Objet3D obj)
    {
    	objets.Add(obj);            
    }
     
    public void Render()
    {			
    	foreach (Objet3D obj in objets)
    	{
    		obj.Render();
    	}
    }

    Se charge au lancement du programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    private void Charger_F_Visualisation(object sender, System.EventArgs e)
    {
                // Initialisation
                DirectxManager.InitialiserDevice(fenetreDeVisualisation3D);	
    	    camera.Position = new Vector3(0, 0, -40.0f); // Zoom de la camera
    	    plan.Camera = camera;
                //plan.SupprimerContenuTableauObj(objet3D);   // On vide le tableau d'objets
     
                //objet3D.initialiserTableauMesh();   
    	    objet3D.creerObjet3D(10f,8f,6f); // Création du cube            
    	    plan.AjouterObject3D(objet3D);
     
                objet3D.creerObjet3D(10f, 10f, 7f);		// Création du cube
                plan.AjouterObject3D(objet3D);
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    public void Render()
    		{
                int indiceTabMesh;
    			// Si pas de modele3D
    			if (meshTab[0] == null)
    				return;		
     
     
    			Matrix world = Matrix.RotationYawPitchRoll(rotation.Y, rotation.X, rotation.Z);
    			world = world * Matrix.Translation(Position);
    			DirectxManager.device3D.Transform.World = world;
     
                #region Mode affichage
     
                // Sans texture (arrete seulement)
    			if (wireFrame)
    				DirectxManager.device3D.RenderState.FillMode = FillMode.WireFrame;
    			else
    				DirectxManager.device3D.RenderState.FillMode = FillMode.Solid;
     
    			// Avec texture
    			if (culling)
    				DirectxManager.device3D.RenderState.CullMode = Cull.CounterClockwise;
    			else
    				DirectxManager.device3D.RenderState.CullMode = Cull.None;
     
    			if (localTexture != null)
    				DirectxManager.device3D.SetTexture(0, localTexture);
     
                #endregion
     
                Material mat = new Material();
    			mat.Diffuse = color;
     
    			DirectxManager.device3D.Material = mat;
                //mesh[].DrawSubset(0);
     
                // MAUVAIS LA JE PENSE ??
                for (indiceTabMesh = 0; indiceTabMesh < NOMBRE_EMPLACEMENTS; indiceTabMesh++)
                {
                    meshTab[indiceTabMesh].DrawSubset(0);
                }
    }


    Il te reste un peu de temps à me consacrer ..
    MERCI !!

  15. #15
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    Ca y est j'ai réussis à afficher plusieurs cubes sur le meme écran!!
    Plus qu'a transformer une matrice différente pour chacun !!
    C'est trop cool !!

  16. #16
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    Si tu pouvais m'indiquer l'endroit où il faudrait modifier la matrice pour un mesh, se serait super cool !!

  17. #17
    Membre éclairé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Par défaut
    Calcule la matrice de ton mesh juste avant le "drawsubset"

    __________________________
    Mon blog

  18. #18
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    AAAAhh j'y suis presque !!
    Il reste un tout petit soucis ...
    Je n'arrive pas changer la matrice pour chacun de mes meshs.
    Je le fais pour tous ... et donc ils sont toujours supperposés ??
    ...

  19. #19
    Membre éclairé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Par défaut
    La matrice doit bien sur être unique pour chaque mesh sinon il est certain qu'ils seront tous identiques.
    Il faut bien entendu que chaque mesh posséde sa propre position, scale et sa propre rotation. Fait une classe pour stocker ces infos...

    __________________________
    Mon blog

  20. #20
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 113
    Par défaut
    Ca y est ça marche !!!
    J'ai suivis tes conseils et creuser un peu et ça l'a fait .Merci beaucoup.
    J'arrive à déplacer mes cubes correctement maintenant ...
    Un problème de camera se pose désormais ...
    Au préalable j'avais ma camera qui bougeait autour de mon objet (qui peux être composé de plusieurs cubes donc ..).
    Donc maintenant tout bouge alors que je voudrais au final mdofier l'angle de la camera par rapport à un point fixe du plan.
    Que faut-il changer ??

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. problème d'affichage d'un vertex buffer
    Par manimouleLight&Magic dans le forum OpenGL
    Réponses: 3
    Dernier message: 26/02/2008, 17h02
  2. Réponses: 3
    Dernier message: 11/04/2006, 09h37
  3. [Debutant] Affichage du contenu d'un vertex buffer
    Par Edouard Kaiser dans le forum DirectX
    Réponses: 12
    Dernier message: 20/12/2005, 10h26
  4. Cube avec 8 Vertex + textures
    Par mister3957 dans le forum DirectX
    Réponses: 2
    Dernier message: 23/11/2005, 23h31
  5. Probleme avec le vertex buffer
    Par nicoo dans le forum DirectX
    Réponses: 12
    Dernier message: 19/10/2004, 21h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo