Utiliser un objet comme variable de pilote

Dec 04 2020

J'ai une fonction pour un pilote qui attend 2 objets comme arguments, et je ne trouve pas de moyen de définir la variable comme ID d'objet, une seule propriété de cet objet. Est-ce possible?

Réponses

3 lemon Dec 05 2020 at 14:37

Vous pouvez définir le pilote sur chemin de données et utiliser "nom" comme chemin, au prix d'obtenir l'objet à partir de son nom.

Avec ce paramètre, l'objet peut être renommé par l'utilisateur et le pilote ne sera pas endommagé.

4 batFINGER Dec 05 2020 at 17:50

Utilisation du depsgraph

Depuis la mise à niveau vers la version 2.8, le depsgraph est membre des sections locales d'un pilote, tout comme les variables. Voir la réponse à

Comment utiliser différents types de blocs de données pour les variables de pilote?

re mise en place d'un pilote de test.

A titre d'exemple, le pilote est sur "Cube". L'objet "Lampe" est en scène, et passé comme objet évalué au pilote via le depsgraph. Le depsgraph peut également être utilisé.

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 exemple pour renvoyer le z global minimum de tous les autres objets dans le depsgraph. La méthode de @lemon peut être utilisée pour les noms d'objets. D'autres options peuvent être de les étiqueter via une propriété personnalisée ou un suffixe de préfixe de nom.

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

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

    return z  

Propriétés du pointeur.

IMO, la meilleure façon d'associer un ou plusieurs objets à un autre est via une propriété de pointeur

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

qui peut être attribué via un script ou une interface utilisateur.

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