3

我的问题与使用 OpenGL 时从 SFML 获取正确的鼠标坐标有关。

基本上我正在让一个多边形在 Z 轴上旋转以查看当前光标位置。

您还可以使用 WASD 键在屏幕上移动多边形。

如果多边形停留在屏幕的中心,一切都很好,但是当我将多边形移动到例如屏幕的左上角时,我的问题就会出现。

基本上,它就像获得了不正确的鼠标坐标并且超出了实际鼠标光标的位置。

我使用 GL_LINES 创建了一种十字准线,以查看我的变量认为鼠标光标在哪里,并且它超出了实际位置。

要获取当前的鼠标坐标,我正在使用这个:

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

有人知道我的问题可能是什么吗?

为了提供我能提供的所有信息,下面是我的完整源代码。另外,如果我为那些有兴趣提供帮助的人提供我的源代码,那么您可以编译它并了解我的意思,因为这对我来说有点难以解释。

很抱歉它太乱了——毕竟我是新手:)

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

1 回答 1

3

Input.GetMouse?例如,为您提供窗口空间中的坐标,您需要将它们转换为模型空间。我可能是错的,但我的懒惰修复是在第一象限中绘制我的 2D 场景并通过

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

通过根据窗口的尺寸设置投影,您总是可以使您的编码更容易:

glMatrixMode(GL_PROJECTION);
gluOrtho2D(0, App.GetWidth(), 0, App.GetHeight()); 
于 2010-10-26T09:01:29.053 回答