Este team especializado pasados muchos días de trabajo y recopilación de de información, hallamos la solución, queremos que todo este artículo sea de utilidad en tu proyecto.
Solución:
Definitivamente no desea que el tamaño de sus objetos dependa explícitamente del tamaño de la ventana.
Como ya sugirió genpfault, ajuste su matriz de proyección cada vez que cambie el tamaño de la ventana.
Cosas que hacer en el cambio de tamaño de la ventana:
-
Ajustar ventana gráfica
glViewport(0, 0, width, height)
-
Ajustar rectángulo de tijera (solo si tienes
GL_SCISSOR_TEST
activado)glScissor(0, 0, width, height)
-
Ajustar matriz de proyección
En el caso de OpenGL heredado (canalización de función fija), puede hacerlo de las siguientes maneras:
glFrustum(left * ratio, right * ratio, bottom, top, nearClip,farClip)
o
glOrtho(left * ratio, right * ratio, bottom, top, nearClip,farClip)
o
gluOrtho2D(left * ratio, right * ratio, bottom, top)
(asumiendo que
left, right, bottom
ytop
todos son iguales yratio=width/height
)
Si está usando algo como gluPerspective() simplemente use la relación ancho/alto de la ventana:
gluPerspective(60, (double)width/(double)height, 1, 256);
Debe configurar algún tipo de función de controlador de ventana que se llame cada vez que se cambie el tamaño de su ventana OpenGL. Debe ocuparse del caso cuando aspectRatio > 1 y cuando aspectRatio <= 1 por separado. Si no lo hace, es posible que la geometría quede fuera de la pantalla después de cambiar el tamaño de la pantalla.
void windowResizeHandler(int windowWidth, int windowHeight)
const float aspectRatio = ((float)windowWidth) / windowHeight;
float xSpan = 1; // Feel free to change this to any xSpan you need.
float ySpan = 1; // Feel free to change this to any ySpan you need.
if (aspectRatio > 1)
// Width > Height, so scale xSpan accordinly.
xSpan *= aspectRatio;
else
// Height >= Width, so scale ySpan accordingly.
ySpan = xSpan / aspectRatio;
glOrhto2D(-1*xSpan, xSpan, -1*ySpan, ySpan, -1, 1);
// Use the entire window for rendering.
glViewport(0, 0, windowWidth, windowHeight);