Material: Ein Labyrinth in Farbe

Lernziel

Bis jetzt waren unsere 3D-Objecte grau in grau. Wir wollen diese Welt etwas bunter gestalten. Dafür verwenden wir die Materialien und/oder Texturen.

Handlungsanweisungen/Aufgaben

  1. Konstruiere ein eigenes Labyrinth.

  2. Erzeuge für die Symbole $ und @ ein anderes Objekt (Kegel oder Zylinder, Halma-Figur)

  3. Erzeuge unterschiedliche Farben für die einzelnen Steine.

Das Labyrinth

Das Labyrinth wird wie in der vorhergehenden Station erzeugt, diesmal aber mit Material versehen.

 1#! bpy
 2"""
 3Name: 'colored_labyrinth.py'
 4Blender: 2.7x
 5Group: 'Materials'
 6Tooltip: 'Generates colorful objects by materials'
 7"""
 8import bpy
 9
10level_00 = ["###################",
11            "#.                #",
12            "#        $        #",
13            "#                 #",
14            "#                 #",
15            "#        @        #",
16            "#                 #",
17            "#                 #",
18            "#                 #",
19            "#                 #",
20            "###################"]
21
22
23level_01 = ["    #####           ",
24            "    #   #           ",
25            "    #$  #           ",
26            "  ###  $##          ",
27            "  #  $ $ #          ",
28            "### # ## #   ###### ",
29            "#   # ## #####  ..# ",
30            "# $  $          ..# ",
31            "##### ### #@##  ..# ",
32            "    #     ######### ",
33            "    #######         "]
34
35MATERIAL_RED = bpy.data.materials.new('Red Material')
36
37
38def sokobanLevel(level):
39    """Generating a labyrinth with colored cubes"""
40
41    cols = len(level[0])
42    rows = len(level)
43
44    for row in range(rows):
45        for i in range(cols):
46            if level[row][i] == '#':
47                bpy.ops.mesh.primitive_cube_add(location=(row*2, i*2, 0))
48                obj = bpy.context.object
49                setColor(obj, MATERIAL_RED, (1, 0, 0))
50
51
52def setColor(obj, material, color):
53    material.diffuse_color = color
54    material.specular_hardness = 200
55    obj.data.materials.append(material)
56
57
58if __name__ == '__main__':
59    sokobanLevel(level_00)

Material erstellen

Jedes Material erhält einen Namen, wird in Blender unabhängig von den Objekten verwaltet und kann mehreren Objekten zugewiesen werden.


MATERIAL_RED = bpy.data.materials.new('Red Material')

Objekt speichern

Nach dem Erstellen wird das Objekt in der Variablen obj zugewiesen.

    rows = len(level)

    for row in range(rows):
        for i in range(cols):
            if level[row][i] == '#':
                bpy.ops.mesh.primitive_cube_add(location=(row*2, i*2, 0))
                obj = bpy.context.object
                setColor(obj, MATERIAL_RED, (1, 0, 0))

Funktionsaufruf mit Parameter

Die Funktion setColor erwartet drei Parameter: das Objekt, das Material und den Farbwert für das Material.

                obj = bpy.context.object
                setColor(obj, MATERIAL_RED, (1, 0, 0))

Material zuweisen

In der Funktion setColor wird die Materialzuweisung mit den drei Parametern realisiert.


def setColor(obj, material, color):
    material.diffuse_color = color
    material.specular_hardness = 200
    obj.data.materials.append(material)

Das Ergebnis

../../../_images/colored-labyrinth.png