【问题标题】:JOGL glut text not resizing with window and primitivesJOGL 过剩文本不使用窗口和基元调整大小
【发布时间】:2012-08-05 10:58:46
【问题描述】:

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

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

这是我用来渲染文本的代码的 sn-p

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

【问题讨论】:

    标签: java opengl glut jogl


    【解决方案1】:

    glutBitmapString 以 2D 形式绘制文本。 2D 文本大小基于字体大小。因此,如果您将字体大小设置为 18(如本例中所示),那么无论您制作多大的窗口或放大多近,它都将是屏幕上的标准 18 pt 字体大小。这不是Java 问题。 Java 实际上并没有绘制任何东西。一切都是由 OpenGL 本地库绘制的,这些库是用 C++ 编写的,因此在 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 局部坐标处绘制我的文本,然后将整个对象移动到适当的位置。这样旋转更容易理解。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        相关资源
        最近更新 更多