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 :

[C++ DX9] Plusieurs problêmes (rendu de point et picking)


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 37
    Par défaut [C++ DX9] Plusieurs problêmes (rendu de point et picking)
    Bonjour à tous,

    je fais appel à vous car j'ai plusieurs problêmes avec DX que je ne sais pas résoudre (je débute en DirectX et je suis un peu perdu dans la doc).
    Je vous explique en quelques mots les fonctionnalités de mon programme:
    Il permet de charger une image, d'y ajouter dessus des points (en forme de croix et de cercle) et de pouvoir par la suite selectionner les points pour les déplacer (le picking).
    Tout ça c'est beau, mais quand ça marche, c'est mieux!!!!
    Voici mes différents problèmes:
    - Lorsque je veux ajouter des points en forme de croix, je crée 2 lignes de type LPD3DXLINE représentant une croix. Le problèmes est que plus j'ajoute de points et plus l'affichage est long et saccadé jusqu'au moment ou le programme plante (aprés l'ajout d'une vingtaine de points). Je ne sais pas du tout d'où ça vient. Voici le code de création des croix :
    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
     
    // si la ligne n'existe pas, on la crée
            if(!lineMem)
              D3DXCreateLine(device, &lineMem);
     
            D3DXVECTOR3 line1[2];   //tableaux contenant les coordonnées de début et fin des lignes
            D3DXVECTOR3 line2[2];
     
            lineMem->SetWidth(1.01f);  // pb d'affichage quand width=1.0
            line1[0]=D3DXVECTOR3(xyzMem.x+VERTEX_OFFSET, xyzMem.y+VERTEX_OFFSET, xyzMem.z + VERTEX_OFFSET);
            line1[1]=D3DXVECTOR3(xyzMem.x-VERTEX_OFFSET, xyzMem.y-VERTEX_OFFSET, xyzMem.z + VERTEX_OFFSET);
            line2[0]=D3DXVECTOR3(xyzMem.x-VERTEX_OFFSET, xyzMem.y+VERTEX_OFFSET, xyzMem.z + VERTEX_OFFSET);
            line2[1]=D3DXVECTOR3(xyzMem.x+VERTEX_OFFSET, xyzMem.y-VERTEX_OFFSET, xyzMem.z + VERTEX_OFFSET);
     
            lineMem->Begin();
            lineMem->DrawTransform(line1, 2, &matTransform, color);
            lineMem->DrawTransform(line2, 2, &matTransform, color);
            lineMem->End();
    -Mon autre problême est de faire le picking, je ne sais pas comment faire pour récupéré mes croix. J'ai vu sur plusieurs site qu'il fallait utilisé les Mesh.
    Est-il possible de créé un mesh uniquement composé de 2 lignes? Que me conseillez vous?


    Merci beaucoup pour votre aide.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    Le problèmes est que plus j'ajoute de points et plus l'affichage est long et saccadé jusqu'au moment ou le programme plante (aprés l'ajout d'une vingtaine de points). Je ne sais pas du tout d'où ça vient.
    Fuite de mémoire?
    Tu peux déjà faire faire ce que dit la FAQ.

    Mon autre problême est de faire le picking, je ne sais pas comment faire pour récupéré mes croix. J'ai vu sur plusieurs site qu'il fallait utilisé les Mesh.
    Oui en effet, tu peux. Mais je ne crois pas que l'on puisse utiliser des lignes avec les meshs...

    Personnellement, j'utiliserais des textures de croix et de cercles que j'afficherais dans un carré et je réaliserais moi-même le picking (surtout que d'après ce que j'ai compris tu fais de la 2D. c'est alors très simple).

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 37
    Par défaut
    Citation Envoyé par Albenejean
    Personnellement, j'utiliserais des textures de croix et de cercles que j'afficherais dans un carré et je réaliserais moi-même le picking (surtout que d'après ce que j'ai compris tu fais de la 2D. c'est alors très simple).
    Dans ce cas le carré contenant la texture est un mesh?
    Faut-il obligatoire des objets de type mesh pour faire le picking? Car dans tout les exemples de picking que j'ai vu ils utilisent ce type d'objet.
    Peut-on "nommé" les objets à la manière d'OpenGL?

    Citation Envoyé par Albenejean
    Fuite de mémoire?
    Tu peux déjà faire faire ce que dit la FAQ.
    J'ai essayé d'utiliser le deboggeur, j'ai pas tout compris . L'erreur renvoyé par le déboggeur est : BeginScene, already in scene. BeginScene Failed.
    Je ne comprend pas bien, je ne fais qu'un appel à BeginScene avant d'afficher mes croix. Je suis un peu perdu...

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    J'ai essayé d'utiliser le deboggeur, j'ai pas tout compris . L'erreur renvoyé par le déboggeur est : BeginScene, already in scene. BeginScene Failed.
    Je ne comprend pas bien, je ne fais qu'un appel à BeginScene avant d'afficher mes croix. Je suis un peu perdu...
    As tu bien un EndScene ?

    Sinon pour le reste:
    Dans ce cas le carré contenant la texture est un mesh?
    Oui si tu veux. Personnellement je n'aime pas les mesh, mais c'est a un avis personnel.

    Faut-il obligatoire des objets de type mesh pour faire le picking?
    Qu'est ce que le picking et comment ça marche?
    Le picking consiste à lancer un rayon qui par de l'observateur et passe par le pixel cliqué. Puis de vérifier s'il touche un objet. Pour celà, on fait passer le rayon de l'espace de l'écran à l'espace objet. Selon tes matrices, cette étape est plus ou moins compliqué (au pire la fonction D3DXVec3Unproject(...) peut t'aider). Dans le cas de la 2D, c'est quasi-immédiat. Pour quelque chose de simple et un peu plus complet, voir ici.
    A noter que la fonction D3DXIntersectTri peut aussi t'aider.

    Donc en gros le picking n'a rien à voir avec les mesh. La fonction fournie par DirectX est là pour te **simplifier** (...) le travail.

  5. #5
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 37
    Par défaut
    Ok, merci pour les infos.

    Donc ce que j'ai compris du picking c'est :
    -Il faut que je récupère les coordonnées 3D de l'espace à partir des coordonnées 2D de la souris sur l'ecran (puisque je travail en 2D).
    -Ensuite il faut tester pour chaque objet visible de ma scène si il y a une intersection avec un rayon défini précédemment (D3DXIntersectTri etc...).

    Si c'est bien ça, il faut que je stock tout mes objets quelque part pour pouvoir y accéder ensuite.

    N'y a t-il pas de méthode similaire à celle du "picking par nom" d' OpenGL?
    C'est à dire de nommer les objets lorsqu'ils sont créé (comme glPushName ou glLoadName), ce qui permet de récupérer trés facilement les objets.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    Donc ce que j'ai compris du picking c'est :
    -Il faut que je récupère les coordonnées 3D de l'espace à partir des coordonnées 2D de la souris sur l'ecran (puisque je travail en 2D).
    -Ensuite il faut tester pour chaque objet visible de ma scène si il y a une intersection avec un rayon défini précédemment (D3DXIntersectTri etc...).
    Exactement.
    A noter que si tu travailles en 2D, tu peux utiliser des coordonnées transformées xyzrhw dans tes vertexbuffer, ce qui te facilitera le travail. En effet ces coordonnées ne subissent aucune transformation (ainsi un carré définit par les points (0,0,1,1) (10,0,1,1) (0,10,1,1) (10,10,1,1) apparaitra sur ton écran aux coordonnées (0,0) (10,0) (0,10) (10,10)). Le passage des coordonnées écran aux coordonnées de ton object est donc trivial.

    Si c'est bien ça, il faut que je stock tout mes objets quelque part pour pouvoir y accéder ensuite.
    En effet.

    N'y a t-il pas de méthode similaire à celle du "picking par nom" d' OpenGL?
    C'est à dire de nommer les objets lorsqu'ils sont créé (comme glPushName ou glLoadName), ce qui permet de récupérer trés facilement les objets.
    Pas à ma connaissance. Mais bon, ce n'est pas très compliqué de créer une structure appropriée...

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

Discussions similaires

  1. [DX9][C#] Problème couleur faces et arretes d'un cube
    Par lancer83 dans le forum DirectX
    Réponses: 3
    Dernier message: 07/07/2006, 17h59
  2. Mon Outil de gestion (plusieurs problèmes)
    Par Makaveli33 dans le forum Access
    Réponses: 10
    Dernier message: 11/05/2006, 21h42
  3. problème avec les point sprites
    Par conrad dans le forum DirectX
    Réponses: 2
    Dernier message: 14/07/2005, 18h44
  4. [Jointure réflexive] problème en notation pointée
    Par Kraz dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/01/2005, 13h30
  5. [DX9] [Debutant] Problème de transparence :(
    Par SekYo dans le forum DirectX
    Réponses: 5
    Dernier message: 10/09/2004, 14h19

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