Comment puis-je empêcher la déformation lors de la rotation autour de la ligne de visée dans OpenGL?

StackOverflow https://stackoverflow.com/questions/79360

  •  09-06-2019
  •  | 
  •  

Question

J'ai dessiné une ellipse dans le plan XZ, puis ma perspective est légèrement orientée vers le haut sur l'axe des Y et de nouveau sur le Z, en regardant le centre de l'ellipse sous un angle de 45 degrés, en utilisant gluPerspective () pour définir mon visionnage frustrum.

 ellipse

Sans rotation, l'axe principal de l'ellipse s'étend sur la largeur de ma fenêtre. Lorsque je tourne de 90 degrés autour de ma ligne de mire, l'axe principal de l'ellipse couvre maintenant la hauteur de ma fenêtre, déformant ainsi l'ellipse (dans ce cas, la rendant moins excentrique).

 ellipse pivotée

Que dois-je faire pour empêcher cette déformation (ou au moins en tenir compte), de sorte que la rotation autour de la ligne de visée préserve le principal axe perçu de l’ellipse (dans ce cas, elle dépasse le viewport)?

Était-ce utile?

La solution

On dirait que vous utilisez 1.0 comme aspect lorsque vous appelez gluPerspective (). Vous devriez utiliser largeur / hauteur. Par exemple, si votre fenêtre d'affichage est 640x480, vous utiliserez 1,33333 comme argument d'aspect.

Autres conseils

Selon les spécifications OpenGL:

void gluPerspective( GLdouble fovy,
                     GLdouble aspect,
                     GLdouble zNear,
                   GLdouble zFar )

L'aspect doit être fonction de la largeur et de la hauteur de votre fenêtre. Spécifiquement largeur divisée par hauteur (mais attention à la division par zéro).

Vous utilisez peut-être 1 comme aspect non précis à moins que votre fenêtre ne soit un carré.

Il semble que le paramètre d'aspect de votre appel gluPerspective doive être modifié. Voir la page d'aide . Si votre fenêtre était physiquement carrée, le rapport de format serait 1 et votre problème disparaîtrait. Cependant, votre fenêtre est rectangulaire et le tronc de visualisation ne doit pas être carré.

Définissez le rapport de format sur window_width / window_height, et votre ellipse devrait sembler correcte. Notez que vous devrez le mettre à jour chaque fois que la fenêtre sera redimensionnée. Si vous utilisez GLUT, définissez un glutReshapeFunc et recalculez la matrice de projection à cet endroit.

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