JOGL过剩文本没有使用窗口和基元调整大小

时间:2012-08-08 10:38:23

标签: java opengl glut jogl

我正在通过使用JOGL库(用于openGL的java包装器)来探索opengl,我正用它来创建2d / 3d图形。在我通过“glutBitmapString”方法渲染的文本有一点问题时,它没有调整窗口大小,如下面的屏幕截图所示。不幸的是,我给出的工作规范是必须用Java完成,所以我不能跳到任何其他支持更好的openGL版本的语言。

窗口中的其他所有内容都会正确调整大小,所以我假设问题出现在我在下面发布的代码中,如果没有,那么我很乐意发布您认为与问题相关的代码。

The default window size

The resized window

以下是我用于呈现文字的代码片段

GL gl = drawable.getGL();
    GLUT glut = new GLUT();

    float textPosx = -0.4f;
    float textPosy = -2.1f;

    gl.glColor3f(1.0f, 0.0f, 0.0f);

    // Move to rastering position
    gl.glRasterPos2f(textPosx, textPosy);

    // convert text to bitmap and tell what string to put
    glut.glutBitmapString(GLUT.BITMAP_HELVETICA_12, "0");

    textPosx = 1.75f;
    textPosy = -2.15f;

    // Move to rastering position
    gl.glRasterPos2f(textPosx, textPosy);

    // convert text to bitmap and tell what string to put
    glut.glutBitmapString(GLUT.BITMAP_HELVETICA_18, "TIME");

    textPosx = -1.0f;
    textPosy = 1.0f;

    gl.glColor3f(0.0f, 1.0f, 0.0f);

    // Move to rastering position
    gl.glRasterPos2f(textPosx, textPosy);

    // convert text to bitmap and tell what string to put
    glut.glutBitmapString(GLUT.BITMAP_HELVETICA_18, "ERRORS");

2 个答案:

答案 0 :(得分:3)

glutBitmapString以2D格式绘制文本。 2D文本大小基于字体大小。因此,如果您将字体大小设置为18,就像在此示例中一样,那么无论您制作窗口的大小或放大的距离,它都将是屏幕上标准的18磅字体大小。这不是Java问题。 Java实际上并没有绘制任何东西。一切都是由用C ++编写的OpenGL本机库绘制的,因此它在C ++中与在Java中完全相同。

有两种方法可以解决这个问题。一种是在放大或缩小时更改文本的字体大小。这将是一种尴尬,可能很难做到正确。一个更好的选择,imo,就是简单地使用3D文本。在JOGL中,您可以使用TextRenderer对象绘制3D文本。

在init方法中创建一个全局变量,如下所示:

textr = new TextRenderer(new Font("SansSerif", Font.PLAIN, 18));

显然,将字体设置更改为您喜欢的任何内容。然后在你的显示循环中:

textr.setColor(Color.GREEN);
textr.begin3DRendering();
textr.draw3D("ERRORS", xLocation, yLocation, zLocation, scale);
textr.end3DRendering();

就个人而言,我更喜欢使用较大的字体大小,然后将其缩小一些,这样,当你放大时,它不会像素化。

此外,与2D文本不同,3D文本不会始终面向屏幕。你必须手动完成。这取决于您的相机的设置方式,但如果您使用基本旋转来移动相机,通常您可以在3D文本对象上取消这些旋转,使其面向相机。

对于x,y和z位置,这些是当前对象中的位置(本地坐标)。将beginRendering()视为endRendering(),将其视为具有自己的本地坐标系的一个对象。通常,我更喜欢在0,0,0局部坐标处绘制文本,然后将整个对象移动到正确的位置。这样轮换更容易理解。

答案 1 :(得分:0)

您可以尝试使用TextRenderer。工作正常。