OpenGL faisant tourner une caméra autour d'un point
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!
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
(*) 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!