OpenGL - déplacer la caméra avec la souris
Je ne sais pas exactement comment expliquer cela, mais j'espère que vous comprendrez ce que je veux dire.
Fondamentalement, j'ai dessiné un cube et faire glisser la souris autour de vous pour voir tous les côtés.
Rotation uniquement à l'horizontale ou à la verticale est bien, mais si j'essaie de les combiner ensuite les choses vont un peu bizarre.
par exemple, si j'effectue une rotation de 180 degrés à la verticale (pour obtenir 'upside down'), puis faites glisser la souris horizontalement puis le cube tourne dans la direction opposée au mouvement de la souris.
C'est le code correspondant:
double camera_angle_h = 0;
double camera_angle_v = 0;
int drag_x_origin;
int drag_y_origin;
int dragging = 0;
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(0.0, 0.0, 25.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glRotated(camera_angle_v, 1.0, 0.0, 0.0);
glRotated(camera_angle_h, 0.0, 1.0, 0.0);
draw_cube();
glFlush();
glutSwapBuffers();
}
void mouse_click(int button, int state, int x, int y) {
if(button == GLUT_LEFT_BUTTON) {
if(state == GLUT_DOWN) {
dragging = 1;
drag_x_origin = x;
drag_y_origin = y;
}
else
dragging = 0;
}
}
void mouse_move(int x, int y) {
if(dragging) {
camera_angle_v += (y - drag_y_origin)*0.3;
camera_angle_h += (x - drag_x_origin)*0.3;
drag_x_origin = x;
drag_y_origin = y;
}
}
OriginalL'auteur | 2009-09-15
Vous devez vous connecter pour publier un commentaire.
Vous utilisez des angles d'euler et donc, le problème de cardan de verrouillage.
Une solution simple est de stocker de rotation à l'intérieur de votre modèle de matrice et de faire tourner cette matrice au lieu de stocker seulement 2 angles (à l'aide de la matrice de la multiplication).
Regarder dans cette réponse pour plus d'informations:
Posera-t-il à cardan-lock?
plus en plus complexes, la solution est de stocker les quaternions
OriginalL'auteur Peter Parker
Comme d'autres l'ont dit, l'utilisation des quaternions est la solution. Ken Shoemake offre d'excellentes code pour la conversion entre les quaternions et les angles d'Euler dans les graphiques gemmes IV (voir exemples de code ici, voir "Euler Angle de Conversion"). Il a aussi des conversions et de la rotation des matrices.
Si vous voulez faire une rotation à l'aide de la souris, sans doute le "gold standard" est la "Arcball" interface décrite par Shoemake dans les Graphiques Gemmes IV (avalable ici, pour l'instant). Une version améliorée de l'Arcball est distribué avec la bibliothèque Glut "trackball", qui offre une interface plus intuitive, lorsque les clics se produisent en dehors de la sphère en rotation. Il a été écrit par Gavin Bell, et est disponible ici et ici. Bell trackball est l'approche utilisée par le Projet Blender, et je présume que les logiciels commerciaux utiliser quelque chose de similaire.
OriginalL'auteur Kyle Simek
Il semble que si votre application est la souffrance de gimbal lock. Il existe quelques moyens pour y remédier, le plus simple est de fixer le permis de rotation.
OriginalL'auteur unwind
La plupart des applications permettent seulement jusqu'à 90 degrés vers le haut/vers le bas de rotation; autrement, la vue est à l'envers et oui de gauche à droite est inversé. Pour la plupart des applications, il ne fait pas de sens de rotation de sorte que vous êtes en train de regarder le monde à l'envers.
Aussi, ce n'est pas gimbal lock, comme les deux autres answerers dit; gimbal lock exige trois (ou plus?) les axes de rotation. Simplement dit, le gimbal lock est quand un axe a été tourné de 90 degrés dans les deux directions, de sorte que les deux autres axes de la ligne; et puis une rotation autour de l'un des deux autres axes provoque le même effet. L'avion de l'image à mi-chemin en bas de la page de wikipedia montre bien.
De toute façon, votre meilleur pari est de serrage
camera_angle_v
à la plage (-90,90); en d'autres termes, chaque fois que vous ajoutez ou soustrayez à elle, puis vérifier si elle est supérieure à 90 et définissez-la à 90, ou si c'est moins de -90 puis le mettre à -90.Aussi juste pour remarque, j'ai effectivement eu des problèmes dans le passé, lorsqu'une v angle est exactement de 90 ou -90, alors je pince à +/- 89.9 à la place.
OriginalL'auteur Ricket
Puisque vous êtes à l'aide de GLUT, vous avez probablement le code de traiter avec ce sur votre système. Prendre un coup d'oeil pour la boule de commande.c et de la boule de commande.h les fichiers source. Googler pour eux aussi trouver la source. C'est une simple bibliothèque pour vous aider avec ce problème précis. Certains SURABONDANCE d'exemples d'utilisation sont dinospin, rebond, etc.
OriginalL'auteur goger