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
 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#! bpy
"""
Name: 'colored_labyrinth.py'
Blender: 2.7x
Group: 'Materials'
Tooltip: 'Generates colorful objects by materials'
"""
import bpy

level_00 = ["###################",
            "#.                #",
            "#        $        #",
            "#                 #",
            "#                 #",
            "#        @        #",
            "#                 #",
            "#                 #",
            "#                 #",
            "#                 #",
            "###################"]


level_01 = ["    #####           ",
            "    #   #           ",
            "    #$  #           ",
            "  ###  $##          ",
            "  #  $ $ #          ",
            "### # ## #   ###### ",
            "#   # ## #####  ..# ",
            "# $  $          ..# ",
            "##### ### #@##  ..# ",
            "    #     ######### ",
            "    #######         "]

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


def sokobanLevel(level):
    """Generating a labyrinth with colored cubes"""

    cols = len(level[0])
    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))


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


if __name__ == '__main__':
    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