Question

Sous OpenGL, j'essaie de faire pivoter une caméra autour d'un point, la caméra se trouvant à une distance de r du point et faisant face au point lorsqu'elle tourne. En d’autres termes, je souhaite que la caméra bouge le long de la circonférence d’un cercle à un rayon r du centre, avec la caméra tournée vers le centre en tout point 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 du centre du cercle. Quelqu'un peut-il m'aider à résoudre ce problème? Merci!

Était-ce utile?

La solution

Vous devez soit:

  • faites pivoter la caméra autour de l'origine, puis traduisez-la (*)

ou:

  • utilisez gluLookAt pour que la caméra soit dirigé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)
  • faire pivoter
  • traduire (P)

Autres conseils

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 l'ordre ne doit PAS être changé.

Pourquoi se donner la peine de tourner la caméra sans tourner la scène elle-même?
C'est beaucoup plus simple. faites simplement pivoter la matrice modelview autour de l'origine. Vous obtiendrez exactement le même résultat.

Je trouve les 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 "centre" le point fixe (c'est-à-dire la chose que vous regardez).

Le seul truc possible est de définir un bon vecteur de montée - mais pas trop de travail. Si le chemin et le point cible se trouvent dans le même plan, vous pouvez utiliser le même vecteur de montée à chaque fois!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top