#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 вызовет ваш обратный вызов