Entendo perfeitamente que o GLUT é limitado e o seguinte problema provavelmente não pode ser resolvido com o OpenGL / GLUT, mas como não sei exatamente se pode ou não, é melhor perguntar. Talvez esteja fazendo algo errado ou esquecendo algo importante. Ou provavelmente não, e o GLUT não fica melhor que isso.
Meu problema é que não consigo prender o mouse dentro da janela. Bem, na verdade, eu posso, o código abaixo faz exatamente isso. Prendo o mouse dentro da janela e posso usá-lo livremente para girar o mundo. O problema? Se mover o mouse muito rápido, posso sair da prisão da janela.
Existe uma maneira de contornar isso com o OpenGL / GLUT ou a única opção é outra biblioteca ou fazer algumas chamadas diretamente para a API do Windows? Palavras suficientes, aqui está o meu código atual:
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);
Com uma pesquisa rápida nas especificações do GLUT , o GLUT parece não ter recursos de captura de mouse. O melhor que você pode fazer (como você parece estar fazendo) é deformar o cursor para o centro e esperar que o usuário não seja rápido o suficiente (ou não esteja usando um tablet) =)
Ou você pode mudar para SDL ou SFML , pois o GLUT foi projetado apenas para teste, não para software "real".
fonte
Experimente uma versão mais recente do freeglut; Meu v2.6, prende o cursor com glutWarpPointer sem nenhuma possibilidade de escapar pelo mouse.
fonte
No meu caso, modifique
para algo como
resolveu perfeitamente o problema.
O problema é causado pelo glutWarpPointer disparar outro evento de movimento passivo para (centerX, centerY), o que resulta em um loop e / ou inunda a fila de eventos. Para evitá-lo, basta verificar se o mouse está em (centerX, centerY); se estiver, não entorte.
fonte