Matrix OpenGL [Résolu]

Alcantornet 89 Messages postés mardi 8 février 2005Date d'inscription 14 novembre 2007 Dernière intervention - 22 janv. 2006 à 10:11 - Dernière réponse : KeniiyK 326 Messages postés vendredi 13 août 2004Date d'inscription 2 novembre 2007 Dernière intervention
- 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 ??
Afficher la suite 

13 réponses

Répondre au sujet
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 23 janv. 2006 à 13:19
+3
Utile
point * matrice ? non mais matrice * point , oui :)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de luhtor
KeniiyK 326 Messages postés vendredi 13 août 2004Date d'inscription 2 novembre 2007 Dernière intervention - 23 janv. 2006 à 13:01
+2
Utile
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
Commenter la réponse de KeniiyK
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 22 janv. 2006 à 11:34
0
Utile
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.
Commenter la réponse de luhtor
Alcantornet 89 Messages postés mardi 8 février 2005Date d'inscription 14 novembre 2007 Dernière intervention - 22 janv. 2006 à 13:04
0
Utile
merci pour l'info de performance, mais justement je n'arrive pas à faire une matrice moi même.
Commenter la réponse de Alcantornet
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 22 janv. 2006 à 13:58
0
Utile
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.
Commenter la réponse de luhtor
Alcantornet 89 Messages postés mardi 8 février 2005Date d'inscription 14 novembre 2007 Dernière intervention - 22 janv. 2006 à 18:42
0
Utile
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.
Commenter la réponse de Alcantornet
Alcantornet 89 Messages postés mardi 8 février 2005Date d'inscription 14 novembre 2007 Dernière intervention - 22 janv. 2006 à 18:43
Commenter la réponse de Alcantornet
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 22 janv. 2006 à 19:36
0
Utile
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.
Commenter la réponse de luhtor
Alcantornet 89 Messages postés mardi 8 février 2005Date d'inscription 14 novembre 2007 Dernière intervention - 22 janv. 2006 à 19:57
0
Utile
j'aurais besoin de ressortir les rotations x y et z d'une matrice je pense qu'il faut utiliser atan(qqch) ??
Commenter la réponse de Alcantornet
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 22 janv. 2006 à 21:30
0
Utile
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.
Commenter la réponse de luhtor
Alcantornet 89 Messages postés mardi 8 février 2005Date d'inscription 14 novembre 2007 Dernière intervention - 23 janv. 2006 à 09:31
0
Utile
Sais-tu alors appliquer une matrice à un point ?? point * matrice ??? stp.
Commenter la réponse de Alcantornet
Alcantornet 89 Messages postés mardi 8 février 2005Date d'inscription 14 novembre 2007 Dernière intervention - 23 janv. 2006 à 14:21
0
Utile
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+
Commenter la réponse de Alcantornet
KeniiyK 326 Messages postés vendredi 13 août 2004Date d'inscription 2 novembre 2007 Dernière intervention - 24 janv. 2006 à 09:26
0
Utile
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
Commenter la réponse de KeniiyK

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.