GLUT: неправильные координаты мыши?

Используя SCREEN_WIDTH = 1200 и SCREEN_HEIGHT = 800.

Сначала я рисую прямоугольник на экране (x = 0, y = 0, w = 40, h = 40);

Затем я использую функцию handleMouse, чтобы вернуть координаты x и y того места, где нажата мышь.

Проблема в том, что когда программа запускается в не максимизированном оконном режиме, когда я нажимаю (в том, что кажется) в самом нижнем правом углу поля, возвращаемые координаты имеют вид x = 40, y = 32. Когда я думаю, что это должно возвращаться х = 40, у = 40.

Я не знаю, заключается ли проблема в том, что она отображается неправильно или функции возвращают неправильные значения x / y.

Мне кажется, я понимаю, как работают рендеринг, трансформация и glOrth в openGL, но я могу ошибаться. Я видел несколько предложений онлайн, говорящих, что Декор Windows (Используя Windows 7) может вызвать эту проблему, но очень мало объяснил и не дал решения.

Это весь мой исходный код. Я снял все с моей игры до основ, и проблема все еще сохраняется :(. Я добавил две картинки, чтобы люди могли видеть мою проблему. В НЕМАКСИМАЛЬНОМ ОКНЕ (верхнее изображение), при нажатии в правом нижнем углу возвращаемые координаты 41,32; координата y меньше, чем должна быть. И в МАКСИМАЛЬНОМ ОКНЕ (нижнее изображение), при нажатии на тот же угол, он возвращает правильные координаты 40, 40. Эти результаты возникают для обоих мой оригинальный исходный код и предложенный код genpfault.

// Оказывается, я не могу публиковать картинки :(, вместо этого ссылки.

не максимизированный оконный!

Развернуто окно!

main.cpp
int main( int argc, char* args[] )
{
//Initialize FreeGLUT
glutInit( &argc, args );

//Create OpenGL 2.1 context
glutInitContextVersion( 2, 1 );

//Create Double Buffered Window
glutInitDisplayMode( GLUT_DOUBLE );
glutInitWindowSize( SCREEN_WIDTH, SCREEN_HEIGHT );
glutCreateWindow( "OpenGL" );

//Do post window/context creation initialization
if( !initGL() )
{
printf( "Unable to initialize graphics library!\n" );
return 1;
}
//initGame();glutMouseFunc(handleMouse);glutDisplayFunc( render );glutMainLoop();

return 0;
}

Functions.h

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

bool initGL();

void render();

void handleMouse(int button, int state, int x, int y);

#endif

Functions.cpp

bool initGL()
{

//Initialize clear color
glClearColor( 0.f, 0.f, 0.f, 1.f );

//Check for error
GLenum error = glGetError();
if( error != GL_NO_ERROR )
{
//cout <<"Error initializing OpenGL! " << gluErrorString( error ) << endl;
return false;
}

return true;
}

void render()
{

//Clear color buffer
glClear( GL_COLOR_BUFFER_BIT );
glColor3f(1.f,1.f,1.f);

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(0, 41);
glVertex2f(41, 41);
glVertex2f(41, 0);
glEnd();

glutSwapBuffers();
}

void handleMouse(int button, int state, int x, int y)
{

std::cout << x << '\t' << y << std::endl;

}

constants.h

const int SCREEN_WIDTH = 1200;
const int SCREEN_HEIGHT = 800;

4

Решение

Это хорошо работает для меня на Windows 7 на Aero и Classic:

#include <GL/glut.h>
#include <iostream>

void render()
{
glClearColor( 0, 0, 0, 1 );
glClear( GL_COLOR_BUFFER_BIT );

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
double w = glutGet( GLUT_WINDOW_WIDTH );
double h = glutGet( GLUT_WINDOW_HEIGHT );
glOrtho(0, w, h, 0, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glColor3ub( 255, 255, 255 );
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(41, 0);
glVertex2f(41, 41);
glVertex2f(0, 41);
glEnd();

glutSwapBuffers();
}

void handleMouse(int button, int state, int x, int y)
{
std::cout << x << '\t' << y << std::endl;
}

int main( int argc, char* args[] )
{
glutInit( &argc, args );

glutInitDisplayMode( GLUT_DOUBLE );
glutInitWindowSize( 640, 480 );
glutCreateWindow( "OpenGL" );

glutMouseFunc(handleMouse);
glutDisplayFunc( render );
glutMainLoop();
return 0;
}

В частности, я добавил время выполнения glutGet() размер окна запрашивает render(),

0

Другие решения

Попробуйте переместить квадратор от края экрана, потому что когда я пытался сделать что-то подобное, край экрана был очень странным

glBegin(GL_QUADS);
glVertex2f(20,20);
glVertex2f(20, 61);
glVertex2f(61, 61);
glVertex2f(61, 20);
glEnd();
0

По вопросам рекламы [email protected]