OpenGL & Qt: отображать метку при наведении мыши - PullRequest
0 голосов
/ 09 января 2019

Я работаю с OpenGL и Qt. Я отрисовываю сцену в OpenGLWidget. При наведении курсора на объекты в сцене, я хотел бы отобразить поле рядом с выделенным объектом с текстом. Я уже реализовал выбор объекта.

Я подумал о двух возможных подходах.

  1. Поместите виджет (например, QLabel) над OpenGLWidget в какой сцены отображается.
  2. Визуализация текста в виде квадрата непосредственно в OpenGL.

Какой из двух подходов вы рекомендуете, и вы могли бы дать мне несколько советов по реализации. В качестве альтернативы, вы можете порекомендовать другой подход. Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Вы можете использовать подсказки в Qt. Строка появится, когда OpenGlWidget наведен. Вы можете изменить текст всплывающей подсказки в зависимости от положения мыши на сцене, используя метод всплывающей подсказки showText():

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

Есть и другие опции для метода showText(), которые можно найти в документации по подсказки Qt . Также, вот ещё примеров о том, как использовать подсказки Qt.

0 голосов
/ 09 января 2019

Привет, @Artic. Я не эксперт по Qt, поэтому я не могу дать вам информацию о виджетах, но я могу дать вам несколько советов по созданию ярлыка с OpenGL. Дать полную реализацию здесь непросто, потому что многое зависит от того, как вы хотите отобразить текст. Но я постараюсь изложить некоторые из ваших вариантов.

Для рендеринга текста в 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 может быть очень полезной и значительно улучшить ваше понимание, так как вы должны познакомиться с тем, как все делается, когда у вас нет уровня абстракции, от которого можно зависеть. В конечном итоге это зависит от вас. Удачи!

...