如何正确地将鼠标坐标转换为opengl坐标?

时间:2019-06-21 10:34:17

标签: c++ opengl freeglut

我需要为一个大学的项目做游戏。一切正常,唯一的问题是将鼠标坐标(左上角的0,0)转换为openGL坐标(屏幕中心的0,0)。

在课堂上,我们得到了这样做的公式: double openglX =((double)x-[半水平分辨率])/ [水平res] * [水平opengl范围]; double openglY =-(((double)y-[half vertical res])/ [vertical res] * [vertical opengl range];


#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 :(得分:0)

我注意到的第一件事是您的方法move_ship()中有一些神奇的数字。您的回调resize()可以更改宽度和高度,因此在move_ship()中使用常量对我来说似乎是个错误。

答案 1 :(得分:0)

公式应为

df.loc[df.Data1.isin(df.loc[df.duplicated(),'Data1'])].drop_duplicates()
  Data1  Data2
2     B  first
3     B   last
6     D  first
7     D   last