正确调整FTGL字体的y轴位置

3
昨天,我苦恼于如何在一个以 左上角 为原点的窗口中呈现 FTGL 字体。保留这种正交设置使我难以正确对齐 FTGL 字体,特别是在 y 轴 上。
void enable2D(int w, int h)
{
    winWidth = w;
    winHeight = h;

    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, w, h, 0, 0, 1);
    glMatrixMode(GL_MODELVIEW);
}

然后像这样呈现它:
glPushMatrix();
    glTranslated(X, Y + font.LineHeight(), 0);
    glScalef(1, -1, 0); //reverse scaling of y
    font.Render(str);
glPopMatrix();

我尝试测量不同字体的边界框,但结果不一致。
这里是它们: different font faces 注意方框的y位置的不一致性 还有代码:
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

///Draw the fonts
for (int i = 0;i < N; ++i)
{
    auto &X = x[i];
    auto &Y = y[i];
    auto &font = fonts[i];

    glColor3ub(0, 0, 0);
    glPushMatrix();
        glTranslated(X, Y + font.LineHeight(), 0);
        glScalef(1, -1, 0);
        font.Render(str);
    glPopMatrix();
}

///Draw the boxes
for (int i = 0;i < N; ++i)
{
    auto &X = x[i];
    auto &Y = y[i];
    auto &box = boxes[i];

    glColor3ub(255, 0, 0);
    glPushMatrix();
        glTranslated(X, Y, 0);
        glBegin(GL_LINE_LOOP);
        glVertex2f(box.Lower().X(),                   -box.Lower().Y());                       //top-left
        glVertex2f(box.Upper().X() - box.Lower().X(), -box.Lower().Y());                       //top-right
        glVertex2f(box.Upper().X() - box.Lower().X(), +box.Upper().Y() - box.Lower().Y() * 2); //bottom-right
        glVertex2f(box.Lower().X(),                   +box.Upper().Y() - box.Lower().Y() * 2); //bottom-left
        glEnd();
    glPopMatrix();
}

但我想要一个完全适合呈现字体的盒子,就像这样:

enter image description here

我只是手动调整了一些值,使其适合

具体问题是,我如何计算在这种设置下呈现的字体的y位置

我不知道FTGL :: Descender()是什么,但我认为它与此有些相关?

我将接受任何讨论此类主题的链接作为答案。

1个回答

2

然而,在尝试和错误之后,我找出了我所犯的错误。

这个框

首先,在做这种坐标系时,我应该考虑到框的最左侧和最上部分应该设置为,即:

glVertex2f( 0, 0 );
glVertex2f( w, 0 );
glVertex2f( w, h );
glVertex2f( 0, h );

所以我不需要担心其他事情。从中,我确保在将font翻译为指定坐标时,它必须相对于左上角原点窗口(没有填充、偏移等)。

字体

现在,在字体部分进行翻译,我这样做:

float x_offset = (font.BBox(str).Lower().X() * font_scale);
float y_offset = (font.BBox(str).Upper().Y() * font_scale);

glPushMatrix();

    ///the coorinate should now be relative the box!
    glTranslatef( x - x_offset,
                  y + y_offset,
                  0
                );
    glScalef( font_scale, -font_scale, 0); //notice the negative in y

    font.Render(str);

glPopMatrix();

现在它应该看起来像这样

输入图像描述

字体超出框架(#6),可能是由于字体的样式造成的。

谢谢!希望有人能够帮忙:D

更新:

我的先前计算中存在错误,无论如何,我更新了我的答案以使其更加准确。您可以在我的编辑历史记录中查看更改。

更新:

这里仍然存在错误。 FTGL :: BBox仅返回当前文本的当前边界框,其中当最大字形高度不在当前字符串中时,高度可能会发生变化。我再次检查了源代码,但找不到yMax,它是可能返回的最大高度。但是,我可以在可用的字形上迭代并获取最大高度,我认为freetype中已经存在可以完成此操作的函数?有人知道吗?


Freetype是一个巨大的混乱,应该有人来做得更好。 - basickarl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接