Использовать объект в качестве переменной драйвера

Dec 04 2020

У меня есть функция для драйвера, который ожидает 2 объекта в качестве аргументов, и я не могу найти способ установить переменную как идентификатор объекта, только одно свойство этого объекта. Это возможно?

Ответы

3 lemon Dec 05 2020 at 14:37

Вы можете установить драйвер для пути к данным и использовать «имя» в качестве пути за счет получения объекта по его имени.

С этой настройкой объект может быть переименован пользователем, и драйвер не сломается.

4 batFINGER Dec 05 2020 at 17:50

Использование депсграфа

Начиная с обновления до 2.8, depsgraph является членом локальных переменных драйвера, как и переменные. См. Ответ на

Как использовать разные типы блоков данных для переменных драйвера?

Повторная настройка тестового драйвера.

Например, драйвер находится на «Кубе». Объект «Лампа» находится в сцене и передается как оцениваемый объект водителю через depsgraph. Также можно использовать depsgraph.

def test(*args, depsgraph=None, **kwargs):
    for arg in args:
        print(arg)
    print(depsgraph)   
    return -1 # a simple val to indicate working

<bpy_struct, Object("Cube") at 0x7f62fcbefa08, evaluated>
<bpy_struct, Object("Lamp") at 0x7f62fcbf0008, evaluated>
<bpy_struct, Depsgraph at 0x7f62faba6c08>

Пример возврата минимального глобального z всех других объектов в depsgraph. Для имен объектов можно использовать метод @lemon. Другие варианты могут пометить их с помощью настраиваемого свойства или суффикса префикса имени.

def test(self, *args, depsgraph=None, **kwargs):

    z = min(o.matrix_world.translation.z for o in depsgraph.objects
    if o != self)

    return z  

Указатели.

IMO лучший способ связать объект (ы) с другим - через свойство указателя

bpy.types.Object.driver_obj1 = bpy.props.PointerProperty(type=bpy.types.Object)

который может быть назначен через скрипт или пользовательский интерфейс.

context.object.driver_object1 = context.scene.objects.get("Lamp")