0

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

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

默认窗口大小

调整大小的窗口

这是我用来呈现文本的代码片段

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

2 回答 2

3

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 局部坐标处绘制我的文本,然后将整个对象移动到适当的位置。这样旋转更容易理解。

于 2012-08-24T18:14:44.310 回答
0

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

于 2013-01-03T17:20:02.397 回答