Dans OpenGL, j'essaie de faire pivoter une caméra autour d'un point, la caméra étant à une distance r du point et face au point lorsqu'il tourne. En d'autres termes, je veux que la caméra se déplace le long de la circonférence d'un cercle à un rayon r du centre, la caméra faisant face au centre en tout point le long de la circonférence.
Disons que dans l'espace 3D, le centre du cercle est (3, 0, 3);
J'ai essayé:
// move to center of circle
glTranslatef(-3, 0, -3)
// move a distance away from the circle
glTranslatef(0, 0, r);
// rotate along the y "up" axis
glRotatef(CameraAngle, 0, 1, 0);
où CameraAngle correspond aux degrés déplacés autour du cercle.
Mon résultat final est que la caméra tourne toujours le long de l'origine, pas le centre du cercle. Quelqu'un peut-il m'aider à résoudre ce problème? Merci!
Vous devez soit:
ou:
gluLookAt
pour garder la caméra pointée vers le centre du cercle(*) les fonctions de rotation tournent normalement autour de l'origine. Pour faire pivoter un autre point P
, vous devez:
c'est un peu déroutant, mais je pense que vous devriez:
// move camera a distance r away from the center
glTranslatef(0, 0, -r);
// rotate
glRotatef(angley, 0, 1, 0);
glRotatef(anglex, 1, 0, 0);
// move to center of circle
glTranslatef(-cx, -cy, -cz)
notez que la commande ne doit PAS être modifiée.
Pourquoi se donner la peine de faire tourner l'appareil photo et de ne pas faire pivoter la scène elle-même?
C'est beaucoup plus simple. il suffit de faire pivoter la matrice modelview autour de l'origine. Vous obtiendrez exactement le même résultat.
Je trouve des problèmes comme celui-ci beaucoup plus faciles à résoudre avec gluLookAt (). Vous définissez un chemin pour la caméra (un cercle est facile!) Et gardez le point "central" fixe (c'est-à-dire la chose que vous regardez).
La seule astuce possible consiste à définir un bon vecteur up - mais généralement pas trop de travail. Si le chemin et le point cible sont dans le même plan, vous pouvez utiliser le même vecteur ascendant à chaque fois!