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 :

[VB.NET] [newbie] Charger plusieurs .X et les déplacer


Sujet :

DirectX

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut [VB.NET] [newbie] Charger plusieurs .X et les déplacer
    Bonjour,

    je suis très très n00b en directX mais pas du tout en vb.net
    j'ai utilisé le tutorial 6 du sdk 9 summer 2003 (le dernier à ma connaissance avec des exemples en vb.net), qui permet simplement de charger un .x qui tourne automatiquement.

    Lorsque le mesh s'affiche, il s'affiche a 0, 0, 0 ce qui est très bien ! J'aimerais maintenant afficher plusieurs mesh (plusieurs .x) les uns à cotés des autres. J'ai beau essayer de retourner le code dans tous les sens je ne trouve pas d'endroit où il serait ecrit device.poseMonMesh(mesh1) par exemple (en simplifié of course). Voici mon code du Render()

    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
                'Clear the backbuffer to a white color 
                device.Clear(ClearFlags.Target Or ClearFlags.ZBuffer, System.Drawing.Color.White, 1.0F, 0)
                'Begin the scene
                device.BeginScene()
                ' Setup the world, view, and projection matrices
                SetupMatrices()
     
                ' Meshes are divided into subsets, one for each material. Render them in
                ' a loop
                Dim i As Integer
                For i = 0 To meshMaterials.Length - 1
                    ' Set the material and texture for this subset
                    device.Material = meshMaterials(i)
                    device.SetTexture(0, meshTextures(i))
     
                    ' Draw the mesh subset
                    mesh.DrawSubset(i)
                Next i
     
                'End the scene
                device.EndScene()
                device.Present()
    J'en déduis donc qu'on ne pose pas un mesh, mais les materials du mesh. Mais comment en poser plusieurs, à différentes positions ?


    Pour ma deuxième question, j'aimerais savoir comment "tweaker" mes valeurs ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                device.Transform.View = Matrix.LookAtLH(New Vector3(0.0F, 0.0F, iZoom), New Vector3(0.0F, 50.0F, 0.0F), New Vector3(0.0F, 1.0F, 0.0F))
     
                device.Transform.Projection = Matrix.PerspectiveFovLH(CSng(Math.PI / 4), 1.0F, 0.1F, 1000.0F)
    afin de faire déplacer avec le click droit, tourner avec le click gauche, etc... (j'ai déjà implémenté le zoom avec la roulette (valeur iZoom)

    C'est pour un projet de fin d'année d'examen, c'est très important pour moi !
    Merci beaucoup !

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Salut

    1/ En effet il ne faut pas chercher un PoseMonMesh(ici), il suffit d'envoyer à Dx une matrice world de translation différente avant chaque rendu de mesh.

    En gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BeginScene
     
    Pour i = 0 à NbMeshes
        Device.Transform.world = Matrix.Translate(i  * 10, 0, 0)
        AfficheMesh
    Fin pour
     
    EndScene()
    2/ Tu peux faire ce que tu cherches en bidouillant les valeurs et avec un peu de trigo, mais le plus simple serait encore d'utiliser la matrice View avec des translations et des rotations.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    OK, je comprends maintenant comment les poser à un certain endroit. mais... que contiendrait ton afficheMesh ?? En fait ma première question (me suis mal exprimé), c'est comment met-on des mesh dans dx ?? Je sais que c'est une base, mais ca me prend la tete depuis des jours... Je ne comprends pas où exactement on dit "pose le mesh"...

    Qu'est-ce que cela signifie ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' Draw the mesh subset 
                    mesh.DrawSubset(i)
    Est-ce ça qui pose le mesh ?

    Rohhlala... tout ca me parait tellement compliqué c'est horrible !
    Je vois des centaines d'exemples qui font tous la même chose, mais avec du code à chaque fois différent...

    Merci !

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Oui, ce qui affiche ("pose" me semble mal choisi ici) ta mesh, c'est bien les mesh.DrawSubset(i).

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    ok je comprends mieux maintenant (enfin pas à 100% parce que mon mesh est un ... triangle en 3d (enfin comme une pyramide mais le sommet n'est pas pointu), et qu'au pas-a-pas, j'ai 2 "materials", que je défini à mon device avant de faire le drawsubset... d'ou viennent ces 2 materials ?

    j'ai essayé le code que tu m'as donné juste avant. Mon mesh.drawSubset est donc appelé 2 fois pour cet objet, je l'ai donc appelé 5 fois 2 fois, en insérant dans ma boucle la translation du world. résultat : mon objet 3D ne bouge plus (il n'y a plus la rotation qui s'effectuait dans la boucle grace à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    device.Transform.World = Matrix.RotationX((Environment.TickCount / 1000.0F))
    )

    Je suis un peu beaucoup largué, et... j'ai l'impression de jamais y arriver... pourtant mon patron veut ce truc absolument, mais je suis en train d'y passer des heures et ... quelqu'un a une corde s'il vous plait ??

    Merci pour la réponse...

    PS: pour les mouvements à la souris je vais essayer incéssament sous peu... merci !

  6. #6
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    ok je comprends mieux maintenant (enfin pas à 100% parce que mon mesh est un ... triangle en 3d (enfin comme une pyramide mais le sommet n'est pas pointu), et qu'au pas-a-pas, j'ai 2 "materials", que je défini à mon device avant de faire le drawsubset... d'ou viennent ces 2 materials ?
    Comme tu l'avais peut-être compris, les différents subsets qui composent un mesh ont tous une texture ou un material différent, ce qui fait qu'ils ne peuvent être rendus tous en une seule fois. Si tu as deux subsets, c'est donc probablement que ta mesh utilise deux materials ou deux textures différents.

    j'ai essayé le code que tu m'as donné juste avant. Mon mesh.drawSubset est donc appelé 2 fois pour cet objet, je l'ai donc appelé 5 fois 2 fois, en insérant dans ma boucle la translation du world. résultat : mon objet 3D ne bouge plus (il n'y a plus la rotation qui s'effectuait dans la boucle
    Tu peux donner le code complet de la boucle ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    OK J'ai tout pigé et tout réussi... il suffisait en effet de poser des subsets, puis de tourner le monde, poser des subsets, etc... j'avais du mal à m'imaginer des mesh en subsets en fait...

    J'ai réussi à "coloriser" mes mesh en leur affectant une texture d'un bitmap de 16x16 rempli d'une couleur définie. Mais j'aimerais savoir si il est possible de le coloriser sans passer par cette texture ? De plus, j'aimerai mettre un "bord" autour de chacun de mes mesh, mais n'ai aucune idée de comment faire ?? J'ai cherché longtemps mais je n'arrive pas à trouver...

    Merci beaucoup !

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour coloriser tes meshs avec une couleur unie, il suffit d'attribuer cette couleur directement aux vertices. Si le format des vertices de ta mesh ne contient pas de couleur il faudra l'ajouter.

    Pour ce qui est du bord, c'est moins évident. Avec DirectX ce n'est pas faisable directement, recherche "outlining" sur Google.

  9. #9
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    OK j'ai réussi à les coloriser. Je sais que j'exagère, mais j'ai de nouveau un problème...

    J'ai essayé de poser un bête cube de 250x1x250 (un sol en fait ), et d'appliquer une texture dessus... J'y suis arrivé après des milliers d'essais, mais le problème est que la texture est pas "stretchée" sur le cube, mais elle apparait des milliers de fois...

    J'ai trouvé ce code sur un forum...

    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
    Private Function CreateTexturedBox(ByVal device As Direct3D.Device, ByVal width As Single, ByVal height As Single, ByVal depth As Single) As Direct3D.Mesh
            Dim adjacency As GraphicsStream
     
            Dim box As Mesh = Mesh.Box(device, width, height, depth, adjacency)
            Dim texturedBox As Mesh = New Mesh(box.NumberFaces, box.NumberVertices, MeshFlags.Managed, CustomVertex.PositionNormalTextured.Format, device)
     
            ' Get the original mesh's vertex buffer.
            Dim ranks(0) As Integer
            ranks(0) = box.NumberVertices
            Dim arr As System.Array = box.VertexBuffer.Lock(0, (New CustomVertex.PositionNormal).GetType(), LockFlags.None, ranks)
     
            ' Set the vertex buffer
            Dim data As System.Array = texturedBox.VertexBuffer.Lock(0, (New CustomVertex.PositionNormalTextured).GetType(), LockFlags.None, ranks)
     
            Dim i As Integer
            For i = 0 To arr.Length - 1
                Dim pn As Direct3D.CustomVertex.PositionNormal = arr.GetValue(i)
                Dim pnt As Direct3D.CustomVertex.PositionNormalTextured = data.GetValue(i)
                pnt.X = pn.X
                pnt.Y = pn.Y
                pnt.Z = pn.Z
                pnt.Nx = pn.Nx
                pnt.Ny = pn.Ny
                pnt.Nz = pn.Nz
                pnt.Tu = pnt.X + width / 2
                pnt.Tv = 1.0F - pnt.Y + height / 2
     
                data.SetValue(pnt, i)
            Next
     
            texturedBox.VertexBuffer.Unlock()
            box.VertexBuffer.Unlock()
     
            ' Set the index buffer. 
            ranks(0) = box.NumberFaces * 3
            arr = box.LockIndexBuffer((New Short).GetType(), LockFlags.None, ranks)
            texturedBox.IndexBuffer.SetData(arr, 0, LockFlags.None)
     
            Return texturedBox
        End Function
    Il marche, mais... c'est pas à l'echelle, et je trouve nulle part de facteur de scale (genre SU et SV c ca ??)

    Merci de m'aider encore une fois... Pour le outlining c ultra-hard, mais je pense que je vais espacer mes petits meshs pour voir la différence

    Merci !

  10. #10
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ton sol est composé de plusieurs triangles, ou ce n'est qu'un gros quad ?

  11. #11
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    euhhh.... j'ai un quad dans mon garage... mais po d'triangle...

    nan sans dec', je sais po du tout. mon sol est créé à partir d'un mesh.box(250,1,250) (il a donc une largeur et longueur de 250, et une épaisseur de 1)

    Après qu'il soit en triangle ou en quad ??? J'en sais rien !

  12. #12
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    J'ai abandonné le sol car finalement je vais simplement poser du texte dessus... mais merci tout de même...

  13. #13
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Roh, juste une autre petite question j'ai oublié...

    Pour info, ma 3D est dans un PictureBox, qui est lui-même dans un SplitContainer... Lorsque je minimize ma fenêtre, et que je la restaure, tout joue... par contre, lorsque je resize ma fenêtre, tous les objets 3D deviennent noirs, comme si toutes les lumières avaient disparu, ou comme si il n'appliquait plus la couleur sur les mesh... dans le tutorial 6 du SDK summer 2003, cela n'arrive pas (et pourtant j'ai le même code que cet exemple dans mon render !)

    Si quelqu'un a une petite idée.... merci d'avance !

Discussions similaires

  1. VB.NET Access 2010 Charger plusieurs tables
    Par nadong dans le forum ADO.NET
    Réponses: 2
    Dernier message: 17/02/2014, 08h56
  2. [VB.NET] charger un label avec les donnees d'une bd
    Par paleronel dans le forum Accès aux données
    Réponses: 1
    Dernier message: 17/04/2007, 10h50
  3. Réponses: 5
    Dernier message: 05/10/2004, 13h05
  4. Réponses: 4
    Dernier message: 11/09/2004, 16h38
  5. Réponses: 8
    Dernier message: 06/07/2004, 14h17

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