dc-complex-piece

Übersicht: Python & Blender


Lernziel

Die Objekte sind nach er ersten Operation erstellt, es fehlt aber oft die richtige Größe und Lage. Wie das im zweiten Schritt nachgeholt werden kann, wird hier gezeigt.

Handlungsanweisungen

Aufgaben:
  1. Füge zwei Körper zu einem neuen Gebilde zusammen.

  2. Platziere den zusammengesetzten Körper an einer neuen Stelle im Raum

  3. Bau den folgenden Körper mit Hilfe eines Skriptes nach...

    /blender-basics/d-composed-pieces/camera.png
  4. Erstelle ein eigenes Objekt.

Objeke erzeugen

Das komplette Skript, die Erklärungen folgen.

blender-basics/d-composed-pieces/mars-mobile.py (Source)

#!bpy
"""
Name: 'mars_mobile.py'
Blender: 2.7x
Group: 'Composition'
Tooltip: 'Rotate, locate and scale objects assembled to a futuristic car'
"""
import bpy


def create_objects():
    """Create objects from a list of attributes

    List values:

    object name   -- string
    object type   -- string
    location      -- tupel of integers
    """
    objectlist = [('cu1', 'cube', (-6, 1, 1)),
                  ('cu2', 'cube', (-3, 1, 1)),
                  ('cy1', 'cylinder', (0, 1, 1)),
                  ('cy2', 'cylinder', (3, 1, 1)),
                  ('uv1', 'uv_sphere', (6, 1, 1)),
                  ('uv2', 'uv_sphere', (9, 1, 1))]

    for element in objectlist:
        if element[1] == 'cube':
            bpy.ops.mesh.primitive_cube_add(location=element[2])
        if element[1] == 'cylinder':
            bpy.ops.mesh.primitive_cylinder_add(location=element[2])
        if element[1] == 'uv_sphere':
            bpy.ops.mesh.primitive_uv_sphere_add(location=element[2])
        # give it a name
        obj = bpy.context.object
        obj.name = element[0]


def select_cubes():
    """Sample: select two objects by name """

    bpy.ops.object.select_pattern(pattern="cu2")
    bpy.ops.object.select_pattern(pattern="cu1")


def activate_object():
    """Sample: activate an object by name"""

    bpy.context.scene.objects.active = bpy.data.objects["cu2"]


def scale_cu2():
    """Select, scale and move cube 2"""

    bpy.context.scene.objects.active = bpy.data.objects["cu2"]
    obj = bpy.context.scene.objects.active
    obj.scale = (1, 1, 3)
    obj.location = (-3, 1, 3)


def scale_cy():
    """Select cylinders, scale and move"""

    bpy.context.scene.objects.active = bpy.data.objects["cy1"]
    obj = bpy.context.scene.objects.active
    obj.scale = (1, 1, .2)
    obj.location = (0, 1, .2)

    bpy.context.scene.objects.active = bpy.data.objects["cy2"]
    obj = bpy.context.scene.objects.active
    obj.scale = (1, 1, .2)
    obj.location = (3, 1, .2)


def assemble_mars_mobile():
    """Create a composite piece """

    half_of_pi = 3.141592/2

    # body
    bpy.context.scene.objects.active = bpy.data.objects["cu2"]
    obj = bpy.context.scene.objects.active
    obj.location = (-3, 1, 1.5)
    # rotation
    obj.rotation_euler = [half_of_pi, 0, 0]

    # wheel (right)
    bpy.context.scene.objects.active = bpy.data.objects["cy1"]
    obj = bpy.context.scene.objects.active
    obj.location = (-4, 2, 1)
    obj.rotation_euler = [0, half_of_pi, 0]

    # wheel (left)
    bpy.context.scene.objects.active = bpy.data.objects["cy2"]
    obj = bpy.context.scene.objects.active
    obj.location = (-2, 2, 1)
    obj.rotation_euler = [0, half_of_pi, 0]

    # wheel (front)
    bpy.context.scene.objects.active = bpy.data.objects["uv1"]
    obj = bpy.context.scene.objects.active
    obj.location = (-3, -1, 1)

    # cabin
    bpy.context.scene.objects.active = bpy.data.objects["cu1"]
    obj = bpy.context.scene.objects.active
    obj.location = (-3, 2, 3)

    bpy.context.scene.objects.active = bpy.data.objects["uv2"]
    obj = bpy.context.scene.objects.active
    obj.location = (-3, 2, 4)


