Matrix OpenGL

Résolu
Alcantornet Messages postés 89 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 14 novembre 2007 - 22 janv. 2006 à 10:11
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 - 24 janv. 2006 à 09:26
Hello World,

Dans mon programme openGl je place mes objet gâce aux commandes glTranslate glRotate et glScale mais après avoir fait plein de rotation et de translation l'objet s'affiche bien ou je veux, mais je voudrais s'avoir ou`il s'affiche pour faire la détection de collision.

J'ai imaginai la chose suivant:

// Applique les transformation OpenGL
glPushMatrix();
glTranslatef(player.px,player.py,player.pz);
glRotatef(player.rot_y,0,1,0);
glRotatef(player.ix,1,0,0);
glRotatef(player.iz,0,0,1);
glRotatef(player.rot_tow-player.rot_y,0,1,0);
glRotatef(player.rot_can,1,0,0);
glCallList(player.id_list+1); // Objet
glPopMatrix();

// On refait les mêmes transfo avec des fonction perso
clReset();
clTranslate(player.px,player.py,player.pz);
clRotate(0,player.rot_y,0);
clRotate(player.ix,0,0);
clRotate(0,0,player.iz);
clRotate(0,player.rot_tow-player.rot_y,0);
clRotate(player.rot_can,0,0);
clRotate(90,0,0);

// Puis obtient sa position
printf("x:%i y:%i z:%i\n",clGetPosX(),clGetPosY(),clGetPosZ());

Mais je n'arrive pas à faire les fonction clRotate et clTranslate correctement et ce que qqun peut m'aider svp ??

13 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
23 janv. 2006 à 13:19
point * matrice ? non mais matrice * point , oui :)
3
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
23 janv. 2006 à 13:01
Salut,

float matrix[16];
// attention !!, OpenGL retourne la matrice classée par colonne et non pas par ligne
// donc ligne0 = {matrix[0],matrix[4],matrix[8],matrix[12]}
// Et c'est aussi une matrice 4x4 pour les coordonnées homogènes, d'ou le 16
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);

// pour le calcul de la transformation d'un point, je ne vais pas te l'expliquer il y a plein de tuto pour ça....
// Mais par contre on peut demander a OpenGL de le faire ... :) trop cool !!!, pour cela ne fais pas la ligne ci-dessus.
float p[3] // ton point avant la tranformation
// on charge le point dans la première colonne de la matrice. Attention avec un 1 pour le w (coordonnées homogènes...)
matrix[0]=p[0];
matrix[1]=p[1];
matrix[2]=p[2];
matrix[3]=1;
// on multiple la matrice courante par notre matrice, résultat -> ton point transformé est dans la première colonne de la nouvelle matrice...
glMultMatrix(GL_MODELVIEW_MATRIX, matrix);
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
float pTransformé[3]={matrix[0],matrix[1],matrix[2]};

// par contre fais bien attention a faire un PushMatrix et un Pop ensuite car bien évidemment le multmatrix modifie ta matrice
// de modelview....
// le truc c'est que les appels aux fonctions glGet* sont très lente (remontée du PIPE...) peut etre moins si tu es en PCI Express
// (je peu pas teste, suis en AGP)
// donc le mieux c'est que tu ailles voir les tutos sur les matrices et les points etc... Tu verras c'est pas tres dur. La multiplication
// est assez triviale et tu pourras faire un code beaucoup plus efficace que celui que je t'ai donné..

@+, KeniiyK
2
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
22 janv. 2006 à 11:34
Tu n'as pas besoin de faire calculer opengl, si tu calcul toi meme les transformations.

Si tu fais tes calculs sur une matrice M. Pour l'affichage, tu peux utiliser glMultMatrix:

glPushMatrix()

glMultMatrix(M); // M une matrice 4x4

TRACE TON TRUC;

glPopMatrix();



et voila, comme ca tu fais l'économie a opengl de calculer ton
truc et ca te permet de voir si ta matrice M est correct. Puisque si
elle ne l'est pas, l'objet s'affichera n'importe ou.
0
Alcantornet Messages postés 89 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 14 novembre 2007
22 janv. 2006 à 13:04
merci pour l'info de performance, mais justement je n'arrive pas à faire une matrice moi même.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
22 janv. 2006 à 13:58
Bas commence juste à faire une matrice de translation, que tu
multiplies à celle d'opengl, et tu regardes, si ton objet se translate
correctement.



Mais ton problème est un pb de maths ? tu vois pas cmt construire la matrice ou juste que ce que tu fais ne fonctionnes pas ?

Dans tous les cas, post ici la facon dont tu construis tes matrices.
0
Alcantornet Messages postés 89 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 14 novembre 2007
22 janv. 2006 à 18:42
j'ai fait plein de recherche sur la matrice et je me suis rendu compte que je pouvait prendre celle que opengl calcul grâce à glGetFloatv(GL_MODELVIEW_MATRIX, *matrix); cela m'évite de calculer les transformation puis dans la matrice je récupère les translation. x=matrix[3][0] y=matrix[3][1] z=matrix[3][2], mais il me reste à trouvée les rotations.
0
Alcantornet Messages postés 89 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 14 novembre 2007
22 janv. 2006 à 18:43
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
22 janv. 2006 à 19:36
La matrice que openGL calcul, tu peux la récupérer oui. Apres tu
multiplie les points de ton objet par cette matrice, et ca te donne ses
coordonnées dans l'espace apres voir subi la tranformation.
0
Alcantornet Messages postés 89 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 14 novembre 2007
22 janv. 2006 à 19:57
j'aurais besoin de ressortir les rotations x y et z d'une matrice je pense qu'il faut utiliser atan(qqch) ??
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
22 janv. 2006 à 21:30
Essai de trouver un autre moyen que d'extraire des angles de rotations. C'est la merde apres :)

et comme j'ai éviter ce genre de chose quand j'en ai eu besoin, j'y connais rien.
0
Alcantornet Messages postés 89 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 14 novembre 2007
23 janv. 2006 à 09:31
Sais-tu alors appliquer une matrice à un point ?? point * matrice ??? stp.
0
Alcantornet Messages postés 89 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 14 novembre 2007
23 janv. 2006 à 14:21
Merci KeniiyK pour ton idée géniale qui me simplifie beaucoup la vie. Et à luthor pour son aide précieuse et ses précision.



a+
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
24 janv. 2006 à 09:26
Une dernière précision, après le calcul que je t'ai donné divise ton point par matrix[3] (w des coord. homogènes) normalement il devrait être a 1.0 si la modelview est bien du type : (suis jamais allé voir sa tête.... mais je pense qu'elle est forcément de ce type)
| E T |
| et T |
| R T |
| 0 0 0 1 |

E : échelle, R : rotation et T : translation.

KeniiyK
0
Rejoignez-nous