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 :

[Rotation QUAD] Problème de rotation(en utisant en autre Cg)


Sujet :

OpenGL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut [Rotation QUAD] Problème de rotation(en utisant en autre Cg)
    Bonjour,

    J'ai un problème concernant la rotation d'un QUAD (2 triangles en fait).

    MON PROBLEME:
    Dans la fonction de rendu je souhaite faire tourner le quad à l'aide de glRotate() mais rien ne se passe ????!!!!

    J'utilise Cg pour faire un effet de Reflexion Mapping (EnvironMental Bump-Mapping)

    Voici des extraits de mon code:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    static void RenderQuad(void){
     
    	static float x = 0.0f;
    	static float y = 0.0f;
            static float a = 0.0f;
     
    	// ***** FAIRE TOURNER LE QUAD
    	glRotatef( a++, 1.0f, 0.0f, 1.0f );
     
     
    	// ***** FAIRE TOURNER LA LUMIERE
        LightPosition.x = 6.0f * sin(x+=0.02f);
        LightPosition.y = 2.0f * cos(y+=0.04f);
    	LightPosition.z = 2.5f;
        glLightfv( GL_LIGHT0, GL_POSITION, &(LightPosition.x) );
    	if( x > (2*3.14) ) x = 0.0f;
    	if( y > (2*3.14) ) y = 0.0f;
     
     
    	// ***** RENDER ICI
     
    	glBegin( GL_TRIANGLES );
     
    		m_fonc_MultiTexCoord2f( GL_TEXTURE0_ARB, quad.tab4pts[1][0].x, quad.tab4pts[1][0].y );
    		m_fonc_MultiTexCoord3f( GL_TEXTURE1_ARB, quad.TBN_Matrice[0][0].x, quad.TBN_Matrice[0][0].y, quad.TBN_Matrice[0][0].z );
    		 glNormal3f( 0.0f, 0.0f, 1.0f );
    		 glVertex3f( quad.tab4pts[0][0].x, quad.tab4pts[0][0].y, quad.tab4pts[0][0].z );
     
    		m_fonc_MultiTexCoord2f( GL_TEXTURE0_ARB, quad.tab4pts[1][1].x, quad.tab4pts[1][1].y );
    		m_fonc_MultiTexCoord3f( GL_TEXTURE2_ARB, quad.TBN_Matrice[0][1].x, quad.TBN_Matrice[0][1].y, quad.TBN_Matrice[0][1].z );
    		 glNormal3f( 0.0f, 0.0f, 1.0f );
    		 glVertex3f( quad.tab4pts[0][1].x, quad.tab4pts[0][1].y, quad.tab4pts[0][1].z );
     
    		m_fonc_MultiTexCoord2f( GL_TEXTURE0_ARB, quad.tab4pts[1][2].x, quad.tab4pts[1][2].y );
    		m_fonc_MultiTexCoord3f( GL_TEXTURE3_ARB, quad.TBN_Matrice[0][2].x, quad.TBN_Matrice[0][2].y, quad.TBN_Matrice[0][2].z );
    		 glNormal3f( 0.0f, 0.0f, 1.0f );
    		 glVertex3f( quad.tab4pts[0][2].x, quad.tab4pts[0][2].y, quad.tab4pts[0][2].z );
     
    	glEnd();
     
    	glBegin( GL_TRIANGLES );
     
    		m_fonc_MultiTexCoord2f( GL_TEXTURE0_ARB, quad.tab4pts[1][0].x, quad.tab4pts[1][0].y );
    		m_fonc_MultiTexCoord3f( GL_TEXTURE1_ARB, quad.TBN_Matrice[1][0].x, quad.TBN_Matrice[1][0].y, quad.TBN_Matrice[1][0].z );
    		 glVertex3f( quad.tab4pts[0][0].x, quad.tab4pts[0][0].y, quad.tab4pts[0][0].z );
     
    		m_fonc_MultiTexCoord2f( GL_TEXTURE0_ARB, quad.tab4pts[1][2].x, quad.tab4pts[1][2].y );
    		m_fonc_MultiTexCoord3f( GL_TEXTURE2_ARB, quad.TBN_Matrice[1][1].x, quad.TBN_Matrice[1][1].y, quad.TBN_Matrice[1][1].z );
    		 glVertex3f( quad.tab4pts[0][2].x, quad.tab4pts[0][2].y, quad.tab4pts[0][2].z );
     
    		m_fonc_MultiTexCoord2f( GL_TEXTURE0_ARB, quad.tab4pts[1][3].x, quad.tab4pts[1][3].y );
    		m_fonc_MultiTexCoord3f( GL_TEXTURE3_ARB, quad.TBN_Matrice[1][2].x, quad.TBN_Matrice[1][2].y, quad.TBN_Matrice[1][2].z );
    		 glVertex3f( quad.tab4pts[0][3].x, quad.tab4pts[0][3].y, quad.tab4pts[0][3].z );
     
    	glEnd();
    }

    et les fonction d'init
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    static void Reshape(int width, int height);
    static void InitializeGlut(int *argc, char *argv[])
     {
    	glutInit(argc, argv);
    	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_ALPHA | GLUT_DEPTH);
    	glutInitWindowSize(512, 512);
    	glutCreateWindow("Reflect Mapping avec Cg");
    	glutDisplayFunc(Display);
    	glutReshapeFunc(Reshape);
     
    	glEnable(GL_TEXTURE_2D);							// Enable Texture Mapping
    	glShadeModel(GL_SMOOTH);							// Enable Smooth Shading
    	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);				// Black Background
    	glClearDepth(1.0f);									// Depth Buffer Setup
    	glEnable(GL_DEPTH_TEST);							// Enables Depth Testing
    	glDepthFunc(GL_LEQUAL);								// The Type Of Depth Testing To Do
    	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Really Nice Perspective Calculations
     
    	// lumières
    	glLightfv( GL_LIGHT0, GL_DIFFUSE,  (float*)&LightDiffuse.x );
    	glLightfv( GL_LIGHT0, GL_POSITION, (float*)&LightPosition.x );
    	glEnable( GL_LIGHT0 );
    	glEnable( GL_LIGHTING );
    }
     
     
     
    int main(int argc, char *argv[])
     {
    	// initialisation ici
    	InitializeGlut(&argc, argv);
    	ChargerTextures();
    	ChargerMultiTex();
    	ChargerCg();
    	InitWorld();
     
    	// rendering ici (ET bouclage infini)
    	glutMainLoop();
     
    	// fin de programme ici
    	DetruireCg();
     
    	// et return de fin....
    	return 0;
     }
     
     
    void Reshape(int width, int height){
    	// eviter une division par zero
    	if (height == 0){ height = 1; }
     
    	glViewport(0, 0, width, height);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	gluPerspective(45, (float)width/(float)height, 0.1f, 100);
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    }
    merci encore.

  2. #2
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    et dans ton vertex program en CG tu n'oublie pas de multiplier la position du vertex par la matrice de modelView ? (ou d'utiliser un invariant... je ne connait pas CG )
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    Bonjour Bafman!

    Merci pour ta réponse!

    voici le programme à vertices que j'utilise (tu trouveras le même sur le site de nvidia (le '.pdf' de Cg : user manual), tutoriel: "Bump-Reflection Mapping"):

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    struct a2v {
    	float4 Position : POSITION; // in object space
    	float2 TexCoord : TEXCOORD0;
    	float3 T : TEXCOORD1; // in object space
    	float3 B : TEXCOORD2; // in object space
    	float3 N : TEXCOORD3; // in object space
    };
     
    struct v2f {
    	float4 Position : POSITION; // in projection space
    	float4 TexCoord : TEXCOORD0;
    	float4 TangentToCubeSpace0 : TEXCOORD1;
    	float4 TangentToCubeSpace1 : TEXCOORD2;
    	float4 TangentToCubeSpace2 : TEXCOORD3;
    };
     
    v2f main(a2v IN,
    	uniform float4x4 WorldViewProj,
    	uniform float3x4 ObjToCubeSpace,
    	uniform float3 EyePosition,
    	uniform float BumpScale  )
    {
    	v2f OUT;
     
    	OUT.TexCoord.xy = IN.TexCoord.xy;
    	float3x3 objToTangentSpace;
     
    	objToTangentSpace[0] = BumpScale * IN.T;
    	objToTangentSpace[1] = BumpScale * IN.B;
    	objToTangentSpace[2] = IN.N;
     
    	OUT.TangentToCubeSpace0.xyz =
    	mul(objToTangentSpace, ObjToCubeSpace[0].xyz);
    	OUT.TangentToCubeSpace1.xyz =
    	mul(objToTangentSpace, ObjToCubeSpace[1].xyz);
    	OUT.TangentToCubeSpace2.xyz =
    	mul(objToTangentSpace, ObjToCubeSpace[2].xyz);
     
    	float3 eyeVector = mul(ObjToCubeSpace, IN.Position) - EyePosition;
    	OUT.TangentToCubeSpace0.w = eyeVector.x;
    	OUT.TangentToCubeSpace1.w = eyeVector.y;
    	OUT.TangentToCubeSpace2.w = eyeVector.z;
     
    	OUT.Position = mul(WorldViewProj, IN.Position);
    	return OUT;
    }
    J'ai encore du mal à le lire complètement!
    Cg me permet d'utiliser un effet graphique pour mes programmes sans avoir trop besoin de comprendre parfaitement le code de cette effet ... mais comprendre l'interface, oui!

    merci encore!

    [/code]

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    Personne ne sait??

    tout va bien (je peut faire tourner , translater n'importe quoi) jusqu'au moment où je lance CG en faisant:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    static void LancerCgProgram( bool lancer ){
    	if( lancer ){
    		// activer les profils supportés par la carte graphique
    		cgGLEnableProfile( vertexProfile );
    		cgGLEnableProfile( fragmentProfile );
     
    		// préparer les 2 programmes
    		cgGLBindProgram( VProgram );
    		cgGLBindProgram( FProgram );
     
    		// ***** injecter les paramètres de travail donc "utilisateurs"(uniform)
    		// en paramètre du programme approprié
     
    // VP	// donner la matrice pour projeter le monde (en 3D) à l'écran (en 2D)
    		cgGLSetStateMatrixParameter( mvp, CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY );
    		cgGLSetStateMatrixParameter( mvm, CG_GL_MODELVIEW_MATRIX,			 CG_GL_MATRIX_IDENTITY );
    		// position yeux
    		cgGLSetParameter3f( pe, 0.0, 0.0, 0.0 );
    		// donner la taille du relief à appliquer
    		cgGLSetParameter1f( scale, 0.5 );
     
    // FP	// donner le vecteur yeux
    		cgGLSetParameter3f( ev, 0.0, 0.0, -1.0  );
    		// permettre d'utiliser la texture donnant les infos du relief (bump)
    		cgGLEnableTextureParameter(tr);
    		// permettre d'utiliser la texture du CUBE
    		cgGLEnableTextureParameter(te);
    	}
    	else{
    		// Disable the vertex and fragment profiles again
    		cgGLDisableProfile( vertexProfile );
    		cgGLDisableProfile( fragmentProfile );
    	}
     
    		// initialisations de textures
    	cgGLSetTextureParameter(cgGetNamedParameter(FProgram, "NormalMap"),			*(relief->Ob_texture()) );
    	cgGLSetTextureParameter(cgGetNamedParameter(FProgram, "EnvironmentMap"),	lecube );
     
    	// envoyer ces vertex au programme à vertex
    	// envoyer les coords de textures au programme à vertex
    	glEnable(GL_TEXTURE_CUBE_MAP_ARB);
    	glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, lecube);
    	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
    	glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
    	glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
    	glEnable( GL_TEXTURE_GEN_S );
    	glEnable( GL_TEXTURE_GEN_T );
    	glEnable( GL_TEXTURE_GEN_R );
    }
    Et c'est à ce moment que toute la scène (toute) se fige dans sa position initiale
    (bien sur, si je ne lance pas CG les effets ne s'appliquent pas, voire il y a écran noir!)
    Pourquoi??!! :o

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    C'est bon! j'ai trouvé le problème:

    Il faut appliquer toutes les rotations et translations à l'objet sur lequel s'applique les effets CG AVANT de lancer CG sur ces objets! ARF!!

    Par contre, autre et dernier problème:

    Mon Environment Mapping n'est pas dynamique!!!!
    Il est calculé au début (lancement du programme) et après, quand je fait tourner le QUAD les effets restent statiques (comme au début quoi!)

    les programmes CG sont appelés à chaque appel à ma fonction de dessin du QUAD (normal!) mais je calcule la matrice TBN qu'une seule fois!

    faut-il la calculer à chaque dessin du QUAD et sinon comment?

    merci encore.

Discussions similaires

  1. Problème image rotator
    Par eiffel74 dans le forum ASP
    Réponses: 1
    Dernier message: 10/04/2007, 23h02
  2. Problème de rotation
    Par Syphon dans le forum Flash
    Réponses: 9
    Dernier message: 11/01/2007, 10h27
  3. Problème de rotation => "rideau noir"
    Par alex6891 dans le forum OpenGL
    Réponses: 19
    Dernier message: 29/07/2006, 21h25
  4. [OpenGL] problème de rotation 3D
    Par ReiVon dans le forum OpenGL
    Réponses: 3
    Dernier message: 11/04/2005, 09h47
  5. Problème de rotation
    Par Francky033 dans le forum DirectX
    Réponses: 1
    Dernier message: 17/07/2003, 16h38

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