LWJGL:Slick:在3D世界中绘制字体

时间:2013-12-26 16:47:56

标签: java opengl lwjgl

如何绘制Slick的字体(UnicodeFont),只能通过drawString()绘制,只能在3D世界中提供x和y?

我试过这个:

public void drawHudString(float _posX, float _posY, String _text, UnicodeFont _font, Color _color) {
    glPushMatrix();
        glRotatef(cam.rotX, -1.0f, 0.0f, 0.0f);
        glRotatef(cam.rotY, 0.0f, -1.0f, 0.0f);
        glRotatef(cam.rotZ, 0.0f, 0.0f, -1.0f);
        glTranslatef(-cam.posX, -cam.posY, -cam.posZ + 20);

        _font.drawString(_posX, _posY, _text, _color);
    glPopMatrix();
}

但文字不是displayex。如果在没有glRotatefsglTranslatef的情况下使用,那么文字将由3D世界coords

呈现

2 个答案:

答案 0 :(得分:2)

使用Slick渲染字体基于OpenGL的立即模式。这意味着drawString的行为取决于当前状态,或者换句话说,当前GL_PROJECTIONGL_MODELVIEW矩阵。

您的问题并不能说明您是想将文本绘制为2D叠加(可能在屏幕坐标中)还是真正透视嵌入3d空间。不过,您可以使用drawString实现这两项目。 drawString在z = 0平面的指定x / y坐标处呈现字体纹理。 Iirc drawString中的约定是假设左手坐标系,并且纹理从负z侧可见。这种约定的原因可能是OpenGL使用左手坐标系统用于窗口空间,而右手用于世界/对象空间(see this answer for a good explanation)。因此,使用Slick进行2D渲染非常简单:设置一个典型的正交投影矩阵(如ryuyah2000所示),你很高兴。

如果要在3D空间中渲染,请改为保留常规透视投影矩阵(即,您使用的是用于渲染世界的投影)。为了控制文本在3D空间中的位置,您必须相应地设置模型视图矩阵(即,在要渲染文本的平面中对齐z = 0平面)。由于左手和z可见度约定,您可能需要将z轴旋转180°并且必须反转手性(仅将模型视图缩放-1)。如果您错误地执行了其中一个步骤,您的文本将不可见(=查找错误的z-side)或从右向左书写(=错误的手性)。 Slick的drawString方法使用1个单位= 1个字体纹理的缩放比例,因此您必须应用适当的缩放以匹配您的世界单位。

答案 1 :(得分:0)

使用此

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, 800, 600, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST); 
glClear(GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

// render font

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);