hc-material-faces

Übersicht: Python & Blender


Lernziel

Material kann nicht nur einem kompletten Objekt (Mesh) zugeordent werden, sondern auch der kleinsten Flächeneinheit, den Faces. Wie das funktioniert, wird in dieser Lerneinheit gezeigt.

Handlungsanweisungen

Aufgaben:
  1. Erzeuge den farbigen Würfel mit normalne Maus- und Tastatureingaben. Zähle die Anzahl der Maus- und Tastatur-Aktionen!

  2. Erzeuge einen Zylinder und ändere die Farbe der Zylinderwand; Deckel und Boden sollen eine andere Farbe erhalten. Hinweis: Sieh dir die Funktion getIndexOfFaces aus der Befehlsübersicht im Anhang an.

  3. Erstell das folgende Grundmuster für ein Schachbrett/Damespiel.

    /blender-basics/h-material/chessboard.png
  4. Stell einen Spielstein für Dame oder Schach auf ein Feld.

    /blender-basics/h-material/Boilly-Checkers-1803.jpg
    Louis-Léopold Boilly (1761–1845)
    Gemälde mit Dame spielender Familie
    (»jeu des dames«) [1]

Ein Würfel mit drei Farben

Willst Du die Farbe (das Material) nicht einem ganzen Objekt zuweisen, sondern nur Teile des Meshes einfärben, so sind die passenden Flächen (faces) auszuwählen. Hier das Skript für diese Aufgabe.

blender-basics/h-material/colored-cube.py (Source)

#!bpy
"""
Name: 'colored_cube.py'
Blender: 2.7x
Group: 'Material'
Tooltip: 'Colored faces'
"""
import bpy

red = bpy.data.materials.new('Red')
blue = bpy.data.materials.new('Blue')
yellow = bpy.data.materials.new('Yellow')


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


def colored_cube():
    """ A three colored cube """

    bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0))
    ob = bpy.context.object
    ob.name = 'my colored cube'

    setColor(ob, red, (1, 0, 0))
    setColor(ob, yellow, (1, 1, 0))
    setColor(ob, blue, (0, 0, 1))

    # apply the colors
    for face in ob.data.polygons:
        face.material_index = face.index % 3

if __name__ == '__main__':
    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()
    colored_cube()

Namen für Farben

Alle Farben sollten einen Namen erhalten, das ist der erste Schritt.

blender-basics/h-material/colored-cube.py (Source)

red = bpy.data.materials.new('Red')
blue = bpy.data.materials.new('Blue')
yellow = bpy.data.materials.new('Yellow')

Faces mit Material versehen

Das ist ein kleiner Trick, mit dem jede Fläche garantiert eine Farbe bekommt. Der Reihe nach:

  • Alle Flächen eines Mesh (im Würfel sind es genau sechs) werden in einer Liste (polygones) verwaltet. Jedes hat eine Nummer, den Listen-Index.
  • In einer for-Schleife werden alle Einträge verarbeitet.
  • Die Indexnummer wird mit dem Modulo-Operator durch drei geteilt und erhält damit entweder eine 0, eine 1 oder eine 2 als Rest der Division.
  • Dieser Wert wird dem Material-Index zugewiesen und damit erhält die Fläche (face) eine rote, gelbe oder blaue Farbe, denn auch die Materialien werden über einen Index verwaltet.

blender-basics/h-material/colored-cube.py (Source)

    # apply the colors
    for face in ob.data.polygons:
Hinweis: In alten Tutorials, die sich auf Blenderversionen vor 2.68 beziehen, erfolgt die Zuweisung an eine Liste mit dem Namen faces. Das funktioniert nun nicht mehr und deshalb müssen diese Zeilen, wie hier gezeigt, auf polygones umgeschrieben werden.

Ergebnis

/blender-basics/h-material/faces-colored-200.png

Kommentare