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.

¿Fue útil?

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 de draw () . Esto hará que su CPU funcione al 100%. En su lugar, puede usar glutTimerFunc () para seguir teniendo actualizaciones cada cierto número de milisegundos.
  • En processMouse () , está utilizando wsprintf () en una matriz de char s: wsprintf () toma una matriz de caracteres anchos ( wchar_t ), por lo que debe hacer la variable local s de tipo wchar_t [] , o usar sprintf () y MessageBoxA () en lugar de wsprintf () y MessageBoxW () (al cual MessageBox () 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 de x . Finalmente, también debe usar snprintf () / wsnprintf () en lugar de sprintf () / 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.

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