如何绘制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。如果在没有glRotatefs
和glTranslatef
的情况下使用,那么文字将由3D世界coords
答案 0 :(得分:2)
使用Slick渲染字体基于OpenGL的立即模式。这意味着drawString
的行为取决于当前状态,或者换句话说,当前GL_PROJECTION
和GL_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);