Рисование в окне вьюпорта

API Blender предоставляет возможность рисовать в окне вьюпорта (3D Viewport) при помощи модуля gpu.

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

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

Зададим координаты шести точек, каждая пара из которых образует отрезок из центра координат — точки (0.0, 0.0, 0.0) в точку отстоящую на 1 по нужной оси (X, Y и Z):

Для каждой точки зададим цвета в формате RGBА. Для первой пары точек — красный (1.0, 0.0, 0.0), для второй — синий (0.0, 1.0, 0.0) и для третьей пары — зеленый (0.0, 0.0, 1.0).

Создадим шейдер для заданных цветов:

И соберем все вместе в единый пакет для отображения во вьюпорте:

Значение второго параметра «LINES» отвечает за режим отображения геометрии, в данном случае — рисование линий по заданным точкам.

Определим функцию, которая будет осуществлять собственно отрисовку заданного пакета во вьюпорте:

и добавим ее в обработчик события перерисовки окна вьюпорта.

Функция draw теперь будет вызываться каждый раз при обновлении вьюпорта.

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

Итоговый код выглядит следующим образом:

Если его выполнить, во вьюпотре будет отображаться созданный нами виджет:

На текущий момент еще не все возможности перенесены в gpu модуль AIP. Например для задания толщины линий, нужно воспользоваться модулем bgl:

Финальный код:

Для удаления отрисовки виджена нужно удалить функцию draw из обработчика обновления окна.