Problema de coordenadas OpenGL [cerrado]
Pregunta
Estoy creando una sencilla aplicación 2D OpenGL, pero parece que estoy experimentando algunos problemas con la cámara. Cuando dibujo un rectángulo en (20,20) se dibuja en (25,20) más o menos. Cuando lo dibujo a (100, 20) se dibuja a 125 más o menos. Por alguna razón, todo se está desplazando hacia la derecha en unos pocos%.
He pegado una versión recortada aquí http://pastebin.com/m56491c4c
¿Hay algún problema con la forma en que configuro GLUT? Sé que no son mis objetos los que hacen algo extraño, ya que sucede lo mismo cuando los desactivo.
Gracias de antemano.
Solución
Debe establecer la matriz de proyección dentro de la función de remodelación ( resize ()
), que también resuelve automáticamente el problema de que el usuario cambie el tamaño de la ventana:
void resize(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, w, h, 0);
}
Y luego, en su función de dibujo, asegúrese de que el modo de matriz sea vista de modelo:
void draw()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
...
}
Otros problemas con su código:
- Probablemente no deberías llamar a
glutPostRedisplay ()
al final dedraw ()
. Esto hará que su CPU funcione al 100%. En su lugar, puede usarglutTimerFunc ()
para seguir teniendo actualizaciones cada cierto número de milisegundos. - En
processMouse ()
, está utilizandowsprintf ()
en una matriz dechar
s:wsprintf ()
toma una matriz de caracteres anchos (wchar_t
), por lo que debe hacer la variable locals
de tipowchar_t []
, o usarsprintf ()
yMessageBoxA ()
en lugar dewsprintf ()
yMessageBoxW ()
(al cualMessageBox ()
se expande como una macro al compilar una aplicación Unicode, lo que supongo que estás haciendo). También es vulnerable a un desbordamiento del búfer: debe usar un búfer de al menos 12 caracteres, aunque de manera realista nunca se le pasará un valor muy grande dex
. Finalmente, también debe usarsnprintf () / wsnprintf ()
en lugar desprintf () / wsprintf ()
para protegerse contra el desbordamiento del búfer.
Otros consejos
Parece que está llamando a su glOrtho2D en su matriz ModelView. Dudo que ese sea el problema (ya que supongo que en este caso, su Proyección debería ser la identidad), pero aún debería llamarla en su matriz de Proyección.
También debe imprimir w y h en su llamada de cambio de tamaño, solo para asegurarse de que el tamaño de su ventana es realmente lo que cree que es (no sé cómo funciona glut, pero glutInitWindowSize () puede incluir bordes, que arruinaría las cosas).
Depende de en qué sistema esté trabajando, pero generalmente la mayoría de los sistemas de coordenadas de Windows comienzan en la esquina inferior izquierda y cuentan hacia arriba y hacia la derecha. En este caso, su llamada gluOrth02D sería incorrecta.
Tienes:
gluOrtho2D(0, appWidth, appHeight, 0);
Que tiene la parte superior del mapeo de la ventana hacia abajo, viceversa.
La mayoría de las veces es:
gluOrtho2D(0, appWidth, 0, appHeight);
Como dije, depende del sistema, la plataforma con la que trabajas. Solo puedo hablar para la mayoría de las implementaciones de Linux.
Solo hay algo más que ver en caso de que afecte a tu error.