glutBitmapCharacter 文本位置错误
Posted
技术标签:
【中文标题】glutBitmapCharacter 文本位置错误【英文标题】:glutBitmapCharacter positions text wrong 【发布时间】:2012-02-24 12:33:35 【问题描述】:我正在尝试在屏幕上绘制一个简单的字符串(覆盖)。
根据我在互联网上找到的信息,我是这样使用它的:
void write(string text, int x, int y)
glRasterPos2i(x,y);
for(int i = 0; i < text.length(); i++)
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, text.data()[i]);
但是它根据世界坐标绘制字符串。比如说,如果 x 和 y 设置为 10,它们将在世界的 (10,10,0) 坐标处绘制。但我只是需要这个字符串在 2D 窗口的 (10,10) 坐标处。
这是一个小项目的一部分,绘制方法如下。我不想更改太多,因为它可能会破坏项目中的其他内容。
void disp()
// set viewing translation and object rotations
glMatrixMode( GL_MODELVIEW );
glLoadIdentity ();
glTranslatef( INIT_VIEW_X, INIT_VIEW_Y, INIT_VIEW_Z );
glRotatef( xRot, 1.0, 0.0, 0.0 );
glRotatef( zRot, 0.0, 0.0, 1.0 );
glScalef( scaleFactor, scaleFactor, scaleFactor );
glClear(GL_COLOR_BUFFER_BIT);
draw();
glFlush();
我也不完全知道他们做了什么,我认为将文本绘制到世界坐标与这段代码中的某些内容有关。我也试过Using GLUT bitmap fonts,但也没用。
我怎样才能简单地在屏幕上绘图。 OpenGL 过于复杂了。我试着简单地写到窗口,但它需要整个东西并转化为 3D 世界。我只是不想要这个。
【问题讨论】:
【参考方案1】:从 twall,是的,您需要清除模型视图和投影矩阵
//TEXT
glMatrixMode( GL_PROJECTION ) ;
glPushMatrix() ; // save
glLoadIdentity();// and clear
glMatrixMode( GL_MODELVIEW ) ;
glPushMatrix() ;
glLoadIdentity() ;
glDisable( GL_DEPTH_TEST ) ; // also disable the depth test so renders on top
glRasterPos2f( 0,0 ) ; // center of screen. (-1,0) is center left.
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
char buf[300];
sprintf( buf, "Oh hello" ) ;
const char * p = buf ;
do glutBitmapCharacter( GLUT_BITMAP_HELVETICA_18, *p ); while( *(++p) ) ;
glEnable( GL_DEPTH_TEST ) ; // Turn depth testing back on
glMatrixMode( GL_PROJECTION ) ;
glPopMatrix() ; // revert back to the matrix I had before.
glMatrixMode( GL_MODELVIEW ) ;
glPopMatrix() ;
【讨论】:
谢谢,这是我一直在寻找的,我还禁用了照明,因此它被渲染为所需的颜色。glDisable(GL_LIGHTING);//Ignore lighting, its text
【参考方案2】:
据我所知,您的目标似乎是orthographic projection.
我不确定 OpenGL 的具体情况(我习惯使用更高级别的图形库),但这里有几个链接可以作为起点:
Setting a orthographic projection matrix?
http://www.cprogramming.com/tutorial/opengl_projections.html
【讨论】:
【参考方案3】:您可以像这样退回到“2D”坐标:
//save your current matrix on the stack, so you don't lose it
glPushMatrix();
//load identity matrix, so you don't have any 3d transformations
glLoadIdentity ();
//now you also can transform the text
//to the position just as you like
//glTransformf( ... )
//make sure the text is draw, even though it might be outside the viewing area
glDisable( GL_DEPTH_TEST )
drawMyFunkyText();
glEnable( GL_DEPTH_TEST )
//restore the matrix as it was before,
//so you can draw all your shapes as before
glPopMatrix();
【讨论】:
这只会重置当前处于活动状态的任何矩阵模式。如果 OP 使用透视投影,则光栅位置将出现在近剪裁平面之前。 感谢您的输入,我已将glDisable(GL_DEPTH_TEST)
添加到代码示例中,以确保文本仍能呈现
禁用深度测试无济于事,光栅位置将被近剪裁平面剪裁。对于位图(由 glutBitmapChar 使用),只有光栅位置的裁剪很重要。如果这一点被剪掉,它会影响整个事情。以上是关于glutBitmapCharacter 文本位置错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 glutBitmapCharacter() 绘制文本关闭 opengl 程序
glutBitmapCharacter() 给出链接错误 c++