Welcome, Guest. Please login or register. Did you miss your activation email?

Author Topic: Correct mouse co-ordinates from SFML and using OpenGL  (Read 2198 times)

0 Members and 1 Guest are viewing this topic.

Sour-Lemon

  • Newbie
  • *
  • Posts: 3
    • View Profile
Correct mouse co-ordinates from SFML and using OpenGL
« on: October 26, 2010, 12:34:58 am »
My problem is related to getting the correct mouse co-ordinates from SFML while using OpenGL.

Basically I am making a polygon rotate on the Z axis to look at the current cursor position.

You can also move the polygon around the screen with the WASD keys.

If the polygon stays in the center of the screen everything works great, but my problem appear when I move the polygon to, for example, the top left of the screen.

Basically it is like it is getting the incorrect mouse co-ordinates and is overshooting the position of the actual mouse cursor.

I used GL_LINES to create a kind of crosshair to see where my variables thought the mouse cursor was, and it is overshooting the actual position.

To get the current mouse co-ordinates I am using this:

Code: [Select]
mouseX = Input.GetMouseX()-App.GetWidth()/2.f;
mouseY = Input.GetMouseY()-App.GetHeight()/2.f;


Does anybody know what my problem could be?
I have been looking at this almost all day and have lost my ability to think properly.

For the sake of providing all the information I can, below is my entire source code.
Also, if I provide my source then for those who are interested in helping, you can compile and see what I mean, since it is a bit hard for me to explain.

Sorry for it being so messy - I am new to this after all :)

Code: [Select]
#include <SFML/Window.hpp>
#include <iostream>
#include <cmath>

const float PI = 3.14159265f;

int main() {
    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);

    GLfloat currentPosX = 0.f;
    GLfloat currentPosY = 0.f;

    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;
        }

        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
        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;
}

NoIdea

  • Full Member
  • ***
  • Posts: 149
    • View Profile
Correct mouse co-ordinates from SFML and using OpenGL
« Reply #1 on: November 03, 2010, 09:25:15 am »
Shouldn't you be using convertcoords ?

Groogy

  • Hero Member
  • *****
  • Posts: 1469
    • MSN Messenger - groogy@groogy.se
    • View Profile
    • http://www.groogy.se
    • Email
Correct mouse co-ordinates from SFML and using OpenGL
« Reply #2 on: November 03, 2010, 11:37:00 am »
You have to remember that OpenGL's coordinates system can be set to however you want it. SFML's don't, ít is based on pixels and the origin is always on the top-left corner. So either you have to make OpenGL's coordinate system to match the pixels or you have to convert the mouse coordinates from pixels coordinate system to opengl's.
Developer and Maker of rbSFML and Programmer at Paradox Development Studio