IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Problème de transformations...


Sujet :

OpenGL

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Points : 139
    Points
    139
    Par défaut Problème de transformations...
    J'avais besoin d'opération sur les vecteurs pour mon application, j'ai donc créer cette structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef struct _VEC {
    	float x,y,z;
    } vec;
    ainsi que des fonctions pour les manipuler. Je vous fais grâce des fonctions add, mult et norme (aux noms suffisament explicites...)

    J'ai aussi créer deux fonctions de transfert de ma structure vec à la structure classique float[4] :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    vec utov (float *tab) {
    	vec resultat;
    	resultat.x=*tab;
    	resultat.y=*(tab+1);
    	resultat.z=*(tab+2);
    	return resultat;
    }
    float* vtou (vec vecteur) {
    	float *result;
    	result=(float *) malloc(4*sizeof(float));
    	*(result)=vecteur.x;
    	*(result+1)=vecteur.y;
    	*(result+2)=vecteur.z;
    	*(result+3)=1;
    	return(result);
    }
    J'ai aussi créer deux fonctions sur les matrices d'OpenGL, une pour transposer et l'autre pour avoir l'image d'un vecteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    float * mmult(float *matrice, float *vecteur) {
    	float *result;
    	float somme;
    	int i,j;
    	result=(float*) malloc(4*sizeof(float));
    	for(i=0;i<4;i++) {
    		somme=0;
    		for (j=0;j<4;j++) {
    			somme+=(*(matrice+4*i+j)) * (*(vecteur+j));
    		}
    		*(result+i)=somme;
    	}
    	return(result);
    }
     
    float* mtranspose(float *matrice) {
    	float *result;
    	int i,j;
    	result=(float*) malloc(sizeof(float)*16);
    	for (i=0;i<4;i++) {
    		for(j=0;j<4;j++) {
    			*(result+4*i+j)=*(matrice+4*j+i);
    		}
    	}
    	return(result);
    }

    Puis, enfin, une fonction de rotation d'un vecteur autour d'un axe qui se sert un peu de tout ça et qui constitue le fondement de mon problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    vec rotation (vec u,vec axe, float angle) {
    	GLfloat matrice[16];
    	vec result;
     
    	if (norme(axe)!=0) {
    		glPushMatrix();
    		glLoadIdentity();
    		glRotatef(angle,axe.x/norme(axe),axe.y/norme(axe),axe.z/norme(axe));
    		glGetFloatv(GL_MODELVIEW_MATRIX,matrice);
    		result=utov(mmult((mtranspose(matrice)),vtou(u)));
    		glPopMatrix();
    		return(result);
    	}
    	else {
    		return(u);
    	}
    }

    En effet, ce code semble 'bon' puisque je l'utilise dans une fonction camera qui me place gentiment me caméra pour qu'elle tourne autour d'un objet (deux rotations combinées à partir des vecteurs de reference), via gluLookAt.

    La caméra se comporte tout à fait bien.

    Seulement, j'aimerai utiliser cette fonction rotation dans d'autres fonctions appelées lors du dessin des objets, qui est donc postérieur au placement de la caméra dans le code.

    Et la, la fonction rotation me renvoie n'importe quoi, c'est à dire un vecteur plus ou moins constant, meme quand on change les arguments (vecteur de départ, d'axe ou angle).

    Je pense que le problème vient du fait que la matrice courante n'est plus l'identité après la transformation appliquée par le gluLookAt, mais je croyais que le glPushMatrix() suivi de glLoadIdentity() eliminerait ce défaut. Il n'en est rien !!

    Ca fait plusieurs jours que je suis sur ce défaut et je ne vois toujours pas, merci de votre aide !
    MacBook - MacOS X.5.4
    C, Objective-C
    OpenGL, GLUT, Cocoa

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Je ne vois pas trop pourquoi ça plante mais tu as énormément de problème de fuite de mémoire. Bien que cela ne joue pas vraiment avec tes fonctions, ça serait un problème à résoudre.

    A part cela, tes fonctions me semble juste d'un point de vue C... Effectivement, il faudrait prendre à la main les valeurs d'entrée et voir si le calcul marche ou non. Tu dis:

    Je pense que le problème vient du fait que la matrice courante n'est plus l'identité après la transformation appliquée par le gluLookAt,
    Donne un exemple concret de valeurs d'entrée et regarde ce que fait l'ordinateur, peut-être que cela aidera à faire sortir le bug...

    Jc

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 69
    Points
    69
    Par défaut Re: Problème de transformations...
    Citation Envoyé par Omfraax
    J'ai aussi créer deux fonctions de transfert de ma structure vec à la structure classique float[4] :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    float* vtou (vec vecteur) {
    	float *result;
    	result=(float *) malloc(4*sizeof(float));
    	*(result)=vecteur.x;
    	*(result+1)=vecteur.y;
    	*(result+2)=vecteur.z;
    	*(result+3)=1;
    	return(result);
    }

    Ca fait plusieurs jours que je suis sur ce défaut et je ne vois toujours pas, merci de votre aide !
    Heu, idée à creuser... tu renvoie un pointeur temporaire ? t'es sur qu'il est pas là ton probleme ?
    Un renvoi de pointeur sur un objet temporaire ça me parrait risqué comme concept...

  4. #4
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Points : 139
    Points
    139
    Par défaut
    Euh, ouais, je vais me relancer dans une phase de test intensive.


    Donc vous pensez que renvoyer un float * est une mauvais idée et qu'il vaudrait mieux que je le passe en argument c'est ça ?

    [EDIT]: Voila le resultat de mes tests:

    Il faut savoir (je ne pensais pas que ça avait de l'importance mais c'est visiblement crucial) que la fonction rotation etait appelée au sein d'une boucle for incluse entre glBegin et glEnd.

    Appelées sur des vecteurs 'de bases' (genre (100,0,0)) avec un angle pourtant variable, tout se passe très bien EN DEHORS de la boucle, mais ça se remet à me renvoyer l'exotique vecteur (-1.999645,0,0) dès que je réintègre l'appel de fonction dans ma boucle.

    [EDIT 2] après avoir regardé dans la Doc, il semblerait que les glPushMatrix soient interdits entre glBegin, argh !
    MacBook - MacOS X.5.4
    C, Objective-C
    OpenGL, GLUT, Cocoa

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Points : 139
    Points
    139
    Par défaut
    Bon voila, jai stocké mes valeurs dans une autre boucle et tout marche bien


    Je suis cependant toujours interessé par ces problèmes de mémoire que tu citais fearyourself. Si tu avais quelques conseils simples ?
    MacBook - MacOS X.5.4
    C, Objective-C
    OpenGL, GLUT, Cocoa

  6. #6
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut Re: Problème de transformations...
    Citation Envoyé par Omeyocan
    Citation Envoyé par Omfraax
    J'ai aussi créer deux fonctions de transfert de ma structure vec à la structure classique float[4] :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    float* vtou (vec vecteur) {
    	float *result;
    	result=(float *) malloc(4*sizeof(float));
    	*(result)=vecteur.x;
    	*(result+1)=vecteur.y;
    	*(result+2)=vecteur.z;
    	*(result+3)=1;
    	return(result);
    }
    Ca fait plusieurs jours que je suis sur ce défaut et je ne vois toujours pas, merci de votre aide !
    Heu, idée à creuser... tu renvoie un pointeur temporaire ? t'es sur qu'il est pas là ton probleme ?
    Un renvoi de pointeur sur un objet temporaire ça me parrait risqué comme concept...
    Je ne vois pas de "pointeur temporaire" dans sa fonction, il fait un malloc et donc une allocation dynamique mais pas de free derrière, il n'y a rien de temporaire là dedans
    par contre, y a -t-il un free quelque part pour libérer cette allocation ?
    comme dit fearyourself, beaucoup de fuites mémoire
    un conseil : si tu fait un malloc, demandes toi tout de suite où es son free correspondant, à chaque malloc tu dois avoir un free à un moment où un autre
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 69
    Points
    69
    Par défaut Re: Problème de transformations...
    Citation Envoyé par shenron666
    Je ne vois pas de "pointeur temporaire" dans sa fonction, il fait un malloc et donc une allocation dynamique mais pas de free derrière, il n'y a rien de temporaire là dedans
    par contre, y a -t-il un free quelque part pour libérer cette allocation ?
    comme dit fearyourself, beaucoup de fuites mémoire
    un conseil : si tu fait un malloc, demandes toi tout de suite où es son free correspondant, à chaque malloc tu dois avoir un free à un moment où un autre
    Ben, je sais pas exactement comment réagira le programme... j'ai déja eu des problemes bizarre avec des pointeurs créés à la volée comme ça...

  8. #8
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Points : 139
    Points
    139
    Par défaut
    Bon je pense qu'il vaut mieux que je passe mon adresse en argument sinon, ça va être trop galère. Merci du conseil !
    MacBook - MacOS X.5.4
    C, Objective-C
    OpenGL, GLUT, Cocoa

Discussions similaires

  1. [XSLT]Problème de transformation d'un document XML.
    Par JM_Cholet dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 16/01/2007, 13h29
  2. Problèmes de transformations
    Par javator dans le forum OpenGL
    Réponses: 1
    Dernier message: 11/11/2006, 14h36
  3. [WordML][XSLT] Problème de transformation
    Par fouhaa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 24/05/2006, 15h22
  4. [XSLT] Problème de transformation XML avec un fichier xslt
    Par seb35 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 24/04/2006, 22h02
  5. [RegEx] Problème pour transformer les url en liens cliquable
    Par AlphaYoDa dans le forum Langage
    Réponses: 2
    Dernier message: 20/02/2006, 13h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo