Как реализовать рисование (с поддержкой слоев) в OpenGL? - PullRequest
3 голосов
/ 20 июля 2011

ситуация

Я реализую редактор полей высоты с двумя видами.На главном экране отображается поле высоты в 3D, позволяющее перемещаться по трекболу.В режиме редактирования поле высоты отображается в виде 2D-изображения.
Поверх этого поля высоты могут быть применены новые изображения, изменяющие его внешний вид (прорезанные отверстия, нижние, повышенные области).Это так называемые патчи .
Внизу поля высоты, и патчи представляют собой одноканальные изображения png в градациях серого.

Для визуализации я использую библиотеку визуализации framework (c ++) и OpenGL 4.

task
Реализовать инструмент для рисования, доступный в 2D режиме редактирования (ортографическая проекция), который создает эти патчи (как отдельные изображения) во время выполнения.

важные примечания / ограничения

  • изображение поля высоты может быть масштабировано, повернуто и транспонировано.
  • патчи должны иметь тот же масштаб, что и поле высоты, поэтому один пиксель в патче покрывает ровно пиксель в поле высоты.
  • в результате масштабирования размер пикселя кадрового буфера может бытьбольше или меньше, чем размер поля высоты / пикселя изображения патча.
  • сцена содержит объекты (пример: указывающая стрелка), которые не должны появляться в патче.

вопрос чтоправильный подход к этой задаче?До сих пор у меня были следующие идеи:

  • Используйте какой-нибудь холст QT для создания патча, затем сопоставьте его с предложениями изображения поля высоты и сохраните как новый патч.Это будет делаться каждый раз, когда пользователь начинает рисовать, таким образом реализация отмены будет легкой (удалите последний созданный патч).
  • Используйте нейтрально окрашенное изображение в сочетании с буферными объектами textre, чтобы сам реализовать какой-то холст.Таким образом, каждый раз, когда пользователь прекращает рисовать, содержимое canvas отображается в поле высоты и сохраняется как патч.Сброс холста для следующего чертежа.
  • Вот несколько примеров использования буфера кадра.Однако я не уверен, что этот подход соответствует моим потребностям.Когда я использую open gl, чтобы нарисовать субизображение в буфере кадра, не будет ли полученное изображение содержать все данные?

1 Ответ

1 голос
/ 19 августа 2011

Вот то, что я заканчиваю:

Я использую PickIntersector библиотеки визуализации, чтобы снова выбрать изображение поля высоты в режиме редактирования.Это вызывает локальные координаты изображения.Там преобразуются в ультрафиолетовые координаты, которые в свою очередь преобразуются в пиксельные координаты.Это делается, когда пользователь нажимает кнопку мыши, и продолжает происходить, когда мышь перемещается, пока она находится над изображением.

У меня есть класс PatchCanvas, который собирает все эти точки.В командах она использует библиотеку Anti-Grain Geometry , чтобы случайно растеризовать линии, которые можно построить из точек.

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

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

...