代码之家  ›  专栏  ›  技术社区  ›  Arctic Pi

OpenGL&Qt:在鼠标上显示标签

  •  3
  • Arctic Pi  · 技术社区  · 6 年前

    我正在使用OpenGL和Qt。我在 OpenGLWidget . 将鼠标悬停在场景中的对象上时,我希望在选定对象附近显示一个带有文本的框。我已经实现了对象的选择。

    我想到了两种可能的方法。

    1. 放置小部件(例如 QLabel OpenGLWidget软件 在里面 渲染场景。
    2. 直接在OpenGL中呈现四元文本。

    你推荐的两种方法中的哪一种,你可以给我一些实施的建议。或者,您可以推荐另一种方法。谢谢!

    2 回复  |  直到 6 年前
        1
  •  2
  •   AdaRaider    6 年前

    嗨@Artic我不是Qt专家,所以我不能给你小部件的信息,但是我可以给你一些用OpenGL创建标签的指针。在这里给出一个完整的实现是很棘手的,因为这在很大程度上取决于您想要如何显示文本。但我会试着概述一下你的一些选择。

    https://learnopengl.com/In-Practice/Text-Rendering 位图字体的概念相当直截了当,所有字符都预先光栅化为一个纹理,然后根据需要的字符从纹理的每个部分进行采样。你用四边形来建立你的标签,用你为每个字符取样的位图的每一部分进行纹理处理。

    符号距离字段基本上使用相同的技术,但字符的预光栅化纹理是使用符号距离字段呈现的,该字段处理标准位图字体所具有的一些问题。

    基本上,SDF的工作原理是生成一种特殊的字体纹理或图像,该字体存储从每个字符边缘到中心的距离,使用图像的颜色通道来记录数据。

    一旦有了生成标签的方法,就可以决定是在屏幕空间还是在世界空间中显示标签。

    如果只想在屏幕空间中向屏幕呈现一些文本,也可以“动态”呈现文本。你可以使用像SDL_ttf这样的库。 见: http://lazyfoo.net/tutorials/SDL/16_true_type_fonts/index.php

    在本例中,使用SDL_ttf将文本字符串渲染到具有所选维度的曲面,然后可以从该曲面创建OpenGL纹理并将其渲染到屏幕。

    很抱歉,如果这个信息有点宽泛,我需要一个更具体的问题来给你进一步的实现细节。

    对于一个实现,我将根据您的需要来评估利弊。如果你还没有实现一个呈现文本的系统,最好还是坚持一些简单的东西;有更多的文本呈现技术比我在这里列出的要多,比如把文本转换成多边形和其他库,这些库试图处理一些与传统字体呈现技术有关的问题,但是你可能没有需要复杂的东西。

    对于推荐使用哪种技术,我将使用您认为最合适的技术,通常在OpenGL中从头开始做一些事情需要更多的时间,但是它可以为您提供一组更好的功能,以便将来使用。然而,如果Qt已经有了一些很好的标签呈现工具(比如你提到的小部件),那么可能值得花时间学习如何使用它,因为它可能会产生更快的结果,如果你不需要的话,你不想重新发明轮子。在这一点上,尽管使用OpenGL从头开始做事情是非常有意义的,并且可以极大地提高您的理解力,因为当您没有依赖的抽象层时,您必须熟悉事情是如何完成的。最终取决于你。祝你好运!

        2
  •  0
  •   Lambda1010    6 年前

    你可以在Qt中使用工具提示。当OpenGlWidget悬停在上面时,字符串将出现。可以使用工具提示方法,根据场景中鼠标的位置更改工具提示的文本 showText() :

    QToolTip::showText(QPoint &position, QString &text, QWidget *w);
    

    显示文本() 方法,可在Qt中找到 tool tip documentation . 还有,这里还有 examples