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

XNA/Monogame Discussion :

Comment dessiner un cube autour d'un objet sélectionné


Sujet :

XNA/Monogame

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Comment dessiner un cube autour d'un objet sélectionné
    Bonjour,

    Je reviens pour une question peut etre un peu plus technique.

    Voilà, mon but serait de dessiner les arretes d'un cube autour d'un objet 3D lorsque celui-ci est sélectionné.
    Je ne sais pas si je suis très clair. En gros ça doit faire un peu comme dans beaucoup de jeu, une sorte de marqueur de sélection.
    Une petite image pour illustrer.


    J'arrive à gérer le clique de la souris afin de savoir quel objet est sélectionné mais je ne sais pas comment dessiner ces fameuses arrètes de cube autour...
    Et si en plus je peux choisir la couleur du cube... ça serait le top !

  2. #2
    Membre actif Avatar de Gulix
    Inscrit en
    Septembre 2005
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 268
    Points : 273
    Points
    273
    Par défaut
    J'ai pas de réponse toute faite, mais à mon avis, il faudrait voir du côté des BoundingBox. Elles devraient te permettre d'obtenir les données du cube à afficher.

    Après, pour l'affichage des arêtes, soit un modèle mis à l'échelle, ou de l'affichage de Vertex, ou autre.
    "L'univers... on croit qu'il est infini mais quand on arrive au bout un gorille géant vous balance des tonneaux."
    Phillip J. Fry

    http://www.gulix.fr/

    BlindShark, Logiciel de Blind Test - Pull N' Bounce - Jeu XNA

  3. #3
    Membre actif Avatar de ShadowTzu
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2005
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2005
    Messages : 243
    Points : 296
    Points
    296
    Par défaut
    Bonsoir,

    il te faut connaitre les valeurs Min et Max de la boundingbox de tes objets:
    (désolé c'est du vb.net+mdx :p)

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Compute_BoundingBox(ByVal myMesh As BaseMesh, ByRef vMin As Vector3, ByRef vMax As Vector3)
    Dim description As VertexBufferDescription = myMesh.VertexBuffer.Description
    Dim vertexData As Microsoft.DirectX.GraphicsStream = myMesh.VertexBuffer.Lock(0, 0, LockFlags.ReadOnly)
     
    Direct3D.Geometry.ComputeBoundingBox(vertexData, myMesh.NumberVertices, description.VertexFormat, vMin, vMax)
     
    myMesh.VertexBuffer.Unlock()
    End Sub


    Et ensuite de trouver les 8 coins pour le rendu, et de tracer des lignes:

    Code vb : 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
    Public Sub Render(ByVal Min As Vector3, ByVal Max As Vector3, ByVal Color As System.Drawing.Color)
    Dim indices As Integer() = New Integer() {0, 1, 1, 2, 2, 3, 3, 0, 0, 4, 1, 5, 2, 6, 3, 7, 4, 5, 5, 6, 6, 7, 7, 4}
    Dim vert(7) As Microsoft.DirectX.Direct3D.CustomVertex.PositionColored
    vert(0).Position = Min
    vert(1).Position = New Vector3(max.X, Min.Y, Min.Z)
    vert(2).Position = New Vector3(max.X, Min.Y, Max.Z)
    vert(3).Position = New Vector3(Min.X, Min.Y, Max.Z)
     
    vert(4).Position = New Vector3(Min.X, Max.Y, Min.Z)
    vert(5).Position = New Vector3(Max.X, Max.Y, Min.Z)
     
    vert(6).Position = New Vector3(Max.X, Max.Y, Max.Z)
    vert(7).Position = New Vector3(Min.X, Max.Y, Max.Z)
     
    For i As Integer = 0 To 7
    vert(i).Color = Color.ToArgb
    Next
     
    Device.Transform.World = MatriceDeTonObjet
    Device.VertexFormat = CustomVertex.PositionColored.Format
    '8 = vertexindices , 12 = primitivecount
    Device.DrawIndexedUserPrimitives(PrimitiveType.LineList, 0, 8, 12, indices, False, vert)
    End Sub

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonjour les gens,

    Désolé pour la réponse tardive, mais j'étais parti en vacances et tout (bref, tout le monde s'en fou...)

    Toujours est-il que vous m'avez bien aidé et que j'ai réussi à faire exactement ce que je voulais et j'ai découvert un certain nombre de fonctions bien utiles.

    Effectivement les boundingbox et boundingsphere permettent de réccupérer les données du cube et ensuite il reste juste à afficher le cube.
    Juste comme ça Gulix, je pense que dessiner le cube par des vertex est plus simple et peut etre moins gourmand (ça je ne sais pas trop) que par un modèle mis à l'échelle.

    En tout cas un grand merci à vous deux !

    Je met le sujet en résolu.

  5. #5
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Merci à toi d'être revenu donner ta solution !

  6. #6
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    effectivement merci ;p
    Bonne chance pour la suite
    Blog de mon jeu L2D : http://xna-discovery.blogspot.com/
    Un Left 4 Dead Like en 2D vue de dessus ;p

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Pour le fun, je vais même me permettre d'etre plus précis sur le comment j'ai fais. Des fois que ça servent à quelqu'un ou même qu'il y ai quelque chose d'encore mieux.

    En fait, a priori dans XNA tout objet 3D a automatiquement une boundingsphere de créée. En fait, c'est même tout mesh a une boundingsphere pile poil à sa taille.
    Pour la récupérer, c'est très simple, il suffit d'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BoundingSphere.CreateMerged(m_boundingSphere, mesh.BoundingSphere);
    Ensuite, s'il on veut afficher un cube, il faut avoir un cube dont les dimensions sont tout juste suffisantes pour contenir la boundingsphere.
    Ici on utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_boundingBox = BoundingBox.CreateFromSphere(m_boundingSphere);
    Puis, pour réccupérer les coordonnées des 8 sommets du cube :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BoxVertexPosition = m_boundingBox.GetCorners();
    Et dans BoxVertexPosition (qui est un tableau de vertex) vous avez toutes les coordonnées du cube afficher dans l'ordre suivant (pour reprendre l'exemple du début) :



    Voilà. Si ça vous aide, ça me fait plaisir et sinon... ça me fait quand même plaisir !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/03/2013, 15h28
  2. Réponses: 7
    Dernier message: 19/11/2012, 21h36
  3. Réponses: 11
    Dernier message: 08/08/2006, 23h11
  4. Dessiner un cadre autour des composants
    Par Pill_S dans le forum Composants
    Réponses: 5
    Dernier message: 03/07/2004, 14h08
  5. Comment cacher des propriétés dans un nouvel objet ?
    Par Pedro dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/10/2003, 18h53

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