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

标签 java opengl lwjgl

如何在 3D 世界中绘制 Slick 的字体(UnicodeFont),该字体只能通过 drawString() 绘制,它只提供 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

渲染

最佳答案

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

您的问题并没有真正弄清楚您是否想要将文本绘制为 2D 覆盖(可能在屏幕坐标中)或真正嵌入 3D 空间的透视。不过,您可以使用drawString 来实现这两个目的。 drawString 在 z=0 平面中指定的 x/y 坐标处渲染字体纹理。在 drawString 中,约定是假设左手坐标系,并且纹理从 z 轴负方向可见。这种约定的原因可能是 OpenGL 对窗口空间使用左手坐标系,而对世界/对象空间使用右手坐标系 ( see this answer for a good explanation )。因此,使用 Slick 进行 2D 渲染非常简单:设置一个典型的正交投影矩阵(如 ryuyah2000 所建议的),然后就可以开始了。

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

关于java - LWJGL:Slick:在 3D 世界中绘制字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20788163/

相关文章:

java - 有限制的数据存储区查询

c++ - 使用 glTexImage2D 的奇怪结果

c++ - 在 OpenGL 中自由类型文本后面的渲染正方形被裁剪

c++ - OpenGL 中 DirectX 文件的骨骼动画

audio - OpenAL 监听器打破衰减

java - LWJGL - 循环卡住的原因?

java - 如何对restTemplate进行junit测试?

java - 为什么在 java 中并非所有最终常量字符串都是平等创建的

java - jOOQ 将字符串转换为 boolean 值

java - ImageIO.read() 是否保持 PNG 文件的透明度?