2010-10-26 20 views
2

Mon problème est lié à l'obtention des bonnes coordonnées de souris à partir de SFML lors de l'utilisation d'OpenGL.Obtenir la bonne position de la souris dans SFML avec OpenGL

Fondamentalement, je fais tourner un polygone sur l'axe Z pour regarder la position actuelle du curseur.

Vous pouvez également déplacer le polygone autour de l'écran avec les touches WASD. Si le polygone reste au centre de l'écran, tout fonctionne très bien, mais mes problèmes apparaissent lorsque je déplace le polygone, par exemple, en haut à gauche de l'écran. Fondamentalement, c'est comme si elle obtenait des coordonnées de souris incorrectes et dépassait la position du curseur de la souris réelle.

J'ai utilisé GL_LINES pour créer une sorte de réticule pour voir où mes variables pensaient que le curseur de la souris était, et il dépasse la position réelle.

Pour obtenir la souris actuelle coordonnées J'utilise ceci:

mouseX = Input.GetMouseX()-App.GetWidth()/2.f; 
mouseY = Input.GetMouseY()-App.GetHeight()/2.f; 

Quelqu'un sait-il ce que mon problème pourrait être? Par souci de fournir toutes les informations que je peux, voici mon code source complet. Aussi, si je fournis ma source alors pour ceux qui sont intéressés à aider, vous pouvez le compiler et voir ce que je veux dire, car c'est un peu difficile pour moi d'expliquer.

Désolé pour qu'il soit tellement en désordre - Je suis nouveau à cela après tout :)

#include <SFML/Window.hpp> 
#include <iostream> 
#include <cmath> 

const float PI = 3.14159265f; 

int main() { 
    // Angle of rotation for the polygon 
    float angle = 0.f; 

    sf::Window App(sf::VideoMode(800, 600, 32), "SFML OpenGL"); 

    glClearDepth(1.f); 
    glClearColor(0.f, 0.f, 0.f, 0.f); 

    glEnable(GL_DEPTH_TEST); 
    glDepthMask(GL_TRUE); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(90.f, 1.2f, 1.f, 500.f); 

    // Current position of the polygon (used in glTranslatef) 
    GLfloat currentPosX = 0.f; 
    GLfloat currentPosY = 0.f; 

    // Current position of the mouse cursor 
    float mouseX = 0.f; 
    float mouseY = 0.f; 

    const sf::Input &Input = App.GetInput(); 

    App.SetFramerateLimit(30); 

    while (App.IsOpened()) { 
     sf::Event Event; 
     while (App.GetEvent(Event)) { 
      if (Event.Type == sf::Event::Closed) { 
       App.Close(); 
      } 
      if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape)) { 
       App.Close(); 
      } 

      if (Event.Type == sf::Event::Resized) { 
       glViewport(0, 0, Event.Size.Width, Event.Size.Height); 
      } 
     } 

     App.SetActive(); 

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     if(Input.IsKeyDown(sf::Key::W)) { 
      currentPosY += 3.f; 
     } 
     if(Input.IsKeyDown(sf::Key::S)) { 
      currentPosY -= 3.f; 
     } 
     if(Input.IsKeyDown(sf::Key::D)) { 
      currentPosX += 3.f; 
     } 
     if(Input.IsKeyDown(sf::Key::A)) { 
      currentPosX -= 3.f; 
     } 

     // Minus half of the screen width and height 
     // because the OpenGL origin is in the middle of the screen 
     mouseX = Input.GetMouseX()-App.GetWidth()/2.f; 
     mouseY = Input.GetMouseY()-App.GetHeight()/2.f; 

     // I don't know any better way to flip the Y axis so this is what I did 
     if(mouseY >= 0) { 
      mouseY = -(mouseY); 
     } 
     else { 
      mouseY = abs(mouseY); 
     } 

     // Calculate the angle which the polygon needs to rotate at 
     angle = atan2(mouseY - currentPosY, mouseX - currentPosX)*180/PI; 

     // Print variables to console to try and figure out what I'm doing wrong 
     std::cout << mouseX << "(" << currentPosX << ")" << ", " << mouseY << "(" << currentPosY << ")" << " - " << angle << std::endl; 

     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     glTranslatef(currentPosX, currentPosY, -200.f); 
     glRotatef(angle, 0.f, 0.f, 1.f); 

     // Polygon 
     glBegin(GL_QUADS); 

      glVertex3f(-25.f, -25.f, -50.f); 
      glVertex3f(25.f, -25.f, -50.f); 
      glVertex3f(25.f, 25.f, -50.f); 
      glVertex3f(-25.f, 25.f, -50.f); 

     glEnd(); 

     glLoadIdentity(); 
     glTranslatef(currentPosX, currentPosY, -200.f); 

     // Axis on polygon 
     glBegin(GL_LINES); 

      glVertex3f(-70.f, 0.f, -50.f); 
      glVertex3f(70.f, 0.f, -50.f); 

      glVertex3f(0.f, -70.f, -50.f); 
      glVertex3f(0.f, 70.f, -50.f); 

     glEnd(); 

     glLoadIdentity(); 
     glTranslatef(currentPosX, currentPosY, -200.f); 
     glRotatef(angle, 0.f, 0.f, 1.f); 

     // Line to indicate the direction of the polygon 
     glBegin(GL_LINES); 

      glVertex3f(0.f, 0.f, -50.f); 
      glVertex3f(50.f, 0.f, -50.f); 

     glEnd(); 

     glLoadIdentity(); 
     glTranslatef(0.f, 0.f, -200.f); 

     // Screen axis 
     glBegin(GL_LINES); 

      glVertex3f(-400.f, 0.f, -60.f); 
      glVertex3f(400.f, 0.f, -60.f); 

      glVertex3f(0.f, 300.f, -60.f); 
      glVertex3f(0.f, -300.f, -60.f); 

     glEnd(); 

     glLoadIdentity(); 
     glTranslatef(mouseX, mouseY, -200.f); 

     // Cursor position 
     glBegin(GL_LINES); 

      glVertex3f(-10.f, 0.f, -60.f); 
      glVertex3f(10.f, 0.f, -60.f); 

      glVertex3f(0.f, 10.f, -60.f); 
      glVertex3f(0.f, -10.f, -60.f); 

     glEnd(); 

     App.Display(); 
    } 

    return 0; 
} 

Répondre

3

Input.GetMouse? vous donne coords dans, par exemple, la fenêtre de l'espace et vous en avez besoin de les transformer pour modéliser l'espace. Je peux me tromper, mais mon fix paresseux serais dessiner ma scène 2D dans le premier quadrant et obtenir la position de la souris par

(x, y) = (mouse_x, mouse_y)/(window_width, window_height) 
     * (viewport_width, viewport_height) 

Vous pouvez toujours rendre votre code plus facile par la configuration de votre projection en conséquence aux dimensions de la fenêtre:

glMatrixMode(GL_PROJECTION); 
gluOrtho2D(0, App.GetWidth(), 0, App.GetHeight());