2015-10-06 2 views
1

Что я пытаюсь сделать, так это то, что по мере того, как я рисую каждый объект, я проверяю, помечен ли он, и если он помечен, напишите текст рядом с объектом, используя glRasterPos2f/i, чтобы установить местоположение на экране , а затем glutBitmapCharacter.Блоки glRasterPos для glutBitmapCharacter

Для glRasterPos2 я вижу множество примеров с координатами пикселей, переданными в качестве аргументов (пример: 100 100). Координаты пикселей не работают для меня, и вместо этого мне приходится переводить в координаты по шкале [-1.0 1.0]. [-1 -1] внизу слева от экрана, [1 1] - верхний правый.

Одна вещь, которую я заметил в примерах, - это изменение орфографической проекции. Это причина моей проблемы?

У меня gluPerspective(); установить один раз в начале, и он не изменяется (на данный момент). Если мне нужно перейти на gluOrtho каждый раз, когда я хочу писать текст в пиксельных координатах, это кажется беспорядочным. Для каждого объекта я начинаю с gluPerspective(), а затем при необходимости меняю gluOrtho(), а затем обратно.

Другой вариант, о котором я подумал, - это то, что, похоже, все работает на шкале [-1.0 1.0], я могу вручную преобразовать координаты экрана в шкалу. Но это также кажется грязным и плохим для производительности.

Любые советы о том, как действовать?

+0

В чем проблема, с которой вы сталкиваетесь? Вы спрашиваете о «причине моей проблемы», но я ничего не вижу в описании проблемы. –

+0

Проблема в том, что если я использую glRasterPos2f (4.0, 4.0); в качестве примера последующий вызов glutBitmapCharacter не отображается на экране. На данный момент я вижу различное поведение по сравнению с некоторыми примерами, которые я видел. Но если я использую glRasterPos2f (x/windowWidth * 2-1, y/windowHeight * 2-1), я получаю текст в месте x, y, которое я ожидаю на экране. –

ответ

1

glRasterPos famlili функций преобразует координаты с использованием текущих матриц ModelView и Projection, аналогичных преобразованиям координат, которые применяются к данным вершин.

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

1

glRasterPos принимает координаты в той же системе координат, что и примитивы рисования. Поэтому, если вы настроили трансформации для 3D-объекта и сделали вызов (ы) для его рисования, вы можете просто передать те же координаты, которые вы использовали для вершин объектов, до glRasterPos.

Например, если вы хотите поместить текст рядом с вершиной, вы вызываете glRasterPos с теми же координатами, которые вы также использовали для вершины, в то время как одно и то же преобразование все еще установлено. Затем glRasterPos преобразует эти координаты с помощью преобразования модели и проекции, которые также применяются к вершине, а нижний левый угол текста, который вы рисуете с помощью glutBitmapCharacter(), будет выровнен с вершиной.

Если вы хотите поместить текст в заданное положение пикселя, вы можете использовать glWindowPos вместо glRasterPos.

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

Например, следующий вызов будет установлен на растровом положении 100 пикселей вправо и на 30 пикселей выше в нижнем левом углу окна:

glWindowPos2i(100, 30); 

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

+0

Но OP хочет «написать текст рядом с объектом», что необходимо учитывать при преобразовании. – usr2564301

+1

@ Jongware Хм, да. 'glRasterPos' должен на самом деле отлично работать для этого случая. Они говорят о «моей проблеме», но на самом деле не говорят, в чем проблема. –

Смежные вопросы