我的问题与使用 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;
}
最佳答案
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());
关于c++ - 使用 OpenGL 在 SFML 中获取正确的鼠标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4021793/