В ряде инструментов, например, “пипетка” или “выделение по цвету”, бывает нужно получить значение пикселя текстуры, который в данный момент находится под курсором мышки. Для получения данных о пикселе необходимо знать его координаты в пространстве текстуры.
В Blender, отслеживая событие MOUSEMOVE в модальном операторе, мы можем получить координаты точки, которая находится под курсором мышки, в пространстве текущей рабочей области.
Значения координат в пространстве рабочей области мы можем получить из свойств обрабатываемого события:
- X координата – event.mouse_region_x
- Y координата – event.mouse_region_y
Однако очевидно, что текстура занимает не всю площадь рабочей области Image Editor, вокруг нее могут оставаться свободные поля, или же наоборот, текстура может быть увеличена масштабированием и выходить за пределы рабочей области.
Для того, чтобы преобразовать координаты из координат рабочей области в координаты текстуры, можно воспользоваться функцией region_to_view. Эта функция позволяет преобразовать координаты рабочей области, которые изменяются от 0 до бесконечности в линейные координаты текстуры, которые изменяются от 0 до 1.
Определим модальный оператор, который будет отслеживать событие MOUSEMOVE и при его обработке переводить координаты курсора мышки в линейные координаты текстуры.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import bpy # operator class CursorOperator(bpy.types.Operator): bl_idname = 'cursor.operator' bl_label = 'Cursor Operator' def modal(self, context, event): if event.type == 'MOUSEMOVE': print('area coordinates', 'x = ', event.mouse_region_x, 'y = ', event.mouse_region_y) texture_coordinates = context.region.view2d.region_to_view(event.mouse_region_x, event.mouse_region_y) print('texture coordinates', 'x = ', texture_coordinates[0], 'y = ', texture_coordinates[1]) if event.type in {'RIGHTMOUSE', 'ESC'}: # exit return {'FINISHED'} return {'RUNNING_MODAL'} def invoke(self, context, event): print('start') context.window_manager.modal_handler_add(self) return {'RUNNING_MODAL'} bpy.utils.register_class(CursorOperator) |
Также определим панель в окне Image Editor с кнопкой для вызова этого оператора.
1 2 3 4 5 6 7 8 9 10 11 |
class CURSOR_PT_Panel(bpy.types.Panel): bl_idname = 'CURSOR_PT_Panel' bl_label = 'Cursor' bl_space_type = 'IMAGE_EDITOR' bl_region_type = 'UI' bl_category = 'Cursor' def draw(self, context): self.layout.operator('cursor.operator', icon='BLENDER', text='Start') bpy.utils.register_class(CURSOR_PT_Panel) |
Теперь при нажатии на кнопку выполнения оператора в нашей панели в рабочей области Image Editor, в консоль будут печататься текущие координаты курсора мышки в рабочей области, а так же линейные координаты в области текстуры от 0 до 1.
Если получаемые значения выходят за пределы диапазона 0 – 1, это означает что курсор мышки вышел за пределы текстуры.
Для того, чтобы получить абсолютные текстурные координаты, нужно умножить получаемые значения на разрешение текстуры: для x – по горизонтали, для y – по вертикали.
Чтобы остановить работу оператора, кликните правой кнопкой мышки или нажмите клавишу ESC.