Básicamente, quiero saber cómo puedo eliminar la distorsión o el estiramiento de la imagen renderizada cuando cambia el tamaño de la ventana / ventana.
Las siguientes imágenes ejemplifican la distorsión / estiramiento del que estoy hablando:
Imagen original (ventana cuadrada)
Imagen distorsionada / estirada (ventana rectangular)
Idealmente, la segunda imagen debería mostrar la esfera sin el estiramiento horizontal, y expondría más de la escena al usuario para dar cuenta del mayor tamaño de la ventana.
¿Cómo se puede hacer esto?
Estoy trabajando con OpenGL para renderizar la imagen, y uso la proyección en perspectiva a través de las llamadas:
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)
La relación de aspecto width/height
está de acuerdo con todos los documentos / tutoriales que he encontrado, por lo que no espero que sea incorrecta. Sin embargo, mi sospecha es que está afectando el problema del estiramiento.
Después de pensar
Honestamente, al pensar más en el tema, me hizo creer que la solución implica una relación directamente proporcional entre el ángulo fovy (campo de visión en la dirección y) y la relación de aspecto.
Usando la imagen de arriba como referencia, si el ancho aumenta (causando un estiramiento horizontal), parece muy plausible que el ángulo fovy debe aumentar para causar un estiramiento vertical que 'arregle' la proporcionalidad de la imagen renderizada.
Del mismo modo, una disminución en el ancho requiere una disminución en el ángulo fovy.
Actualizar:
Entonces, después de investigar esto más a fondo, he decidido cambiar la forma en que configuré el frustum de visualización de esta manera:
gluPerspective(60 * (float)window.width/window.height, (float)window.width/window.height, 0.01f, 100.0f)
Y mis expectativas eran correctas, eso resolvió el problema de proporcionalidad. Sin embargo, no logra mis resultados deseados. Cuando el ancho de la ventana aumenta, la imagen renderizada se vuelve más pequeña (pero la esfera es realmente circular). En cambio, la esfera no debería cambiar de tamaño en absoluto; solo la cantidad de escena que se muestra debe cambiar.