Matrix OpenGL [Résolu]

Signaler
Messages postés
89
Date d'inscription
mardi 8 février 2005
Statut
Membre
Dernière intervention
14 novembre 2007
-
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
-
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 ??
A voir également:

13 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
point * matrice ? non mais matrice * point , oui :)
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
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
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
89
Date d'inscription
mardi 8 février 2005
Statut
Membre
Dernière intervention
14 novembre 2007

merci pour l'info de performance, mais justement je n'arrive pas à faire une matrice moi même.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
89
Date d'inscription
mardi 8 février 2005
Statut
Membre
Dernière intervention
14 novembre 2007

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.
Messages postés
89
Date d'inscription
mardi 8 février 2005
Statut
Membre
Dernière intervention
14 novembre 2007

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
89
Date d'inscription
mardi 8 février 2005
Statut
Membre
Dernière intervention
14 novembre 2007

j'aurais besoin de ressortir les rotations x y et z d'une matrice je pense qu'il faut utiliser atan(qqch) ??
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
89
Date d'inscription
mardi 8 février 2005
Statut
Membre
Dernière intervention
14 novembre 2007

Sais-tu alors appliquer une matrice à un point ?? point * matrice ??? stp.
Messages postés
89
Date d'inscription
mardi 8 février 2005
Statut
Membre
Dernière intervention
14 novembre 2007

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+
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
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