PyOpenGL 2D-метки постоянного размера для 3D-объектов - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь сделать надписи для некоторых трехмерных объектов с помощью значка / треугольника, чтобы показать вам, где находится объект, плюс некоторый текст, описывающий, что это за объект. По сути, я хочу 1. отображать текст с помощью pyopengl и 2. иметь постоянный размер текста + значка на экране, 3. который может перемещаться по экрану.

(Я немного огляделся и посмотрел на орфографические c проекции, но я не уверен, что мне следует использовать именно это ...)

Я вообще не использовал opengl, так что это может быть глупый вопрос! Любая помощь очень ценится.

1 Ответ

0 голосов
/ 09 июля 2020

Хорошим началом было бы сохранить ваш значок + текст внутри квадрата. Существует множество хороших руководств по «рендерингу шрифтов», которые помогут вам создать желаемый четырехугольник.

Вы можете загрузить свой значок внутри текстуры openGL, после этого вам нужно будет создать свой четырехугольник и связать вершину и фрагментный шейдер к нему. Сложнее всего будет установить фиксированное положение для вашего квадроцикла, которое не будет связано с вашей 3D-сценой.

В видеоиграх, когда вы хотите нарисовать пользовательский интерфейс или hud (панель здоровья, миникарта ), вы рисуете их в конце поверх всего. Этим элементам не нужны матрицы mvp или матрицы проекций, с которыми вы, возможно, знакомы. Все маги c будут добавлены в вершинный шейдер, он будет отвечать за установку позиции всех ваших элементов, вывод вершинного шейдера должен быть в диапазоне [-1, 1] для всех координат:

  • -1 -> слева, сверху, рядом
  • 1 -> справа, снизу, далеко

Мы называем это пространство nd c см. Диаграмму https://antongerdelan.net/opengl/raycasting.html

Ваша задача будет заключаться в выводе значений в этом диапазоне. Если вы хотите, чтобы ваш четырехугольник имел половину ширины и четверть высоты с центром посередине, вы можете сохранить эту информацию в вершинах, которые вы отправили в шейдер.

GLfloat vertices[] = {-0.5, -0.25, 0, // bottom left corner
                      -0.5,  0.25, 0, // top left corner
                       0.5,  0.25, 0, // top right corner  
                       0.5, -0.25, 0}; // bottom right corner

вершинный шейдер , люди могут использовать четырехугольники с размером пикселя с орто-проекцией

in vec3 pos;
in vec2 uv;

out fuv;

void main()
{
    //glm::mat4 translation = uTranslation might need to mvoe the quad on screen at runtime
    gl_Position = vec4(pos.x, pos.y, -1.0, 1.0); //set it to near plane -1
    fuv = uv;
}

фрагментный шейдер

in vec2 fuv;
out vec4 color;

uniform sampler2D renderedTexture;

void main(){
    color = texture(renderedTexture, fuv);
}
...