Monte le son !

Ce post est une traduction d’une réponse que j’ai faite il y a quelques temps sur blenderstack.

Nous allons utiliser un petit script assez vilain pour générer une bande de diodes qui s’allumeront en fonction de la rotation du potentiomètre. L’ensemble sera paramétrable, combien de diodes, sur quelle couverture angulaire :

Supposons que vous regardiez le bouton depuis la vue de dessus :

Pour plus de facilité, on modélise la diode comme suit et on la parente avec le potentiomètre, à un empty situé au centre de ce dernier. Le potentiomètre doit avoir ses rotations appliquées (ctrl+a > rotation) et réglées en mode xyz euler, sinon la bande de diodes ne s’allumera que sur 180°. On ajoute un matériau à la diode, un simple diffuse qui sera modifié plus tard. Ensuite on passe en mode pivot 3D cursor, et on positionne avec le snap le curseur au centre du potentiomètre ou sur l’empty.  L’idée maintenant, est de faire une copie liée de la diode, la tourner autour du curseur d’un certain angle, puis d’ajouter une custom property ou mieux, d’utiliser l’index d’objet qui se trouve dans le panneau d’objet et de l’incrémenter à chaque copie. N’étant pas un grand développeur et pressé par le temps, vous trouverez le script ci-dessous dans le fichier blend, créer à partir de copier coller depuis le panneau d’info de blender.

import bpy
from math import radians

# range covered (in degrees)
rangecovering = 270

# number of leds
leds = 20

##############################"
# step calculated
steprad = radians(rangecovering/leds)

#the override comes from http://blender.stackexchange.com/questions/6969/rotate-object-around-cursor-with-python

def get_override(area_type, region_type):
    for area in bpy.context.screen.areas: 
        if area.type == area_type:             
            for region in area.regions:                 
                if region.type == region_type:                    
                    override = {'area': area, 'region': region} 
                    return override
    #error message if the area or region wasn't found
    raise RuntimeError("Wasn't able to find", region_type," in area ", area_type,
                        "\n Make sure it's open while executing script.")

#we need to override the context of our operator    
override = get_override( 'VIEW_3D', 'WINDOW' )

for N in range(0,leds) :

    # do a duplicate link
    bpy.ops.object.duplicate_move_linked(OBJECT_OT_duplicate={"linked":True, "mode":'TRANSLATION'}, TRANSFORM_OT_translate={"value":(0, 0, 0)})

    # rotation of the duplicate
    bpy.ops.transform.rotate(override, value=steprad, axis=(-0, -0, -1), constraint_axis=(False, False, False), constraint_orientation='GLOBAL')

    # change pass index obj
    bpy.context.object.pass_index = N+1

Il suffit de modifier la zone couverte en degré (rangecovering), le nombre de leds souhaité (leds), et cela créera une bande de diodes autour du curseur 3D.

Si l’on souhaite modifier la forme des diodes (en mode edit), vous pouvez le faire et elles seront toutes modifiées en même temps puisque ce sont des copies liées. On peut aussi modifier les données d’un mesh et les lier aux autres rapidement.

Ensuite il faut créer un matériau piloté par la rotation du potentiomètre.

On doit ajouter un driver dans la case violette évidemment.

Lorsque l’on crée le driver, il faut utiliser le nom de variable « var » dans le champ « Scripted Expression », et l’axe local Z pour pouvoir tourner l’ensemble en utilisant l’empty.

J’ai choisi de conserver la coube par défaut lors de l’ajout d’un driver (0-1) et gérer les valeurs clés directement dans le matériau, de cette façon nous n’avons que quelques paramètres à ajuster pour faire fonctionner l’ensemble : « number of leds » pour le nombre de leds que nous avons généré, et « range of strip leds » pour l’angle de la zone couverte.

Si on veut tourner le potentiomètre pour recentrer la bande de diodes, on utilise l’empty.

Si on tourne le potentiomètre uniquement, alors la magie opére…

Si vous utilisez le même matériau « led » pour une partie du potentiomètre et que vous donnez à cet objet un indexpass = 0, elle s’illuminera en même temps que la première diode.

Le blend est dispo sur blendswap !

Une réflexion au sujet de « Monte le son ! »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *