При помощи модуля gpu в Blender Python API на рабочую область 3D вьюпорта можно выводить не только изображения, но и печатать произвольный текст. Печать текста осуществляется при помощи модуля blf – обертки над OpenGl.
Для начала загрузим шрифт, которым мы в дальнейшем будем печатать текст, из файла.
1 2 3 |
import blf font_id = blf.load('d:/Righteous-Regular.ttf') |
Функция load() модуля blf возвращает число – идентификатор загруженного шрифта.
Если нет необходимости использовать внешние шрифты, значение font_id можно установить равным 0, тогда будет использоваться текущий системный шрифт Blender.
1 |
font_id = 0 |
Идентификатор шрифта передается первым параметром во все функции blf, отвечающие за вывод текста на экран.
Определим функцию, которая будет выводить текст на экран 3D вьюпорта:
1 2 3 4 5 |
def draw(font_id): blf.position(font_id, 100, 100, 0) blf.size(font_id, 100) blf.color(font_id, 0, 1, 1, 1) blf.draw(font_id, "Hello World") |
В параметре font_id мы передаем в эту функцию определенный ранее идентификатор шрифта.
При помощи функции position() мы задаем расположение выводимого текста на экране вьюпорта. В параметрах передаются координаты X, Y и Z. Отсчет ведется от левого нижнего угла 3D вьюпорта.
Функция size() устанавливает размер шрифта.
Цвет шрифта задается при помощи функции color(). В параметрах передаются значения в формате RGBA от 0.0 до 1.0.
И, наконец, функция draw() выводит текст, переданный в ее параметре, на экран.
Для того чтобы наша функция заработала, подключим ее в обработчик события отрисовки 3D вьюпорта.
1 2 3 |
bpy.types.SpaceView3D.draw_handler_add( draw, (font_id,), 'WINDOW', 'POST_PIXEL' ) |
В первом параметре мы передаем указатель на нашу функцию вывода текста.
Второй параметр – список аргументов для нашей функции. Мы передаем в нее идентификатор шрифта font_id. При необходимости, можно передавать больше параметров, указывая их через запятую.
Третий параметр – идентификатор региона окна.
И четвертый – тип вывода на экран. Значение “POST_PIXEL” указывает на рисование в координатной плоскости рабочей области.
Принудительно обновим рабочую область окна, чтобы выведенный текст сразу отобразился на экране вьюпорта.
1 2 |
for area in bpy.context.screen.areas: area.tag_redraw() |
Полный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import bpy import blf font_id = blf.load('d:/Righteous-Regular.ttf') def draw(font_id): blf.position(font_id, 100, 100, 0) blf.size(font_id, 100) blf.color(font_id, 0, 1, 1, 1) blf.draw(font_id, 'Hello World') bpy.types.SpaceView3D.draw_handler_add( draw, (font_id,), 'WINDOW', 'POST_PIXEL' ) for area in bpy.context.screen.areas: area.tag_redraw() |