begin process at 2012 02 13 13:51:30
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

OpenGL

 > OPENGL : GLUUNPROJECT / COMMENT PROJETER LA SOURI SUR UN PLAN !

OPENGL : GLUUNPROJECT / COMMENT PROJETER LA SOURI SUR UN PLAN !


 Information sur le tutoriel

Note :
Aucune note

 Description

Ici nous allons voire comment a partir d'une caméra , projeter les coordonnées de sa souri sur un plan (ici XY)

Tutorial

Salut!
COMMENT PROJETER LA SOURIS SUR PLAN?? AHH!!!
Voila dans quel état j'étais hier!
Heureusement j'ai fini par trouver! Et je vais expliquer comment j'ai fait! ( je posterai meme mon projet en cours pour vous montrer le résultat!
(je fais ca parce que j'ai failli m'arracher les cheveux a force de chercher et de ne rien trouver sur le NET. j'espere que ca 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 souri(SOURI.X)et (HAUTEUR_ECRAN - SOURI.Y) ici on prend HAUTEUR_ECRAN - SOURI.Y parce que sinon on aura les y inversé!( car le 0,0 d'opengl n'est pas le même 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,viewport[3]-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


une fois que c'est fait! on obtient ceci :
http://img75.imageshack.us/img75/8409/projxk2.jpg


on obtient le projeté de la souri, sur le plan qui fait face a la camera ( que j'appel le plan de l'ecan)
mais ce n'est pas ce qu'on veut!
Nous ce qu'(on veut c'est le projeté de la souri sur un plan!!
donc 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!
(dans ce tuto je veux projeter les coordonnées de ma souris sur le plan XY)
equation de droite passant par AB :


soit  les points :

VOIR SCHEMA

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)

AM = t * AB   // AM est colinéaire a AB et "t" etant un reel 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
Mzt *(Bz-Az) + Az


le point M est un point de la droite passant par AB.
Maintenant je veux que ce point M soit le point a la fois sur la droite AB et sur le plan XY.
donc il faut que je calcul "t" pour que mon M soit sur mon plan XY!
or l'equation de mon plan XY est : z=0
donc pour que mon point M soit sur mon plan il faut que sa coordonnées en z soit nulle, sachant cela je peux calculer "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 VOILA!!!



code final : 

    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,
viewport[3]-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


Image utilisateur
et VOILA!!!
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,0) a mon objet et il sera exactement sous ma souris!!
voici un petit executable illustrant la situation:
(vous pouvez bouger avec les fleches, clicker et bouger la souri pour tourner autour, zoomer avec la molette)
http://dl.free.fr/qcPx9Xt1b

 Historique

01 novembre 2008 00:20:48 :
remise en forme
01 novembre 2008 00:22:06 :
mise en forme
01 novembre 2008 00:29:50 :
remise en forme
01 novembre 2008 00:35:05 :
remise en forme
01 novembre 2008 01:04:45 :
ajout Couleur
01 novembre 2008 01:14:30 :
remise en forme
01 novembre 2008 01:15:10 :
remise en forme
01 novembre 2008 01:19:23 :
couleur
01 novembre 2008 01:23:02 :
taille texte
01 novembre 2008 01:32:21 :
ajout de l'exemple
01 novembre 2008 01:44:22 :
correction code
01 novembre 2008 01:45:39 :
erreure code
01 novembre 2008 15:25:30 :
titre approprié
01 novembre 2008 16:34:31 :
correction exemple
01 novembre 2008 16:35:45 :
correction exemple
23 avril 2009 23:43:35 :
correction, viewport[3]

Commentaires

Commentaire de popo_joe le 01/11/2008 00:44:24

*attention*
j'ai ecrit
t= Az/(Bz-Az)
mais en réalité c'est
t= -Az/(Bz-Az)

Commentaire de plasttoon le 14/03/2009 23:39:12

redit sa en c++ avec openGL et tu est mon héros !!!   Mercie

Commentaire de popo_joe le 26/03/2009 10:54:46

ce sont des fonctions appartenant a OPENGL, donc ça marche sous C++ et C.
d'ailleur si tu telecharge l'exemple tu verra qu'il est codé en C++.

Commentaire de T4g1 le 22/04/2009 17:38:13

Un grand merci pour ce tuto c'est exactement ce qu'il me fallait :D

Juste une petite chose pour que tout le monde puisse l'utiliser : Il faudrait remplacer "gluUnProject( SOURI.X,480-SOURI.Y,0,mvmatrix,projmatrix,viewport,&Bx,&By,&Bz);" par "gluUnProject( SOURI.X,viewport[3]-SOURI.Y,0,mvmatrix,projmatrix,viewport,&Bx,&By,&Bz);" afin que le code fonctionne avec n'importe quelle taille de fenetre (d'apres http://nehe.gamedev.net/data/articles/article.asp?article=13 qui explique seulement la partie pour obtenir les coordonnées de la souris sur le plan de l'ecran)

Commentaire de popo_joe le 22/04/2009 21:20:59

ahhh oui!! merci bcp je vais regler ca desuite :)

Commentaire de DigigtalDJ le 14/01/2010 14:55:20

franchement t'es vraiment un as ;) merci beaucoup

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,250 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales