Entiendo perfectamente que GLUT es limitado y el siguiente problema probablemente no se pueda resolver con OpenGL / GLUT, pero como no sé exactamente si puede o no, es mejor que pregunte. Tal vez estoy haciendo algo mal u olvidando algo importante. O probablemente no, y GLUT no se pone mejor que esto.
Mi problema es que no puedo atrapar el mouse dentro de la ventana. Bueno, en realidad puedo, el código a continuación hace exactamente eso. Atrapo el mouse dentro de la ventana y puedo usar el mouse libremente para girar el mundo. ¿El problema? Si muevo el mouse demasiado rápido puedo salir de la prisión de la ventana.
¿Hay alguna forma de evitar esto con OpenGL / GLUT o la única opción es otra biblioteca o hacer algunas llamadas directamente a la API de Windows? Palabras suficientes, aquí está mi código actual:
void processPassiveMouseMotion(int x, int y) {
static int centerX = glutGet(GLUT_WINDOW_WIDTH) / 2;
static int centerY = glutGet(GLUT_WINDOW_HEIGHT) / 2;
CameraAngle.x = -1.0f * (y - centerY);
CameraAngle.y = -1.0f * (x - centerX);
if(CameraAngle.x != 0.0f || CameraAngle.y != 0.0f) {
SceneCamera.Rotate(CameraAngle);
glutPostRedisplay();
glutWarpPointer(centerX, centerY);
}
}
glutPassiveMotionFunc(processPassiveMouseMotion);
Con una búsqueda rápida a través de la especificación GLUT , GLUT no parece tener capacidades de captura de mouse. Lo mejor que puede hacer (como parece estar haciendo) es deformar el cursor hacia el centro y esperar que el usuario no sea lo suficientemente rápido (o no esté usando una tableta) =)
O bien, puede cambiar a SDL o SFML , ya que GLUT solo está diseñado para pruebas, no para software "real".
fuente
Pruebe una versión más nueva de freeglut; Mi v2.6, atrapa el cursor con glutWarpPointer sin ninguna posibilidad de escapar con el mouse.
fuente
En mi caso, modificar
a algo como
Resuelto perfectamente el problema.
El problema es causado por glutWarpPointer que dispara otro evento de movimiento pasivo a (centerX, centerY), lo que resulta en un bucle y / o inunda la cola de eventos. Para evitarlo, simplemente verifique si el mouse está en (centerX, centerY), si es así, no se deforme.
fuente