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

OpenGL Discussion :

Obtenir les coordonné 2D de coordonné 3D


Sujet :

OpenGL

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Points : 239
    Points
    239
    Par défaut Obtenir les coordonné 2D de coordonné 3D
    Bonjours à tous


    Je travail actuellement sur une solution à fin d'obtenir les coordonné d'un carreau de la height map afficher, à partir de coordonné 2D de l'écran comme le pointeur de la sourie. Au départ, je me disais d'utiliser glPushName avec un indice différent pour chaque carreau. Seulement, je suis limité à 128 noms différent or ma height map peut avoir entre 2 500 et 2 147 483 648 carreaux ...

    Je rentre à peine en terminal S, et ne sait comment vérifié l'intersection entre un triangle et une droite dans l'espace. Le ray tracing m'est donc impossible.

    Je me disait donc de faire un algorithme par dichotomie, Seulement pour y arriver, je doit calculer des équations de droites de type a*x+b*y+c, pour chaque bord de chaque face que je vais tester (à savoir 4 étant donné que mes carreaux sont des couples de 2 triangles ayant 2 sommet en commun). ainsi, si le point à verifier en xy ce situe entres les 4 droite, je me trouve sur la bonne face.

    Seulement, pour obtenir ces équation de droite, j'aurai besoin de connaître les coordonner 2D sur l'écran de point 3D par ma matrice MODELVIEW qui rend la heightmap, en tenant compte de l'emplacement de camera.

    Quelqu'un aurai il une idée pour que je les obtiennes ?

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 896
    Points : 219 548
    Points
    219 548
    Billets dans le blog
    125
    Par défaut
    Bonjour,

    Ce que vous recherchiez ce ne serai pas gluProject ( ou gluUnproject ).
    Les matrices peuvent se récupéré par glDoublev(GL_MODELVIEW_MATRIX) et glDoublev(GL_PROJECTION)

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Points : 239
    Points
    239
    Par défaut
    Bonjours LittleWhite

    Et bien je me suis renseigné, mais le soucie est que j'utilise glTranslate lors de mon rendu. Or ce que je compte faire ce fait généralement à un click de sourie. Est il possible de remettre glTranslate et glRotate à 0 sur les 3 axes ?

    j'ai trouver cette discutions : http://www.developpez.net/forums/d76...nnees-fenetre/

    mais je ne comprend pas dans son exemple la façon dont il utilise ces fonctiions

    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
    Vf2 GCamera::convertToScreen(Vf3 point3D)
    {
    GLdouble model[16];
    GLdouble proj[16];
    GLint view[4];
    GLdouble res[3];
     
    glGetDoublev(GL_MODELVIEW_MATRIX, model);
    glGetDoublev(GL_PROJECTION_MATRIX, proj);
    glGetIntegerv(GL_VIEWPORT, view);
     
    gluProject( point2D.x, point2D.y, 0, model, proj, view, &res[0], &res[1], &res[2] );
     
    Vf2 result = Vf2( res[0], res[1] ); // apparemment, res[2] ne sert a rien
    return result;
     
    }
    Je voudrai avoir un exemple ce genre de fonction, mais non définie pour une classe de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int * convert3Dto2D (float x, float y, float z)
    qui me retournerait un tableau de 2 ligne avec les position en abscisse et ordonné à l'écran.

    parce que ce que met zeder59 dans çà réponse n'est vraiment pas clairs du tout. Je ne sais pas à quoi correspond "point2D" et savoir ou est passé le "point3D" ...

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 896
    Points : 219 548
    Points
    219 548
    Billets dans le blog
    125
    Par défaut
    zeder59 semble faire ce que tu veux. Par contre il utilise ses propres structures.

    Vf2 est un vecteur à 2 dimensions en float
    Vf3 c'est la même chose mais un vecteur de 3 dimension
    ( Du moins s'il a une notation logique ( ce que je pense )

    Ce que tu veux c'est ( conversion de la fonction de zeder59 ):
    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
     
    float * convert3Dto2D (float x, float y, float z)
    {
    GLdouble model[16];
    GLdouble proj[16];
    GLint view[4];
    GLdouble res[3];
    float* screenPos = (float*) malloc(sizeof(float)*2);
     
    // Faudrait verifier si le pointeur est correct != NULL
     
    // Recupère les différentes matrices utilisé par OpenGL pour transformer un point 3D ( dans le monde ) en pixel sur l'ecran
    glGetDoublev(GL_MODELVIEW_MATRIX, model);
    glGetDoublev(GL_PROJECTION_MATRIX, proj);
    glGetIntegerv(GL_VIEWPORT, view);
     
    // Fonction d'openGL ( voir la doc )
    gluProject( x, y, z, model, proj, view, &res[0], &res[1], &res[2] );
     
    // En fait gluProject renvoie trois coordonnées car la troisième ( z ) indique la distance du point entre le near et le far ( entre 0 et 1 )
    // Pour être plus précis faudrait en tenir compte
    screenPos[0] = res[0];
    screenPos[2] = res[1];
     
    // Le pointeur sera à désalloué plus tard :s ( pour cela qu'une structure c'est mieux :p )
    return screenPos;
     
    }
    Par contre ... pour le coup de la translation je ne sais plus trop.
    Je sais pas si tu as vraiment besoin d'en prendre compte, dans le cas ou tu protège tout bien avec des glPushMatrix() glPopMatrix().
    Mais j'en suis pas sur

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Points : 239
    Points
    239
    Par défaut
    C'est Génial LittleWhite !!!

    il est clair que je vais retourné une structure, mais c'était pour facilité la chose aux autre qui en aurai le même besoin. Les lecteurs n'aurons peut être pas le même structure que moi, (ce qui est fort probable). Donc dans un tableau, c'est universel pour tout les codes et peut être modifier comme chacun l'entend.

    Mais, juste dans l'exemple de zeder59 ... Ce qui est très bizarre, est le point3D en argument, mais ne rentre dans gluProject une structure instancié point2D peut être instancié dans çà classe. Donc sont argument point3D sert à rien et donc avoir quelque soucis je pense ... C'est ce qui me dérengai, mais là, ton Exemple est clair et net.

    Merci Beaucoup !

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 896
    Points : 219 548
    Points
    219 548
    Billets dans le blog
    125
    Par défaut
    Pour le coup de la structure, si elle a un nom explicite ( Point ; Vecteur2 ; ou encore Vf2 ), le lecteur comprendra vite.

    Sinon, pour le code de zeder59, j'ai le même problème que vous, et je ne comprend pas ou passe point3D ...

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Points : 239
    Points
    239
    Par défaut
    Nous sommes donc bel et bien d'acore sur la variable point3D ... A mon avi, il doit avoir des souci là dessus sans qu'il ne sent rend compte.

    Pour ma part, je viens de finir mon algorithme de détection de face de terrain comme voulu par un système dichotomique relativement performant. Il s'appuie sur votre exemple de fonction évolue en une class, à fin de ne se procuré les matrices plus d'une fois. Si non, çà l'appellerait 4 x la distance relative entre la face du milieu et celle selectionnée. Comment dire ... pas très optimisé !

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

Discussions similaires

  1. [Java3D]Obtenir les coordonnés de la caméra
    Par surfeurman5 dans le forum 3D
    Réponses: 3
    Dernier message: 31/03/2008, 15h35
  2. Obtenir les coordonnées d'un curseur (RichEdit)
    Par Galip dans le forum C++Builder
    Réponses: 17
    Dernier message: 07/06/2007, 15h47
  3. Obtenir les coordonnées d'un element
    Par joKED dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/05/2007, 12h30
  4. Obtenir les coordonnées d'un tableau
    Par Etanne dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 14/12/2005, 09h14
  5. Obtenir les coordonnées réelles
    Par chep dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/04/2005, 12h05

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