if __name__ == '__main__':
    if bpy.ops.object.mode_set.poll():
        bpy.ops.object.mode_set(mode='OBJECT')
    # delete all meshes from a szene
    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()
    create_objects()
    ## comment and uncomment the lines as you like
    ## to call the functions...
    # select_cubes()
    # activate_object()
    # scale_cu2()
    # scale_cy()
    # assemble_mars_mobile()

Wie es funtkionert

Es werden einzelne Zeilen/Funktionen vorgestellt. Jede Funktion löst eine Teilaufgabe. Wenn Du nicht nur das Endergebnis betrachten willst, dann kommentiere, bis auf die Funktion "objekte_anlegen", einzelne Funktionsaufrufe aus.

Im ersten Schritt werden sechs Objekte angelegt. Wichtig ist die Namensvergabe, um später, die Objekte über den Namen auswählen zu können.

/blender-basics/d-composed-pieces/all-pieces.png

Wichtig ist die Unterscheidung zwischen selektierten/ausgewählten Objekten und dem aktiven Objekt.

/blender-basics/d-composed-pieces/active-object.png

Wieviele Objekte ausgewählt sind, sieht man in der Info-Zeile, aber nur eines kann das aktive Objekt sein.

/blender-basics/d-composed-pieces/objectcount1.png

Objekte auswählen

blender-basics/d-composed-pieces/mars-mobile.py (Source)

def select_cubes():
    """Sample: select two objects by name """

    bpy.ops.object.select_pattern(pattern="cu2")
    bpy.ops.object.select_pattern(pattern="cu1")

Das aktive Objekt festlegen

Nur das aktive Objekt kann direkt manipuliert werden.

blender-basics/d-composed-pieces/mars-mobile.py (Source)

def activate_object():
    """Sample: activate an object by name"""

    bpy.context.scene.objects.active = bpy.data.objects["cu2"]

Größe es Objektes ändern

Die Größe kann in allen drei Dimensionen geändert werden. Soll keine Größenänderung stattfinden, bleibt der Faktor auf 1 stehen. Im Beispiel wird also nur in der z-Achse skaliert. Anschließend wird noch der Mittelpunkt verschoben, damit alle Objekte wieder auf der Grundlinie stehen.

blender-basics/d-composed-pieces/mars-mobile.py (Source)

def scale_cu2():
    """Select, scale and move cube 2"""

    bpy.context.scene.objects.active = bpy.data.objects["cu2"]
    obj = bpy.context.scene.objects.active
    obj.scale = (1, 1, 3)
    obj.location = (-3, 1, 3)

Im Gegensatz zum Würfel, werden die Zylinder verkleinert.

blender-basics/d-composed-pieces/mars-mobile.py (Source)

def scale_cy():
    """Select cylinders, scale and move"""

    bpy.context.scene.objects.active = bpy.data.objects["cy1"]
    obj = bpy.context.scene.objects.active
    obj.scale = (1, 1, .2)
    obj.location = (0, 1, .2)

    bpy.context.scene.objects.active = bpy.data.objects["cy2"]
    obj = bpy.context.scene.objects.active
    obj.scale = (1, 1, .2)
    obj.location = (3, 1, .2)

Rotation mit Euler

Nun haben wir alle Bauteile um ein Mars-Mobil zusammen setzen zu können. Wichtig ist hier die abschließende Rotation mit der folgenden Zeile:

obj.rotation_euler = [half_of_pi, 0, 0]

Wobei half_of_pi eine Drehung um 90° bewirkt. Wer mehr über die Berechnung einer Rotation erfahren möchte, findet die ausführliche Erklärung unter Objekt: Rotation

Damit ist der Prototyp für das nächste Seifenkistenrennen vollendet :-)

/blender-basics/d-composed-pieces/mars-mobile.png

Kommentare