gpt4 book ai didi

c++ - 使用 glRasterPos() 按像素在屏幕上移动对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:51 25 4
gpt4 key购买 nike

我有以下代码在我的应用程序中呈现文本,首先我获取世界中的鼠标坐标,然后使用这些坐标将我的文本放置在世界中,因此它会跟随我的鼠标位置:

编辑:在代码示例中添加了 buildfont() 函数:

GLvoid BuildFont(GLvoid)                                // Build Our Bitmap Font
{
HFONT font; // Windows Font ID
HFONT oldfont; // Used For Good House Keeping

base = glGenLists(96); // Storage For 96 Characters

font = CreateFont( -12, // Height Of Font
0, // Width Of Font
0, // Angle Of Escapement
0, // Orientation Angle
FW_NORMAL, // Font Weight
FALSE, // Italic
FALSE, // Underline
FALSE, // Strikeout
ANSI_CHARSET, // Character Set Identifier
OUT_TT_PRECIS, // Output Precision
CLIP_DEFAULT_PRECIS, // Clipping Precision
ANTIALIASED_QUALITY, // Output Quality
FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch
"Verdana"); // Font Name (if not found, its using some other font)

oldfont = (HFONT)SelectObject(hDC, font); // Selects The Font We Want
wglUseFontBitmaps(hDC, 32, 96, base); // Builds 96 Characters Starting At Character 32
SelectObject(hDC, oldfont); // Selects The Font We Want
DeleteObject(font); // Delete The Font
}

GLvoid glPrint(const char *fmt, ...){
char text[256];
va_list ap;
if (fmt == NULL) return;
va_start(ap, fmt);
vsprintf(text, fmt, ap);
va_end(ap);
glPushAttrib(GL_LIST_BIT);
glListBase(base - 32);
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
glPopAttrib();
}

...

glPushMatrix();
glColor4f(0,0,0,1);
// X-1 wont work because these are the world coordinates:
glRasterPos2d(MousePosX-1, MousePosY);
glPrint("TEST");

glColor4f(1,1,0,1);
glRasterPos2d(MousePosX, MousePosY);
glPrint("TEST");
glPopMatrix();

但我想渲染多行文本,或带有“边框”的文本(就像我试过的上面的代码)或带有背景的文本(这样我可以更好地将它们与背景区分开来)那我该怎么做呢?

我只需要知道如何以像素为单位移动它,这样我就可以精确地修改我屏幕上的位置,而无需在我的 3d 渲染投影之上使用 2d 投影 View ...我只想让它变得如此简单可能。

我试图在文本下绘制一个四边形,但当然它不起作用,因为它仍在使用世界坐标...所以当我旋转我的相机时,文本不会沿着文本的背景移动...我是恐怕唯一的解决办法是在 3d 投影之上创建另一个投影...

最佳答案

这是我用来在小型应用程序中呈现一些调试文本的一小段代码:

void
renderText(float x, float y, const char* text) {
int viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(viewport[0], viewport[2], viewport[1], viewport[3], -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRasterPos2f(x, viewport[3] - y);
const int length = (int)strlen(text);
for (int i = 0; i < length; ++i) {
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, text[i]);
}
glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );
glPopMatrix();
}

xy 是字符串所需的窗口坐标。 glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ...) 只是 GLUT 的一个实用函数,可呈现 9 x 15 像素的大位图字符。

关于c++ - 使用 glRasterPos() 按像素在屏幕上移动对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2067111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com