如何将窗口坐标转换为规范化设备坐标?

时间:2016-04-03 18:28:08

标签: opengl math glut

我的窗户是坐的,我需要在这里画文字。

我使用这个功能:

void displayText(std::string const& text, float x, float y)
{
  int j = text.size();

  glColor3f(1, 1, 1);
  // std::cout << x << " " << y << std::endl;
  // std::cout << (x / 900) * (2.0 - 1.0) <<" " <<(y / 900) * (2.0 - 1.0) << std::endl;
    x = x / (float)900; //900 is my window size
    y = y / (float)900;
    x-=0.5f;
    y-=0.5f;//  std::cout << x << " "<<y << std::endl;
  glRasterPos2f(x, y);
  for(int i = 0; i < j; i++)
    glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, text[i]);
}

但它以错误的坐标绘制文字,颠倒,有什么想法吗?

1 个答案:

答案 0 :(得分:2)

glRasterPos2f将通过完整的转换管道,因此特别受以下因素影响:

  • 当前投影矩阵
  • 当前的modelview matric
  • 当前设置的视口

这意味着您的问题标题具有误导性,因为这里的窗口空间和NDC坐标都不相关,而是对象空间坐标。

对于绘制基于位图的文本,最好在设置modelView时设置一些像素精确的正交矩阵(与视口大小相匹配)作为投影 认同:

glMatrixMode(GL_PROJECTION);
glOrtho(0, width, 0, height, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRasterPos2f(pixel_coords);
// draw bitmaps here

请注意,GL使用数学约定,因此原点将位于屏幕左下角的 bottom 处。你可以在正交矩阵中翻转它,但仍会绘制位图,以便它们的局部左下边缘将出现在光栅位置。

你应该知道所有这些东西 - 绘制位图,固定函数坐标转换,内置GL矩阵函数等等 - 完全弃用了近十年到现在。 OpenGL的现代核心配置文件不再支持,您将不得不使用基于纹理的方法进行字体渲染。使用带符号的距离字段是一个很好的选择,可以在屏幕上显示漂亮的字体。