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.

画面にテキストをレンダリングします。画面上のテキストの座標を把握する方法はありますか?迂回路を介してすべての機能にアクセスできます。

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

この時点で、次に書き込む文字の幅を設定し、値を変換してテキストをその右側に直接配置することをお勧めします。

ちなみに、FreeType2と呼ばれる素晴らしい無料のライブラリがあります。Blizzardはそれをゲームや私自身に使用しています。前者は信頼性が高くなっています。

それでも質問に答えられない場合は、必ずお知らせください

于 2012-08-05T05:07:28.243 に答える