有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java LWJGL:Slick:3D世界中的绘图字体

如何绘制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 world coords呈现


共 (2) 个答案

  1. # 1 楼答案

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

    你的问题并没有真正明确说明你是想把文本绘制成二维叠加图(可能是在屏幕坐标中),还是真正的透视图嵌入到三维空间中。然而,您可以通过drawString实现这两个目标drawString在z=0平面中指定的x/y坐标处渲染字体纹理。Iirc drawString中的约定是假设左手坐标系,并且纹理从负z侧可见。这种约定的原因可能是OpenGL使用左手坐标系表示窗口空间,而使用右手坐标系表示世界/对象空间(see this answer for a good explanation)。因此,使用Slick在2D中进行渲染非常简单:设置一个典型的正交投影矩阵(如ryuyah2000所建议的),就可以开始了

    如果要在3D空间中渲染,请保留常规透视投影矩阵(即,使用与渲染世界相同的投影)。为了控制文本在三维空间中的位置,必须相应地设置modelview矩阵(即,在要渲染文本的平面中对齐z=0平面)。由于左手和z-可见性约定,您可能必须将z轴旋转180°,并且必须反转惯用手(只需将modelview缩放-1)。如果你把其中一个步骤弄错了,你的文字要么看不见(=看错了z面),要么是从右向左写(=用错了手)。Slick的drawString方法使用字体纹理的1个单位=1个像素的缩放,因此您必须应用适当的缩放来匹配您的世界单位

  2. # 2 楼答案

    用这个

    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);