Alcantornet
Messages postés89Date d'inscriptionmardi 8 février 2005StatutMembreDernière intervention14 novembre 2007
-
22 janv. 2006 à 10:11
KeniiyK
Messages postés326Date d'inscriptionvendredi 13 août 2004StatutMembreDerniè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.
// 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 ??
KeniiyK
Messages postés326Date d'inscriptionvendredi 13 août 2004StatutMembreDernière intervention 2 novembre 20072 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é..
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 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.
Alcantornet
Messages postés89Date d'inscriptionmardi 8 février 2005StatutMembreDernière intervention14 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.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 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.
KeniiyK
Messages postés326Date d'inscriptionvendredi 13 août 2004StatutMembreDernière intervention 2 novembre 20072 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 |