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 :

Décalage du pointeur de la sourie:


Sujet :

OpenGL

  1. #1
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut Décalage du pointeur de la sourie:
    Alors je sais pas si ça vient de wxwidget ou d'opengl mais le fait est que sur des ordis ayant des cartes graphiques supérieurs aux 6600 ça fonctionne et endessous j'ai un décalage(variant je crois) de plusieurs dixaines de pixels.
    Je le vois bien sur mon rectangle de sélection mais pour lui c'est plus minime .
    De plus je dois avoué que j'utilise pas le partage de context entre mes fenètres opengl, mais j'utilise le même ce qui me force à faire un resize du GlCanvas à chaque OnDraw.
    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
     
    void SceneCanvas::OnForceSize()
    {
    	int Width, Height;
    	GetClientSize(&Width, &Height);
     
    	if ( Height == 0 ) Height = 1;
        if (  Width == 0 )  Width = 1;
    #ifndef __WXMOTIF__
        if ( GetContext() )
    #endif
        {
    		ViewAspect=1.0;
    		int Decalage = 0;
            SetCurrent();
    		if(Width>Height)
    		{
    			//ViewAspect=Width/Height;
    			Decalage= (Width - Height)/2;
    			Width=Height;
    			glViewport(Decalage,0,Width,Height);
    		}
    		else
    		{
    			//ViewAspect=1;
    			Decalage= (Height - Width)/2;
    			Height=Width;
    			glViewport(0,Decalage,Width,Height);
    		}
     
     
    		glMatrixMode(GL_PROJECTION);
     
     
    		glLoadIdentity();
    		gluPerspective(ViewFovy,ViewAspect,ViewProche,ViewLoin);
    		glMatrixMode(GL_MODELVIEW);
        }
    }
    Sur ma 7600 le ReadPixel est parfaitement précis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glReadPixels(X+viewport[0]*2,viewport[3]-Y+viewport[1]*2,1,1,GL_RGBA,GL_UNSIGNED_BYTE,(void *)m_Repere->m_pixel);
    Le décalage ne viens pas du buffer sélectionné , ou que ça soit du bi écran placé gauche ou à droite.

    Pour dessiner ma sélection pour éviter se décalage , j'ai fait de la dicotomie :p, Mais ça reste imprécis sur les cartes < ou = à la 6600

    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
    60
    61
    62
    63
    64
     
    int Width, Height;
            m_Window->GetClientSize(&Width, &Height);
     
            if ( Height == 0 ) Height = 1;
            if (  Width == 0 )  Width = 1;
             //*
            float coefficient = 0.5;
            float coefficient01x= 0.826;//0.413/0.5//recherche par dicotomie
            float coefficient01y= 0.847;
     
            if(Width>Height)
            {
                coefficient01x=(float)Width*coefficient01y / (float)Height;
            }
            else
            {
                coefficient01y=(float)Height*coefficient01x / (float)Width;
            }
     
     
            float x1= ((float)m_RectSelection.GetBottomRight().x)/((float)Width )-coefficient;
            float y1=-((float)m_RectSelection.GetBottomRight().y)/((float)Height)+coefficient;
            float x2= ((float)m_RectSelection.GetLeftTop().x)    /((float)Width )-coefficient;
            float y2=-((float)m_RectSelection.GetLeftTop().y)    /((float)Height)+coefficient;
     
     //coordonnées de mes points 3D formant le     
     //rectangle de sélection:
     
            x1*=coefficient01x;
            y1*=coefficient01y;
            x2*=coefficient01x;
            y2*=coefficient01y;
            float z =-(m_ViewProche);//affiche les points à la distance 
    //m_ViewProche
     
    ....
         //Rendu
    glDisable(GL_CULL_FACE);
        glPushMatrix();
            glLoadIdentity();
            glDisable(GL_DEPTH_TEST);
     
            glColor3f(1.0, 0.0, 0.0);
            glBegin(GL_LINE_LOOP);
            glVertex3f(x1 , y1, z);
            glVertex3f(x2 , y1, z);
            glVertex3f(x2 , y2, z);
            glVertex3f(x1 , y2, z);
            glEnd();
     
            glEnable(GL_BLEND);
            glColor3f(0.5, 0.5, 0.5);
            glBegin(GL_QUADS);
            glVertex3f(x1 , y1, z);
            glVertex3f(x2 , y1, z);
            glVertex3f(x2 , y2, z);
            glVertex3f(x1 , y2, z);
            glEnd();
            glColor3f(1.0, 1.0, 1.0);
            glDisable(GL_BLEND);
            glEnable(GL_DEPTH_TEST);
        glPopMatrix();
        glEnable(GL_CULL_FACE);
    Maintenant si ça vient de wxwidget se que je soupçonne aussi (car avant je n'avais pas un décalage aussi flagrant entre le rectangle de sélection et la sourie, sur des ati Nividia de toutes sortes). Mais vous allez me dire avant quoi ? :p
    Je viens de revoir l'appel des événements . Les événéments du SceneCanvas appel automatiquement les event d'un outil générique , suffit d'y placer un outil courant et il recevra automatiquement les events du scencanvas. Mais si ça vien de ça alors je vois pas comment :p.

    EDIT: test tout simple, les coordonnées du pointeur de la sourie correspondent bien à la fenètre (dans l'angle supérieur gauche 0,0), donc je pense pas que ça vienne de wxwidget.

  2. #2
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glReadPixels(X+viewport[0]*2,viewport[3]-Y+viewport[1]*2,1,1,GL_RGBA,GL_UNSIGNED_BYTE,(void *)m_Repere->m_pixel);
    j'aurais du regarder de plus pret ma formule :p
    dans le cas où
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    viewport[0]*2 = environ 100 et viewport[1]*2 = 0 ça marche plus
    Donc j'ai rien dit ça vien pas des CG
    (que la honte s'abate sur moi :p)
    Bon faut que je revoi cte formule et la formule de base de X + viewport[3]-Y marche pas non plus :p ça aurait été trops facile :p idem pour viewport[2]- X+viewport[0]*2,viewport[3]-Y+viewport[1]*2

  3. #3
    Membre actif Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Points : 245
    Points
    245
    Par défaut
    Voili la solution :p
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(viewport[0]<viewport[1])
            glReadPixels(X,viewport[3]-Y+viewport[1]*2,1,1,GL_RGBA,GL_UNSIGNED_BYTE,(void *)m_Repere->m_pixel);
        else
            glReadPixels( X,viewport[3]-Y,1,1,GL_RGBA,GL_UNSIGNED_BYTE,(void *)m_Repere->m_pixel);
    ...Bon 3h39 dans 4h je part au taff huhu ça va être joyeux :p

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 28/07/2006, 15h18
  2. Changer le pointeur de la souris
    Par jolann69 dans le forum 4D
    Réponses: 1
    Dernier message: 13/06/2006, 08h40
  3. [MFC] Changer la forme du pointeur de la souris
    Par Philippe320 dans le forum MFC
    Réponses: 2
    Dernier message: 03/12/2005, 11h30
  4. Réponses: 5
    Dernier message: 23/08/2005, 12h08
  5. modifier pointeur de la souris au survol d'une case
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/06/2005, 17h54

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