Partage
  • Partager sur Facebook
  • Partager sur Twitter

OPENGL : Projeter la souri sur un plan! TUTO

    31 octobre 2008 à 21:26:58

    Vous voulez déplacer des objets sur une surface?! ou diriger vos troupes dans un jeu RTS?! ou même faire des menus en 3D?! la projection de la souris sur un plan est obligatoire dans ces situations!


    MAIS COMMENT PROJETER LA SOURIS SUR PLAN?? AHH!!! :'(:'(???!!!!1111111

    Voila dans quel état j'étais hier!
    Heureusement j'ai fini par trouver! Et je vais vous expliquer comment j'ai fait!
    ( je posterai même un petit exécutable à la fin du tutoriel pour vous montrer le résultat) j'espère que ça va aider quelques-uns!)



    D'abord on utilise gluUnProject!
    on lui passe les arguments dont elle a besoin, c'est a dire la matrice MODELVIEW, la matrice de PROJECTION, le VIEWPORT, les coordonnées de ma souris(SOURI.X)et (HAUTEUR_ECRAN - SOURI.Y)

    ici on prend (HAUTEUR_ECRAN - SOURI.Y) car sinon on aurait les coordonnées en "y" inversées! ( le 0,0 d'OPENGL etant different du 0,0 de l'écran )


    GLdouble Bx,By,Bz;
        GLdouble Mx,My, Mz,t;
        GLint viewport[4];
        GLdouble mvmatrix[16], projmatrix[16];
        glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix );
        glGetDoublev(GL_PROJECTION_MATRIX,projmatrix );
        glGetIntegerv(GL_VIEWPORT,viewport );
        gluUnProject(SOURI.X,480-SOURI.Y,0, mvmatrix, projmatrix,viewport,&Bx,&By,&Bz ); // ici SOURI.X et SOURI.Y sont les coordonnées de ma souris capturées avec SDL
    


    on obtient les coordonnées du point B(Bx,By,Bz):
    Image utilisateur

    B étant le projeté de ma souris, sur le plan qui fait face a la camera (plan de l'écran)

    mais ce n'est pas encore ce qu'on veut! on cherche le projeté de la souris sur un plan!!

    Il suffit pour cela, de trouver l'équation de la droite passant par AB et de calculer l'intersection de cette droite avec le plan qu'on VEUT!

    Calcul de l'équation de droite passant par AB :

    soit  les points : A(Ax,Ay,Az) (position de ma caméra)
                       B(Bx,By,Bz) (obtenu avec glUnproject)
    AB ((Bx-Ax),(By-Ay),(Bz-Az))


    soit un point M de coordonnée M(Mx,My,Mz)
    le point M est un point de la droite passant par les points A et B.
    AM = t * AB   // AM est colinéaire a AB et "t" étant un réel quelconque 
    
    
    | Mx-Ax |        | Bx-Ax | 
    | My-Ay | = t*   | By-Ay | 
    | Mz-Az |        | Bz-Az | 
    
    
    
    on en déduit :
    
    Mx=  t *(Bx-Ax) + Ax 
    My=  t *(By-Ay) + Ay 
    Mz=  t *(Bz-Az) + Az


    Maintenant on veut que ce point M soit le point d'intersection de la droite passant par AB avec le plan XY
    donc il faut que je calcule le coefficient t pour que mon M soit sur mon plan XY !

    Image utilisateur


    l'équation de mon plan XY est : Z=0 si vous voulez projeter votre souris sur un autre plan, il suffira de déterminer l'équation du plan, ensuite de déduire t


    pour que mon point M soit sur mon plan il faut que sa coordonnées en z soit nulle, sachant cela je peux calculer le coefficient t avec l'expression :

    Mz =  t *(Bz-Az) + Az = 0
    
    d'ou
    
    t = -Az/(Bz-Az)
    
    on remplace alors t dans les expressions de Mx et My
    et on obtient le point d'intersection de la droite AB avec le plan XY



    code final :
    GLdouble Bx,By,Bz;
        GLdouble Mx,My, Mz,t;
        GLintviewport[4];
        GLdoublemvmatrix[16], projmatrix[16];
        glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix);
        glGetDoublev(GL_PROJECTION_MATRIX,projmatrix);
        glGetIntegerv(GL_VIEWPORT,viewport);
        gluUnProject( SOURI.X,480-SOURI.Y,0,mvmatrix,projmatrix,viewport,&Bx,&By,&Bz); // ici SOURI.X et SOURI.Y sont les coordonnées de ma souri capturées avec SDL
    
        t  =  -Az /(Bz-Az); // on calcule t en fonction de la position de la camera(Az) et de (Bz)
        Mx = t *(Bx-Ax)+ Ax; //on calcule les positions de M  avec t
        My = t *(By-Ay)+ Ay ;
        Mz = 0;
    



    maintenant mon POINT M est le point d'intersection de ma droite AB avec le plan XY!!!
    et donc je n'ai plus qu'a donner les coordonnées (Mx,My,Mz) à mon objet et il sera exactement sous ma souris!! et se deplacera sur le plan XY!!


    voila vous trouverez ici le resultat : (nouvel exemple j'ai corrigé les problemes de detection de souri)
    http://dl.free.fr/q879t2oWq
    (vous pouvez bouger avec les flèches zoomer avec la molette :) et changer l'angle de vue en restant clické)

    • Partager sur Facebook
    • Partager sur Twitter

    OPENGL : Projeter la souri sur un plan! TUTO

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown