Как правильно перевести координаты мыши в координаты opengl? - PullRequest
0 голосов
/ 21 июня 2019

Мне нужно сделать игру для проекта в колледже. Все работает нормально, единственная проблема - перевод координат мыши (0,0 в верхнем левом углу) в координаты openGL (0,0 в центре экрана).

В классе мы получили формулу для этого: double openglX = ((double) x - [полу горизонтальное разрешение]) / [горизонтальное разрешение] * [горизонтальный диапазон opengl]; double openglY = - ((double) y - [полу вертикальное разрешение]) / [вертикальное разрешение] * [диапазон вертикального открытия];


#include <iostream>
#include <list>
#include <vector>
#include <cstdlib>
#include <ctime>

#define NDEBUG
#include <GL/freeglut.h>

const int GAME_LOGIC_REFRESH_TIME = 10;



/* GLUT callback Handlers */
void resize(int width, int height)
{
    const float ar = (float)width / (float)height;
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
    gluLookAt(0, 0, 45, 0, 0, 0, 0, 1, 0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void gameLogic(int value)
{
    if (value == 0)
    {

    }
    else if(value==1)
    {

    }   
}
void move_ship(int x, int y)
{
    double openglX = ((double)x - 600) / 1200 * 46;
    double openglY = -((double)y - 500) / 1000 * 38;
    player.SetPosition(openglX);


}

/* helper functions for settings options and parameters */
void InitGLUTScene(const char* window_name)
{
    glutInitWindowSize(1200, 1000);
    glutInitWindowPosition(40, 40);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);

    glutCreateWindow(window_name);

    glClearColor(0, 0, 0, 0);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
}

void SetCallbackFunctions()
{
    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutIdleFunc(idle);
    glutTimerFunc(GAME_LOGIC_REFRESH_TIME, gameLogic, 0);
    glutMouseFunc(mouse);
    glutPassiveMotionFunc(move_ship);
}

void SetObjectsPositions()
{

}

int main(int argc, char *argv[])
{
    srand(time(NULL));

    glutInit(&argc, argv);
    InitGLUTScene("Space Invaders");

    SetCallbackFunctions();
    SetObjectsPositions();

    glutMainLoop();

    return 0;
}

Расчеты в move_ship довольно хороши близко к центру экрана, но по краям они достаточно смещены, так что это большая проблема, и игрок не может добраться до края экрана.

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

Формула должна быть

void mouseToGl(
    double& x, double& y, // output GL coords
    double mx, double my, // mouse coords in pixels (0,0 is top left)
    double W, double H)   // screen dimension width, height
{
    x = 2.0 * (mx / W) - 1.0;
    y = 2.0 * ((my - W + 1) / W) - 1.0;
}
0 голосов
/ 21 июня 2019

Первое, что я заметил, - у вас есть магические числа в вашем методе move_ship ().Ваш обратный вызов resize () может изменять ширину и высоту, поэтому использование констант в move_ship () мне кажется ошибкой.

...