0

好的,所以我正在玩游戏以从中检索数据并使用它。我得到了挂钩文本(通过 CallLists)。

游戏使用:

在此处输入图像描述

glNewlist()
glBegin(GL_QUADS)
glVertex2i(....);    //Stored the location of each char in the bitmap above..
glTexCoords2f(....); //Not sure what this is..
glEnd()
glEndList()

glCallList(876);   //Represents a single character in the above bitmap.
glLoadIdentity();   //Resets the matrix.
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
glTranslatef(336, 196, 0);  //Places it on screen somehow! :S? This is what I need to know.
glColor4ub(0, 0, 0, 255);  //Colours the text.
LoadIdentity();            //Resets the matrix and does the next character.
glCallList(877);           //Next char.

将文本渲染到屏幕上。有没有办法找出屏幕上文本的坐标?我可以通过 Detours 访问所有功能。

我不确定 glTranslate 做了什么。如何获取文本的 X 和 Y?

我用它来投影 glTranslate 的坐标,但它仍然投影错误。我将什么传递给我的 WorldVector?它只是一个带有 X、Y、Z 的结构。我已将 glTranslate 坐标传递给它,但这不起作用。

bool WorldToScreen(GLfloat &X, GLfloat &Y, Vector3D World, GLdouble* ModelViewMatrix, GLdouble* ProjectionMatrix)
{
    GLint ViewPort[4];
    GLdouble Screen[3];
    glGetIntegerv(GL_VIEWPORT, ViewPort);

    if(gluProject(World.X, World.Y, World.Z, ModelViewMatrix, ProjectionMatrix, ViewPort, &Screen[0], &Screen[1], &Screen[2]) == GL_TRUE)
    {
        X = Screen[0];
        Y = ViewPort[3] - Screen[1];
        return true;
    }
    return false;
}
4

2 回答 2

1

这真的取决于,如果你在正交模式下绘制你的文本,无论你传递给 glTranslatef 的是实际的屏幕坐标,如果你处于透视模式,你将不得不通过转换管道来获取屏幕坐标,我相信执行此操作的函数将在名为 gluProject 的 GLU 库中,其中 gluUnProject 会将屏幕坐标带到世界空间

translate to world position 
translate to view position 
divide by W (Copy of Z) to get projection coordinates 
ScreenX = Px * ScreenWidth/2 + ScreenWidth/2 
ScreenY = -Py * ScreenWidth/2 + ScreenWidth/2
于 2012-08-04T00:39:50.220 回答
1

这是一个以正字法翻译和调用列表的示例

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0, -1.0, 1.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(336.0f, 196.0f, 0.0f);
glColor4f(1.0f, 0.0f, 0.0f, 1.0f); //Red
glCallList(877); //Or whatever list you wish to call

此时,您可能希望获得下一个要写入的字符的宽度,并简单地转换值以将您的文本直接放在它的右侧,

顺便说一句,有一个很棒的免费使用库,叫做 FreeType 2 ,暴雪将它用于那里的游戏,以及我自己,前者给了它很好的可信度。

如果我仍然没有回答您的问题,请务必让我知道

于 2012-08-05T05:07:28.243 回答