web-dev-qa-db-fra.com

OpenGL faisant tourner une caméra autour d'un point

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!

27
Bryan Denny

Vous devez soit:

  • faire pivoter la caméra autour de l'origine, puis la traduire (*)

ou:

  • utilisez 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:

  • traduire (-P)
  • tourner
  • traduire (P)
25
Alnitak

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.

10
neoedmund

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.

2
shoosh

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!

1
Drew Hall