Рисование «точечных» фигур в OpenGL, безразлично для увеличения - PullRequest
3 голосов
/ 12 мая 2009

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

В настоящее время я могу строить точки, используя OpenGL, но только в виде кругов (или «квадратов», отключив сглаживание). Эти точки действуют так, как мне нравится - то есть они не меняют размер при увеличении, хотя их положения x / y / z перемещаются соответствующим образом при масштабировании, панорамировании и т. Д.

То, что я хотел бы сделать, это построить точки, используя множество форм (^, <,>, *,. И т. Д.). Из того, что я понимаю об OpenGL (что не очень), это не тривиально, потому что OpenGL рассматривает все как «настоящий» трехмерный объект, поэтому увеличение любой формы openGL, но «точка» изменяет проекцию объекта размер.

После прочтения, я думаю, есть (по крайней мере) 2 возможных решения этой проблемы:

  1. Использовать текстуры OpenGL. Это не кажется сложным, но я считаю, что изображения текстур будут увеличиваться и уменьшаться при увеличении масштаба - это правильно?

  2. Используйте полигоны OpenGL, линии и т. Д. И рисуйте *, треугольники или что-то еще. Но здесь я снова сталкиваюсь с той же проблемой - как я могу помешать OpenGL изменить размер «точек» при масштабировании?

Является ли решение просто прикусить маркер и заново рисовать весь набор данных каждый раз, когда пользователь увеличивает или перемещает изображение, чтобы убедиться, что точки остаются одинакового размера? Есть ли способ просто сказать openGL не пересчитывать размер объекта?

Извините, если это где-то в документе OpenGL - я не смог его найти.

Ответы [ 3 ]

8 голосов
/ 12 мая 2009

То, что вы хотите, называется «точечный спрайт». OpenGL1.4 поддерживает их через расширение ARB_point_sprite.

Попробуйте этот урок

http://www.ploksoftware.org/ExNihilo/pages/Tutorialpointsprite.htm

и посмотрите, ищите ли вы это.

2 голосов
/ 12 мая 2009

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

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

В дополнение к изменению размера, вы хотите, чтобы точки сюжета были обращены к камере, поэтому billboarding - это ваше решение.

Альтернативой является проект каждого из точек точек трехмерного графика, чтобы узнать их координаты 2D-экрана. Затем просто визуализируйте полигоны с этими координатами экрана. Не требуется повторное масштабирование. Однако gluProject работает довольно медленно, поэтому я был бы очень удивлен, если бы он не был на несколько порядков медленнее, чем простое изменение масштаба полигонов точек графика, как я впервые предложил.

Удачи!

0 голосов
/ 12 мая 2009

Нет простого способа сделать то, что вы хотите. Вам придется динамически изменять размеры примитивов, которые вы рисуете, в зависимости от текущего масштаба камеры. Вы можете использовать технику, известную как billboarding , чтобы ваши объекты всегда были направлены к камере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...