Usar un objeto como variable de controlador

Dec 04 2020

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

3 lemon Dec 05 2020 at 14:37

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á.

4 batFINGER Dec 05 2020 at 17:50

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")