Blender : piloter une couleur

On peut « piloter » à peu près tout ce que l'on veut dans Blender. Voici comment contrôler une couleur, dans un matériel par exemple, à partir d'une propriété personnalisée.

Une couleur RGB

Une couleur, c'est basiquement la synthèse additive de trois nombres / couleurs (pour simplifier) : le rouge (red), le vert (green) et le bleu (blue), soit « RGB ».

On fait varier ce nombre soit de 0 à 1, soit de 0 à 255.

Propriété personnalisée couleur

Custom property

  • Créer une propriété personnalisée de type « Float Array » (tableau de flottant).
  • Définir la taille à 3.
  • Définir le sous-type (« subtype ») à « Linear Color »).

Soit un tableau de trois nombres variant de 0 à 1 qui vont représenter les valeurs pour le rouge, le vert et le bleu d'une couleur RGB.

Driver sur un noeud Color

On ne peut pas créer de driver avec cette propriété : on ne peut pas piloter une couleur directement avec une autre couleur. Il faut plutôt piloter le canal rouge de la couleur avec le premier nombre du tableau de la propriété, le canal vert avec le second nombre et le canal bleu avec le troisième.

  • Récupèrer la référence à la propriété personnalisée en faisant un click droit puis « copy data path » (["Color"]).
  • Dans le matériel où se trouve la couleur à piloter, créer une node « combine color » qui permet de définir les canaux rouge, vert et bleu d'une couleur.
  • Créer un driver pour le canal rouge.
  • La variable définissant sa valeur doit pointer sur le premier élément (index 0) de la propriété personnalisée.

Drive red

Faire de même pour les canaux vert et bleu en incrémentant l'index à chaque fois :

Drive green

drive blue

La couleur est maintenant pilotable depuis une propriété personnalisée.

Piloter une propriété couleur à l'aide d'une autre propriété couleur

On peut faire la même chose en python. Voici un exemple de pilotage d'une propriété couleur source_color d'un object source_obj à l'aide de la propriété couleur target_color d'un objet target_obj :

def add_channel_driver(fcurve, index):
    driver = fcurve.driver
    driver.type = "AVERAGE"
    var = driver.variables.get("var")
    if var is None:
        var = driver.variables.new()
        var.name = "var"
    var.targets[0].id_type = "OBJECT"
    var.targets[0].id = target_obj.id_data
    var.targets[0].data_path = f'["{target_color}"][{index}]'
    fcurve.update()

fcurve_r, fcurve_g, fcurve_b = source_obj.driver_add(source_color)
add_channel_driver(fcurve_r, 0)
add_channel_driver(fcurve_g, 1)
add_channel_driver(fcurve_b, 2)