Использование gluortho2d, но функции рисования не используют новые координаты

У меня есть функция настройки, которая настраивает область просмотра, чтобы получить полный размер окна, загрузить матрицу идентификаторов, а затем использует gluOrtho2d() установить систему координат в этом окне просмотра. Если мое понимание этой функции верно, я теперь могу вызывать свои функции рисования, используя координаты от 0 до 780 по оси x и от 0 до 460 по оси y

void gl_setup(void) {
  glViewport(0,0, 780,460);
  glMatrixMode (GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(0,0,780,460);

  return ;
}

Однако в моей функции my_display мои фигуры отрисовываются в соответствии с (-1,1,-1,1) системой координат. например,

glBegin(GL_LINE_STRIP);
glVertex2f(0, -1.0f);
glVertex2f(0, 1.0f);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2f(-1.0f, 0);
glVertex2f(1.0f, 0);
glEnd();

рисует две линии, одна прямо вниз посередине области просмотра сверху вниз, а другая прямо посередине области просмотра слева направо. В системе координат, которую я думал, я определил выше, если бы я не использовал

glBegin(GL_LINE_STRIP);
glVertex2f(0, 230.0f);
glVertex2f(780, 230.0f);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex2f(390.0f, 0);
glVertex2f(390.0f, 460.0f);
glEnd();

или около того?

РЕДАКТИРОВАТЬ: рисунок происходит в my_display() функция, которая является glutDisplayFunc Перезвоните. Эта функция выглядит так:

void my_display(void) {
  glClear(GL_COLOR_BUFFER_BIT) ;

  glColor3f(0.1, 0.1, 0.79);

  glBegin(GL_LINE_STRIP);
  glVertex2f(0, -1.0f);
  glVertex2f(0, 1.0f);
  glEnd();
  glBegin(GL_LINE_STRIP);
  glVertex2f(-1.0f, 0);
  glVertex2f(1.0f, 0);
  glEnd();

  glColor3f(1.0f, 0, 0);
  glBegin(GL_LINE_STRIP);
  glVertex2f(0.0, -1.0f);
  glVertex2f(0.0, -2.0f);
  glEnd();
  glBegin(GL_LINE_STRIP);
  glVertex2f(-2.0f, 0);
  glVertex2f(-1.0f, 0);
  glEnd();

  glutSwapBuffers();

  return ;
}

РЕДАКТИРОВАТЬ 2: Моя основная функция выглядит следующим образом:

int main(int argc, char **argv) {
  glutInit( &argc, argv ) ;
  glut_setup() ;  
  gl_setup() ;
  glutMainLoop() ;

  return(0) ;
}

У меня есть glSetup выше. glut_setup() где я определяю все мои обратные вызовы:

 glutDisplayFunc( my_display );
 glutReshapeFunc( my_reshape ); 
 glutKeyboardFunc( my_keyboard );
 glutMouseFunc( my_mouse);

А также my_reshape Похоже на следующее, что, насколько я понимаю (что, по общему признанию, может быть очень далеким от истины), сохраняет размер окна просмотра одинакового размера при изменении размера окна и сохраняет его относительно центрированным:

void my_reshape(int w, int h) {
  // update window dimensions
  WIN_W = w;
  WIN_H = h;

  int win_x = (w-780)/2;
  int win_y = (h-460)/2;

  glViewport (win_x,win_y,780,460);
  return;
}

1 ответ

Решение

Ваши параметры для gluOrtho2D находятся в неправильном порядке. Он должен быть слева, справа, снизу, сверху, чтобы сделать правильный порядок для вашей программы gluOrtho2D(0,780,0,460). То, как вы его определили, будет иметь ширину 0, что, скорее всего, приведет к ошибке, которая не устанавливает матрицу проекции, оставляя ее по умолчанию. См. Спецификацию функции здесь: https://www.opengl.org/sdk/docs/man2/xhtml/gluOrtho2D.xml.

Другие вопросы по тегам