OpenGL с использованием мыши для перемещения в стиле FPS

#c #opengl #glut

#c #opengl #перенасыщение

Вопрос:

Когда я запускаю свою программу и начинаю перемещать мышь, на самом деле ничего не происходит. У меня wasd работает нормально, но, как уже упоминалось, у меня проблемы с движением мыши.

Я считаю, что моя проблема в том, что он всегда сбрасывается в центр, но я не уверен.

 #define FPS 60
#define TO_RADIANS 3.14/180.0
float pitch = 0.0, yaw= 0.0;
float cX=0.0,cZ=0.0;
const int width = 16*50;
const int height = 9*50;
struct Motion
{
    bool Forward,Backward,Left,Right;
}motion = {false,false,false,false};

void init()
{
    glutSetCursor(GLUT_CURSOR_NONE);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glutWarpPointer(width/2,height/2);
}

void camera()
{

    if(motion.Forward)
    {
        cX  = cos((yaw 90)*TO_RADIANS)/5.0;
        cZ -= sin((yaw 90)*TO_RADIANS)/5.0;
    }
    if(motion.Backward)
    {
        cX  = cos((yaw 90 180)*TO_RADIANS)/5.0;
        cZ -= sin((yaw 90 180)*TO_RADIANS)/5.0;
    }
    if(motion.Left)
    {
        cX  = cos((yaw 90 90)*TO_RADIANS)/5.0;
        cZ -= sin((yaw 90 90)*TO_RADIANS)/5.0;
    }
    if(motion.Right)
    {
        cX  = cos((yaw 90-90)*TO_RADIANS)/5.0;
        cZ -= sin((yaw 90-90)*TO_RADIANS)/5.0;
    }

    /*limit the values of pitch
      between -60 and 70
    */
    if(pitch>=70)
        pitch = 70;
    if(pitch<=-60)
        pitch=-60;

    glRotatef(-pitch,1.0,0.0,0.0); // Along X axis
    glRotatef(-yaw,0.0,1.0,0.0);    //Along Y axis

    glTranslatef(-cX,0.0,-cZ);
}
void timer()
{
    glutPostRedisplay();
    glutWarpPointer(width/2,height/2);
    glutTimerFunc(1000/FPS,timer,0);
}


void keyboard(unsigned char key,int x,int y)
{
    switch(key)
    {
    case 'W':
    case 'w':
        motion.Forward = true;
        break;
    case 'A':
    case 'a':
        motion.Left = true;
        break;
    case 'S':
    case 's':
        motion.Backward = true;
        break;
    case 'D':
    case 'd':
        motion.Right = true;
        break;
    }
}
void keyboard_up(unsigned char key,int x,int y)
{
    switch(key)
    {
    case 'W':
    case 'w':
        motion.Forward = false;
        break;
    case 'A':
    case 'a':
        motion.Left = false;
        break;
    case 'S':
    case 's':
        motion.Backward = false;
        break;
    case 'D':
    case 'd':
        motion.Right = false;
        break;
    }
}
int main(int argc,char**argv)
{
    glutInit(amp;argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(width, height);
    glutCreateWindow("Jameson Marzak FPS");
    glutFullScreen();
    sky[0] = LoadTexBMP("sky0.bmp");
    sky[1] = LoadTexBMP("sky1.bmp");
    sky[2] = LoadTexBMP("grass.bmp");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    //glutPassiveMotionFunc(passive_motion);
    glutTimerFunc(0,timer,0);    //more info about this is given below at definition of timer()
    glutKeyboardFunc(keyboard);
    glutKeyboardUpFunc(keyboard_up);

    glutMainLoop();
    return 0;
}
 

Комментарии:

1. Я не вижу никакого кода для обработки событий перемещения мыши, так как же он должен двигаться

2. Совет: если у вас есть M_PI , используйте его, а не только 3.14 . Если у вас его нет, используйте лучшее приближение, чем то, что далеко от того, что такое Pi.

3. это 2D или 3D?

Ответ №1:

Вам необходимо настроить обратный вызов с помощью glut для обработки вводов мыши: glutMouseFunc

затем выясните, как рассчитать правильное отклонение / высоту от мыши x и мыши y, с помощью которых glut вызовет ваш обратный вызов