bottle

Übersicht: Python & Blender


Lernziel

a Wie kann aus einer Grundform, z.B. Kreis ein voluminöses Objekt wie eine Flasche gebildet werden? Diese Frage soll in dieser Lerneinheit geklärt werden.

Handlungsanweisungen

Aufgaben:
  1. Verändere die Form der Flasche.
  2. Ergänze die Flasche um, z.B. einen Drehverschluss oder einen Kronenkorken.
  3. Färbe das Mesh ein und gib der Farbe Transparenz.

Modellieren aus einer Grundform

Ein runder Gegenstand, wie eine Flasche ist eine ideale Form um mittels Extrudieren ein Objekt zu modellieren.

/use-cases/art/bottle/bottle.png

Im Prinzip fängt man mit dem Boden an

/use-cases/art/bottle/bottle-bottom.png

und extrudiert immer wieder einen Kreis senkrecht nach oben und verändert den Durchmesser.

/use-cases/art/bottle/bottle2.png

Um dem Material eine Dicke zu geben muss man sobald man oben am Flaschenrand angekommen ist, den Kreis verkleinern und nach unten extrudieren. Dabei folgt man der Kontur des äusseren Meshes. Das innere und äussere Mesh werden am Flaschenboden jeweils geschlossen.

Das komplette Skript

use-cases/art/bottle/bottle-de.py (Source)

#! bpy
"""
Name: 'Python und Blender'
Blender: 2.7x
Group: 'Beispiel'
Tooltip: 'Behaeltnis z.B. Flasche aus Kreis extrudieren'
"""

import bpy


def flasche():

    # Ein Abkuerzung, wir sparen etwas Tipparbeit
    # und einige Zeilen werden dadurch auch kuerzer

    bom = bpy.ops.mesh

    # Wir beginnen mit einem Kreis
    bom.primitive_circle_add(vertices=8, radius=0.1)
    # in den EDIT mode wechseln
    bpy.ops.object.mode_set(mode='EDIT')
    # Kreis extrudieren
    bom.extrude_region_move(MESH_OT_extrude_region={"mirror": False},
                            TRANSFORM_OT_translate={"value": (0, 0, 0)})

    # alle Ecken auswählen
    bom.edge_face_add()
    # den Boden schließen
    bom.merge(type='CENTER', uvs=False)
    # alle Vertices auswaehlen
    bom.select_all(action='INVERT')
    # einen neuen Kreis erstellen
    for idx in range(12):
        bom.extrude_region_move(
            MESH_OT_extrude_region={"mirror": False},
            TRANSFORM_OT_translate={"value": (0, 0, -0.05)})
        # der neue Kreis ist etwa 30% groesser
        bpy.ops.transform.resize(value=(1.3, 1.3, 1.3))

    # der untere Zylinder der Flasche in zwei Segmente unterteilt
    bom.extrude_region_move(MESH_OT_extrude_region={"mirror": False},
                            TRANSFORM_OT_translate={"value": (0, 0, 1)})
    bom.extrude_region_move(MESH_OT_extrude_region={"mirror": False},
                            TRANSFORM_OT_translate={"value": (0, 0, 1)})

    # mehrere Transformationen mit Größenveränderung,
    # damit die konische Form entsteht
    for idx in range(90, 60, -5):
        resize = idx/100.0
        bom.extrude_region_move(MESH_OT_extrude_region={"mirror": False},
                                TRANSFORM_OT_translate={"value": (0, 0, 0.5)})
        bpy.ops.transform.resize(value=(resize, resize, resize))

    # der Flaschenhals wird 2 Einheiten nach oben gezogen
    bom.extrude_region_move(MESH_OT_extrude_region={"mirror": False},
                            TRANSFORM_OT_translate={"value": (0, 0, 2)})

    bom.extrude_region_move(MESH_OT_extrude_region={"mirror": False},
                            TRANSFORM_OT_translate={"value": (0, 0, 0)})

    # die Öffnung der Flasche wird verkleinert
    bpy.ops.transform.resize(value=(0.90, 0.90, 0.90))

    # innen wird der Flaschenhals 2 Einheiten nach unten gezogen
    bom.extrude_region_move(MESH_OT_extrude_region={"mirror": False},
                            TRANSFORM_OT_translate={"value": (0, 0, -2)})

    # innen muss die konische Form nach unten erzeugt werden
    for idx in range(60, 90, 5):
        pos = idx/100. + 0.60
        bom.extrude_region_move(MESH_OT_extrude_region={"mirror": False},
                                TRANSFORM_OT_translate={"value": (0, 0, -0.5)})
        bpy.ops.transform.resize(value=(pos, pos, pos))

    # innen wird der untere Zylinder um 1.9 Einheiten nach unten gezogen.
    bom.extrude_region_move(MESH_OT_extrude_region={"mirror": False},
                            TRANSFORM_OT_translate={"value": (0, 0, -1.9)})
    # innen die Ecken selektieren
    bom.edge_face_add()
    # innen den Flaschenboden extrudieren und nach oben ziehen
    for idx in range(65, 0, -5):
        pos = idx/100.0
        bom.extrude_region_move(MESH_OT_extrude_region={"mirror": False},
                                TRANSFORM_OT_translate={"value": (0, 0, 0.05)})
        bpy.ops.transform.resize(value=(pos, pos, pos))
    # innen die Ecken selektieren
    bom.edge_face_add()
    # innen den Flaschenboden schliesen
    bom.merge(type='CENTER', uvs=False)
    # in den Object Modus zurückwechseln
    bpy.ops.object.mode_set(mode='OBJECT')

if __name__ == '__main__':
    flasche()

Kommentare