Usar un objeto como variable de controlador
Tengo una función para un controlador que espera 2 objetos como argumentos, y no puedo encontrar una manera de establecer la variable como ID de objeto, solo una propiedad única de ese objeto. ¿Es eso posible?

Respuestas
Puede configurar el controlador para la ruta de datos y utilizar "nombre" como ruta, a costa de obtener el objeto a partir de su nombre.
Con esta configuración, el usuario puede cambiar el nombre del objeto y el controlador no se romperá.

Usando el depsgraph
Desde la actualización a 2.8, el depsgraph es un miembro de los locales de un controlador, al igual que las variables. Ver respuesta a
¿Cómo utilizar diferentes tipos de bloques de datos para las variables del controlador?
Estás configurando un controlador de prueba.
Como ejemplo, el controlador está en "Cube". El objeto "Lámpara" está en escena y se pasa como un objeto evaluado al conductor a través del depsgraph. También se puede utilizar el 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>
Un ejemplo para devolver z global mínimo de todos los demás objetos en el depsgraph. El método de @lemon se puede utilizar para los nombres de los objetos. Otras opciones podrían etiquetarlos mediante una propiedad personalizada o un sufijo de prefijo de nombre.
def test(self, *args, depsgraph=None, **kwargs):
z = min(o.matrix_world.translation.z for o in depsgraph.objects
if o != self)
return z
Pointerproperties.
En mi opinión, la mejor manera de asociar un objeto (s) con otro es a través de una propiedad de puntero
bpy.types.Object.driver_obj1 = bpy.props.PointerProperty(type=bpy.types.Object)
que se puede asignar a través de un script o UI.
context.object.driver_object1 = context.scene.objects.get("Lamp")