Material und Farbe

Für die Anzeige der Zeit werden Farben verwendet. Die Farben werden mit einer speziellen Funktion gesteuert, die es später noch erlaubt, weitere Parameter zu setzen bzw. zu ändern. Materialien, Farben und Texturen spielen in Blender ein wichtige Rolle, deshalb gibt es eine verwirrende Anzahl von Möglichkeiten. Im ersten Schritt verändern wir lediglich die Farbe der Objekte. Die Farbe kann in der Blender-Game-Engine (nächster Schritt) leicht geändert werden.

Aufgaben/Handlungsanweisungen

  • füge die neue Funktion und den Funktionsaufruf in das Skript create_clock.py ein.

  • definiere eine andere Farbe

  • Welche Werte könnte man noch ändern (der Befehl dir() ist Dein Freund)?

    Es werden die drei Farbanteile rot, grün und blau definiert, die Werte müsen zwischen 0 = schwarz und 1 = weiß liegen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
     - names for all clock elements
     - smaller sizes for the minute elements
     - define the space between clock elements
     - create all parts of a clock

    """
    rows = len(parts)
    distances = [9.5, 3.75, 3.75, 1.6, 3.75]

    for row in range(rows):
        cols = len(parts[row])
        for col in range(cols):
            distance = distances[row]
            x = row * 3
            y = col * distance + distance
            obj = bpy.ops.mesh.primitive_cube_add(location=(x, y, 0))

            if row == 3:
                bpy.ops.transform.resize(value=(0.5, 0.5, 0.5))

            obj = bpy.context.object
            obj.name = parts[row][col]
            one_material(parts[row][col])


def one_material(mat_name):
    """ create a material for each object """

    scn = bpy.context.scene

Eine Farbe ist immer auch eine Eigenschaft eines Materials, deshalb definieren wir ein Material. Der Aufruf erfolgt in Zeile 27…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
    obj = scn.objects[mat_name]
    mat = bpy.data.materials.get(mat_name)
    if mat is None:
        # create material
        mat = bpy.data.materials.new(name=mat_name)
    mat.specular_intensity = 200
    mat.diffuse_color = (0, .9, .1)

    # Assign it to object
    if obj.data.materials:
        # assign to 1st material slot
        ob.data.materials[0] = mat
    else:
        # no slots
        obj.data.materials.append(mat)

def create_v6(parts):
    """ Create and compose a berlin-clock
    
     

Der Arbeitsschritt für die Material-Einstellungen wird in einer separaten Funktion zusammengefasst. In altbewährter Tradition muss nun auch mal Suzanne als Versuchsobjekt mitwirken.

../../../_images/berlin-clock-farbe.png

Erläuterungen im Detail

Zeilen 4 und 5 – Objekt auswählen

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
    obj = scn.objects[mat_name]
    mat = bpy.data.materials.get(mat_name)
    if mat is None:
        # create material
        mat = bpy.data.materials.new(name=mat_name)
    mat.specular_intensity = 200
    mat.diffuse_color = (0, .9, .1)

    # Assign it to object
    if obj.data.materials:
        # assign to 1st material slot
        ob.data.materials[0] = mat
    else:
        # no slots
        obj.data.materials.append(mat)

def create_v6(parts):
    """ Create and compose a berlin-clock
    
     

Das übliche Verfahren, ein Objekt auszuwählen…

Zeilen 7 bis 11 – existiert ein Objekt

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
    obj = scn.objects[mat_name]
    mat = bpy.data.materials.get(mat_name)
    if mat is None:
        # create material
        mat = bpy.data.materials.new(name=mat_name)
    mat.specular_intensity = 200
    mat.diffuse_color = (0, .9, .1)

    # Assign it to object
    if obj.data.materials:
        # assign to 1st material slot
        ob.data.materials[0] = mat
    else:
        # no slots
        obj.data.materials.append(mat)

def create_v6(parts):
    """ Create and compose a berlin-clock
    
     

Auch die Frage nach einem existierenden Material, kann daneben gehen. Wenn das der Fall ist, wird ein neues Material erstellt. Anschließend werden zwei interessante Parameter des Materials geändert.

Zeilen 13 bis 19 – Materialzuordnung

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
    obj = scn.objects[mat_name]
    mat = bpy.data.materials.get(mat_name)
    if mat is None:
        # create material
        mat = bpy.data.materials.new(name=mat_name)
    mat.specular_intensity = 200
    mat.diffuse_color = (0, .9, .1)

    # Assign it to object
    if obj.data.materials:
        # assign to 1st material slot
        ob.data.materials[0] = mat
    else:
        # no slots
        obj.data.materials.append(mat)

def create_v6(parts):
    """ Create and compose a berlin-clock
    
     

Ein Objekt kann nicht nur eine Materialzurodnung besitzen, wir begnügen uns mit dem ersten Material-Slot, ist der nicht vorhanden wird er belegt, ist er schon vorhanden wird unser Material dort verankert.

Im Outliner sieht das danach wie am Beispiel der Stundenanzeige gezeigt aus:

../../../_images/berlin-clock-farbe2.png