¿Cómo puedo evitar la deformación al girar alrededor de la línea de visión en OpenGL?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Dibujé una elipse en el plano XZ y configuré mi perspectiva ligeramente hacia arriba en el eje Y y nuevamente en el Z, mirando el centro de la elipse desde un ángulo de 45 grados, usando gluPerspective() para configurar mi frustrum de visualización. .

ellipse

Sin girar, el eje mayor de la elipse abarca todo el ancho de mi ventana gráfica.Cuando giro 90 grados alrededor de mi línea de visión, el eje principal de la elipse ahora abarca la altura de mi ventana gráfica, deformando así la elipse (en este caso, haciéndola parecer menos excéntrica).

rotated ellipse

¿Qué debo hacer para evitar esta deformación (o al menos tenerla en cuenta), de modo que la rotación alrededor de la línea de visión preserve el eje mayor percibido de la elipse (en este caso, haciendo que vaya más allá de la ventana gráfica)?

¿Fue útil?

Solución

Parece que estás usando 1.0 como aspecto cuando llamas a gluPerspective().Deberías usar ancho/alto.Por ejemplo, si su ventana gráfica es de 640x480, usaría 1.33333 como argumento de aspecto.

Otros consejos

Según la especificación OpenGL:

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

El aspecto debe ser una función del ancho y alto de la ventana.Específicamente ancho dividido por alto (pero cuidado con la división por cero).

Quizás esté utilizando 1 como aspecto que no es exacto a menos que su ventana sea un cuadrado.

Parece que el parámetro de aspecto en su llamada gluPerspective necesita ajustes.Ver La página de manual.Si su ventana fuera físicamente cuadrada, la relación de aspecto sería 1 y su problema desaparecería.Sin embargo, su ventana es rectangular, por lo que el tronco de visualización no debe ser cuadrado.

Establezca la relación de aspecto en ancho_ventana / altura_ventana y su elipse debería verse correcta.Tenga en cuenta que deberá actualizar esto cada vez que cambie el tamaño de la ventana;si estás usando GLUT establece un glutReshapeFunc y recalcular la matriz de proyección allí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top