Je comprends parfaitement que GLUT est limité et le problème suivant ne peut probablement pas être résolu avec OpenGL / GLUT, mais comme je ne sais pas exactement si cela peut ou non, je ferais mieux de demander. Peut-être que je fais quelque chose de mal ou que j'oublie quelque chose d'important. Ou probablement pas et GLUT ne va pas mieux que ça.
Mon problème est que je ne peux pas piéger la souris à l'intérieur de la fenêtre. Eh bien, en fait, je peux, le code ci-dessous fait exactement cela. Je piège la souris à l'intérieur de la fenêtre et je peux utiliser la souris librement pour faire tourner le monde. Le problème? Si je déplace la souris trop vite, je peux m'éloigner de la prison de fenêtre.
Existe-t-il un moyen de contourner cela avec OpenGL / GLUT ou la seule option est une autre bibliothèque ou de passer directement des appels à l'API Windows? Assez de mots, voici mon code actuel:
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);
Avec une recherche rapide dans la spécification GLUT , GLUT ne semble pas avoir de capacités de capture de souris. Le mieux que vous puissiez faire (comme vous semblez le faire) est de déformer le curseur vers le centre et d'espérer que l'utilisateur n'est pas assez rapide (ou n'utilise pas de tablette) =)
Vous pouvez également basculer vers SDL ou SFML , car GLUT est uniquement conçu pour les tests, pas pour les "vrais" logiciels.
la source
Essayez une nouvelle version de freeglut; Ma v2.6, piège le curseur avec glutWarpPointer sans aucune possibilité d'évasion par la souris.
la source
Dans mon cas, modifiez
à quelque chose comme
parfaitement résolu le problème.
Le problème est dû au fait que glutWarpPointer déclenche un autre événement de mouvement passif vers (centerX, centerY), ce qui entraîne une boucle et / ou inonde la file d'attente des événements. Pour l'éviter, vérifiez simplement si la souris est à (centerX, centerY), si c'est le cas, ne vous déformez pas.
la source