使用gluortho2d但绘图功能不使用新坐标

时间:2014-09-18 17:48:19

标签: opengl 2d coordinates orthographic

我有一个设置功能,设置视口以占用整个窗口大小,加载单位矩阵,然后使用gluOrtho2d()在该视口中设置一个坐标系。如果我对这个函数的理解是正确的,我现在应该可以使用x轴上0到780的坐标调用我的绘图函数,y轴上的坐标为0到460

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 个答案:

答案 0 :(得分:2)

您对gluOrtho2D的参数顺序错误。它应该是left,right,bottom,top,这将为你的程序gluOrtho2D(0,780,0,460)提供正确的顺序。您定义它的方式的宽度为0,这很可能导致错误,该错误不会将投影矩阵设置为默认值。请参阅此处的函数规范:https://www.opengl.org/sdk/docs/man2/xhtml/gluOrtho2D.xml