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 :

[SDL - OPENGL] position souris


Sujet :

OpenGL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut [SDL - OPENGL] position souris
    salut!
    j'essaye de developper un jeu en side scroller mais dans un environnement 3D, seulement je voudrai pouvoire projeter les coordonnées de la souri de mon ecran sur le plan XY ou se deplace le personnage, tout en ayant une vue de 3/4 c'est a dire la caméra est positionnée aux coordonnées (0,6,8) et mon personnage aux coordonnées (0,0,0) et ne se deplace que sur le plan XY , le personnage a une arme, et je voudrai faire en sorte que son arme soit en dessous de la souri, (mais son arme doit tourner autour du perso et elle doit donc rester sur le plan XY...)

    si quelqu'un pouvait m'aider ce serai vraiment super SYMPA!! je suis bloqué la dessus depuis 2 jours j'ai essayé plein de choses mais a chaque fois j'obtiens des resultats moyens...(soit larme se deplace de facon tres rapide par rapport a ma souri, soit l'arme a une position a lexterrieur de l'ecran)

    je suis vraiment fatigué :'( je n'y arrive vraiment pas :''(

  2. #2
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Par défaut
    Salut,
    Pour ce qui est de la projection 'inversée' t'as glUnproject(...) (la doc d'openGL t'en dira plus)
    Pour ce qui est de ton arme, il se peut (et je peux me tromper) que tu réalise mal les transformations 3D, par exemple, pour faire tourner l'arme autour du perso, tu peux multiplier la matrice courante (glMultMatrix) par une matrice de translation (qui contient les coordonnées globales du perso) par une matrice de rotation (une rotation de 5 degrès par seconde par exemple )
    Attention toute fois ! Si tu fais l'inverse (rotation*translation) l'arme tournera sur son origine, et je suppose que ce n'est pas le résultat souhaité.
    Si tu veux plus de précisions, montre un peu de code, des screens, on pourra encore t'aider d'avantage.
    Voila.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut
    ouah cool!
    bah tien voila mon projet, si tu veux jeter un coup d'oeil et me dire ce qui va pas ce serai vraiiiiiiment sympa je defini la position de l'arme de mon perso dans Personnage.cpp fonction set_position (c'est juste temporaire je fais des test :/)

    tu peux bouger avec les fleches du clavier et zoomer avec la molette
    ce que j'ai mis dans ma fonction Personnage::set_position est vraiment moche, parceque je n'arrete pas dessayer plein de choses...sans jamais ibtenir le resultat voulu.
    je compte renommer la fonction en set_positionArme

    MERCiii!!

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Par défaut
    Et bien de rien ^^
    Seulement voila, j'ai pas pu télécharger tes fichiers , mais tu peux exposer tes sources sur le topic (et même un screen pour l'occasion ^^ ), toute fois, utilise la balise code (sous forme de #) :p
    Voila

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut
    ok mais j'ai plusieurs fichiers.
    un pour chacune de mes classes, si tu veux j'upload sur un autre serveur?
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    #include <string>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include "Personnage.h"
    #include "fonction.h"
    #include <math.h>
    #define pi 3.1416
     
    using namespace std;
    //constructeur par defaut
    Personnage::Personnage()
    {
        p_vitesseDeplacement = 0.1;
        p_repere = new Repere();
        p_arme = new Arme();
    }
    //méthode d'acces a la position
    coord Personnage::get_position()
    {
        return p_position;
    }
     
    //changer la position du personnage
    void Personnage::set_position(const SDL_KeyboardEvent & event)
    {
        if((event.type == SDL_KEYDOWN) && (event.keysym.sym==SDLK_LEFT))
        {
            p_position.x-=p_vitesseDeplacement;
        }
        if((event.type == SDL_KEYDOWN) && (event.keysym.sym==SDLK_RIGHT))
        {
            p_position.x+=p_vitesseDeplacement;
        }
        if((event.type == SDL_KEYDOWN) && (event.keysym.sym==SDLK_UP))
        {
            p_position.y+=p_vitesseDeplacement;
        }
        if((event.type == SDL_KEYDOWN) && (event.keysym.sym==SDLK_DOWN))
        {
            p_position.y-=p_vitesseDeplacement;
        }
     
    }
    //ici on determine la position de l'arme du personnage
    void Personnage::set_position(const SDL_MouseMotionEvent & event)
    {
        glPushMatrix();
        coord souri,origine,pos1,pos2;
        souri.x=event.x;
        souri.y=event.y;
        origine.x=640/2.0;
        origine.y=480/2.0;
        double rayon ;
        rayon = (sqrt(((souri.x-origine.x)*(souri.x-origine.x))+((souri.y-origine.y)*(souri.y-origine.y))))/25;
        double angle1 = pi-atan(2/10)+pi/2;    p_arme->set_position(cos(angle(origine,souri))*rayon,-sin(angle(origine,souri))*rayon,0);
        glPopMatrix();
     
    }
    //dessine une sphere au niveau du personnage
    void Personnage::dessiner()
    {
        glPushMatrix();
            glMatrixMode( GL_MODELVIEW );
            glTranslated(p_position.x,p_position.y,p_position.z);
            p_arme->dessiner();
            p_repere->dessiner();
        glPopMatrix();
        glLineWidth(3);
        glBegin(GL_LINES);
        glColor3ub(0,255,0);    glVertex3d(0,0,0);
                                    glVertex3d(p_position.x,p_position.y,0);
        glEnd();
        glLineWidth(1);
    }
    //change la vitesse de deplacement du Personnage
    void Personnage::set_vitesseDeplacement(double vitesse)
    {
        p_vitesseDeplacement = vitesse;
    }
     
    //destructeur Personnage
    Personnage::~Personnage()
    {
        delete p_repere;
        delete p_arme;
    }

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Par défaut
    Bon, en gros comme ça dans le lot, ta méthode dessiner possède quelques moins, je vais ajouter ce qu'il faut (ce qui me semble manquant)
    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
     
    void Personnage::dessiner()
    {
    glMatrixMode( GL_MODELVIEW );
        glPushMatrix();
        glLoadIdentity();        
            glTranslated(p_position.x,p_position.y,p_position.z);
            p_arme->dessiner();
            p_repere->dessiner();
        glPopMatrix();
        glLineWidth(3);
        glPushMatrix();
        glLoadIdentity()
        glBegin(GL_LINES);
        glColor3ub(0,255,0);    glVertex3d(0,0,0);
                                    glVertex3d(p_position.x,p_position.y,0);
        glEnd();
        glPopMatrix();
        glLineWidth(1);
    }
    Je constate par ta méthode (ton implémentation) que t'as pas bien pigé le principe des piles des matrices, ce n'est pas bien grave, je vais essayer de te l'expliquer:
    1-Tu choisis le mode de matrice (GL_MODELVIEW ou autre).
    2-Tu empiles la matrice courante (glPushMatrix()) selon le cas.
    3-Tu mets la matrice courante à l'identité (glLoadIdentity()).
    4-Tu fais ce que tu veux (glVertex3*, glDrawElements ...)
    5-Tu remets en place l'ancienne matrice (glPopMatrice()).

    ça marche comme ça tout le temps, si tu pop une matrice sans la pusher avant, t'auras une pile de matrices incohérente, et du coup, un résultat qui n'est pas souhaité (généralement n'importe quoi).
    Voila, revis un peu tes autres fonction dessiner

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut
    Citation Envoyé par F-fisher Voir le message
    Bon, en gros comme ça dans le lot, ta méthode dessiner possède quelques moins, je vais ajouter ce qu'il faut (ce qui me semble manquant)
    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
     
    void Personnage::dessiner()
    {
    glMatrixMode( GL_MODELVIEW );
        glPushMatrix();
        glLoadIdentity();        
            glTranslated(p_position.x,p_position.y,p_position.z);
            p_arme->dessiner();
            p_repere->dessiner();
        glPopMatrix();
        glLineWidth(3);
        glPushMatrix();
        glLoadIdentity()
        glBegin(GL_LINES);
        glColor3ub(0,255,0);    glVertex3d(0,0,0);
                                    glVertex3d(p_position.x,p_position.y,0);
        glEnd();
        glPopMatrix();
        glLineWidth(1);
    }
    Je constate par ta méthode (ton implémentation) que t'as pas bien pigé le principe des piles des matrices, ce n'est pas bien grave, je vais essayer de te l'expliquer:
    1-Tu choisis le mode de matrice (GL_MODELVIEW ou autre).
    2-Tu empiles la matrice courante (glPushMatrix()) selon le cas.
    3-Tu mets la matrice courante à l'identité (glLoadIdentity()).
    4-Tu fais ce que tu veux (glVertex3*, glDrawElements ...)
    5-Tu remets en place l'ancienne matrice (glPopMatrice()).

    ça marche comme ça tout le temps, si tu pop une matrice sans la pusher avant, t'auras une pile de matrices incohérente, et du coup, un résultat qui n'est pas souhaité (généralement n'importe quoi).
    Voila, revis un peu tes autres fonction dessiner
    oui en effet je vien de virer le popmatrix qui servai a rien je l'avais pas vu celui la :p

    ah voila j'ai changé pas mal de trucs, enfaite ce que j'ai fait c'est mis l'origine au centre de l'ecran, puis je determine l'angle entre lorigine et la souri ensuite je rotate mon arme avec cet angle la :
    je sais pas si c'est une bonne solution par contre.
    ( dans ma classe arme j'ai defini a_angle et lorsque je dessine mon arme je rotate selong l'angle de l'arme.)

    est-ce que tu saurai comment je peux faire pour faire en sorte que l'arme soit toujours sous le pointeur de ma souri tout en etant sur le plan XY?
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    #include <string>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include "Personnage.h"
    #include "fonction.h"
    #include <math.h>
    #define pi 3.1416
     
    using namespace std;
    //constructeur par defaut
    Personnage::Personnage()
    {
        p_vitesseDeplacement = 0.5;
        p_repere = new Repere();
        p_arme = new Arme();
    }
    //méthode d'acces a la position
    coord Personnage::get_position()
    {
        return p_position;
    }
     
    //changer la position du personnage
    void Personnage::set_position(const SDL_KeyboardEvent & event)
    {
        if((event.type == SDL_KEYDOWN) && (event.keysym.sym==SDLK_LEFT))
        {
            p_position.x-=p_vitesseDeplacement;
        }
        if((event.type == SDL_KEYDOWN) && (event.keysym.sym==SDLK_RIGHT))
        {
            p_position.x+=p_vitesseDeplacement;
        }
        if((event.type == SDL_KEYDOWN) && (event.keysym.sym==SDLK_UP))
        {
            p_position.y+=p_vitesseDeplacement;
        }
        if((event.type == SDL_KEYDOWN) && (event.keysym.sym==SDLK_DOWN))
        {
            if(p_position.y>0.8)
            p_position.y-=p_vitesseDeplacement;
        }
     
    }
    //ici on deterùine la position de l'arme du personnage
    void Personnage::set_position(const SDL_MouseMotionEvent & event)
    {
        coord souri,origine,pos1,pos2;
        souri.x=event.x;
        souri.y=event.y;
        origine.x=640/2.0;
        origine.y=480/2.0;
        p_arme->set_angle(angle(origine,souri)*180/pi);
    }
    //dessine une sphere au niveau du personnage
    void Personnage::dessiner()
    {
        glPushMatrix();
            glMatrixMode( GL_MODELVIEW );
            glLoadIdentity();
            glTranslated(p_position.x,p_position.y,p_position.z);
            p_arme->dessiner();
            p_repere->dessiner();
        glPopMatrix();
    }
    //change la vitesse de deplacement du Personnage
    void Personnage::set_vitesseDeplacement(double vitesse)
    {
        p_vitesseDeplacement = vitesse;
    }
     
    //destructeur Personnage
    Personnage::~Personnage()
    {
        delete p_repere;
        delete p_arme;
    }

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 77
    Par défaut
    Le plus simple serait de récupérer les coordonnées du curseur (via SDL ou autre), puis, de positionner ton arme dessus(glTranslatef) ou par le biais d'une matrice.
    Dans le lot, ça donne un truc de ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int mouseX, mouseY;
    //Code de récupération des coordonnées du curseur.
     
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    glTranslatef(position_du_perso.X + mouseX, position_du_perso.Y + mouseY, position_du_perso.Z)
    glBegin(); //Ou des VAs ou des VBOs :p
    draw();
    glEnd();
    glPopMatrix();
    //Le parametre position_du_perso.Z sert a mettre l'arme sur la même hauteur que le personnage ;)
    Voila, avec ça, tu devras pouvoir te débrouiller :p

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut
    mais les unités de la SDL et du terrain ne sont pas identiques...si la souri est a la position 200,365 sur mon ecran si je met ca en translated larme va sortir de l'ecran

  10. #10
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut Le mapping
    Salut;
    Si la largeur de ton ecran est 400, et que la position de la souris est 200
    tu fais un translatef de 200/400 qui est 0.5
    Meme chose pour la hauteur et la coordonnée Y

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Salut,

    Si tu veux projeter ton curseur dans ton monde, tu as juste a utiliser de la trigo de base et thales. Fais un dessin de ta pyramide de vue et tu recupere facilement cette formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ratio = 2* dist * tan(fovy) / screenHeight
    avec dist la distance du plan a la camera sur lequel on souhaite projeter le curseur, fovy l'angle de vue en y (ca marche aussi avec fovx et screenWidth)

    apres tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x = (cursorX - screenWidth / 2) * ratio
    y = -(cursorY - screenHeight / 2) * ratio
    z = -dist
    (on enleve la moitie de l'ecran sur x et y pour faire coincider l'origine des reperes)

    Ca c'est si le rapport entre fovx / fovy est égal au rapport screenWidth / screenHeight mais j'imagine que c'est le cas. Sinon il suffit de mettre a l'echelle l'autre coordonnée

    Et la tu as la projection dans le repere camera. Apres il suffit de multiplier ce point par la matrice de vue de la camera et la tu as la projection dans le repere monde. Comme apparemment ta matrice n'est que de la translation, simplement additionner la position de la camera a ce point fera l'affaire.

    La ca te donne le point sur un plan faisant face a la camera et a une distance définie. Si tu veux le point projeté sur un plan en particulier il faut determiner le point d'intersection entre une droite de vecteur (position_camera,point projeté a une distance arbitraire) et ton plan. 2 produits scalaires et un ratio te donnera l'intersection.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 06/04/2015, 02h02
  2. Souris bloquée SDL/OpenGL
    Par nightwar dans le forum SDL
    Réponses: 7
    Dernier message: 30/12/2008, 17h36
  3. Rapidité de SDL + openGL
    Par Clad3 dans le forum OpenGL
    Réponses: 23
    Dernier message: 27/02/2005, 08h27
  4. SDL+opengl+drivers nvidia 56.72 et plus
    Par ttf dans le forum OpenGL
    Réponses: 2
    Dernier message: 22/05/2004, 14h28
  5. [Debutant] Sdl & OpenGl link ne marche pas
    Par Riko dans le forum OpenGL
    Réponses: 9
    Dernier message: 18/02/2004, 16h13

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