Souris-faites glisser l'objet dans OpenGL/GLUT
J'ai cherché toute la journée pour un tutoriel ou un exemple de code pour un programme simple - cliquez sur l'objet (comme un rectangle 2d par exemple) alors que vous maintenez et déplacez la souris de l'objet suit la souris, puis sur la libération de la souris de l'objet reste dans le nouvel emplacement. En d'autres termes, je veux comprendre comment faites glisser et déposez un objet avec les événements de souris.
Pourrait aider quelqu'un pour me pointer dans la bonne direction de toutes les sources d'informations utiles relatives à ce problème?
OriginalL'auteur sebjwallace | 2013-11-29
Vous devez vous connecter pour publier un commentaire.
Merci pour toutes les réponses jusqu'à présent.
J'ai travaillé sur la façon de le faire, donc je vais répondre à ma propre question.
J'utilise GLUT comme une souris gestionnaire:
En cliquant avec la souris et de la déplacer (glutMotionFunc) de la fonction de glissement est appelé.
Dans la fonction de glissement de la souris en coordonnées (x,y) sont convertis en Points de structure, tout en étant converties en coordonnées window.
Si la souris est à l'intérieur de la place, puis faites glisser le carré en modifiant les coordonnées et afficher de nouveau.
Je suis encore très nouveau pour OpenGL et C++ donc je ne m'excuse pour le désordre de codage. Je suis un peu frustrée en le faisant de cette manière que la redéfinition du carré fait il semble que le curseur s'aligne sur le centre. Je souhaite la bienvenue à d'autres solutions à ce problème et à la critique de mon code, à des fins d'apprentissage.
CODE (inclus glut et using namespace std):
OriginalL'auteur sebjwallace
OpenGL est seulement concerné par le processus de dessin. Tout le reste (entrée de la souris, l'objet de la cueillette, de la gestion des lieux/des altérations, etc.) est complètement à vous de les mettre en œuvre.
Voici une ébauche:
Installer un clic de souris gestionnaire d'événement (l'emplacement exact de la méthode à utiliser dépend de la structure utilisée et/ou le système d'exploitation)
Chez la souris, cliquez sur gestionnaire d'événements effectuer une opération de prélèvement. Cela implique généralement de unprojecting la souris la position de la fenêtre dans le monde de l'espace (voir gluUnproject), résultant en un ray. Test de chaque objet dans la scène si elle croise le ray; vous aurez à mettre en œuvre vous-même, parce que OpenGL attire tout les chose (il n'y a pas une telle chose comme une "scène" en OpenGL).
Si un objet a été choisi à l'inscrire pour être manipulé de la souris, faites glisser gestionnaire
à chaque fois une souris, faites glisser l'événement se produit ajuster la position de l'objet de données et de déclenchement de l'affichage OpenGL (vous toujours redessiner l'ensemble de la chose en OpenGL).
Lorsque la souris est relâchée annuler l'inscription de l'objet de la traînée de gestionnaire.
OriginalL'auteur datenwolf
Comme mentionné par d'autres, OpenGL ne gère pas la saisie de l'utilisateur. Vous souhaitez utiliser une bibliothèque pour que. Si vous voulez un plus tout autour de la solution, vous pouvez même utiliser une plus complète de rendu ou de la physique du moteur.
Pour la simple saisie de l'utilisateur, vous pouvez utiliser SDL (par exemple cette est pour l'entrée de la souris).
Pour plus d'2D complète des trucs, vous pouvez simplement utiliser Box2D. Ici sont tout un tas de tutoriels.
Les poids lourds de la solution est un moteur de rendu, comme Ogre3D ou Crystal space.
OriginalL'auteur Domi
Comme mentionné par d'autres, vous avez besoin d'un gestionnaire de la souris pour obtenir la position de la souris en premier. Ensuite, vous avez besoin d'un moyen pour ramasser un objet. Vous avez un peu d'options pour faire la cueillette dans OpenGL.
http://www.lighthouse3d.com/opengl/picking/index.php3?openglway
http://ogldev.atspace.co.uk/www/tutorial29/tutorial29.html
http://schabby.de/picking-opengl-ray-tracing/
Après cela, vous avez juste besoin de mettre à jour la position de l'objet selon le mouvement de la souris ou de l'accélération.
OriginalL'auteur sirian_ye