f-path-overview

Übersicht: Python & Blender


Lernziel

Wie kann ein Pfad, ein Körper oder eine Fläche über Kurven definiert werden? Diese Fragen sollen in dieser und den nächsten Lerneinheiten geklärt werden. Welche Pfad-Objekte gibt es in Blender? Wenn dies Frage geklärt ist, folgt die Verwendung eines Pfades für eine Animation.

Handlungsanweisungen

Aufgaben:
  1. Platziere einen Bezier-Circle in einer Szene und verschiebe einen der Punkte.
  2. Extrudiere anschließend den Körper und mach ein Mesh daraus.
  3. Färbe das Mesh ein und gib einigen Faces eine andere Farbe.

Kurven Arten und Eigenschaften

Nicht jeder Körper lässt sich über einfache Grundformen modellieren. Besser geeignet sind dafür Kurven, die sich stufenlos verformen lassen. Es gibt unterschiedliche Kurvenarten in Blender, allen gemeinsam ist die Berechnung des Kurvenverlaufs durch mathematische Formeln. In der praktischen Anwendung werden die Parameter, zur Beeinflussung des Kurvenverlaufs über sogenannte Handels und Kontrollpunkte gesteuert. Was über den 3D-View und mit der Maus ganz einfach aussieht, ist in einem Pythonskript nicht mehr ganz so einfach umzusetzen.

Blender unterstützt zum einen die Bezier-Kurven, die es auch in vielen anderen Programmen gibt. Vielleicht verwendet man eher die Bezeichnung Vektorgrafik. Ein anderer Kurventyp ist die NURBS-Kurve, eine Verallgemeinerung der Bezierkurven. Mehr Informationen zu den Kurventypen findest Du unter:

Ein Überblick zu den Grundformen

Jede Funktion erzeugt eine Grundform. Nachfolgend werden alle Formen im Edit-Modus gezeigt, denn die Anordnung der Handles und Kontrollpunkte machen den sichtbaren Unterschied.

Bezier-Kreis

/blender-moves/f-pathes/bezier-circle.png

bpy.ops.curve.primitive_bezier_circle_add(location=(-3, 5, 0))

Bezier-Kurve

/blender-moves/f-pathes/bezier-curve.png

bpy.ops.curve.primitive_bezier_curve_add(location=(3, 5, 0))

Nurbs-Kreis

/blender-moves/f-pathes/nurbs-circle.png

bpy.ops.curve.primitive_nurbs_circle_add(location=(-3, 2, 0))

Nurbs-Kurve

/blender-moves/f-pathes/nurbs-curve.png

bpy.ops.curve.primitive_nurbs_curve_add(location=(3, 2, 0))

Nurbs-Pfad

/blender-moves/f-pathes/nurbs-path.png

bpy.ops.curve.primitive_nurbs_path_add(location=(6, 1, 0))

Das komplette Skript

Es erzeugt von jedem Kurven-Objekt ein Beispiel:

blender-moves/f-pathes/curves.py (Source)

#! bpy
"""
Name: 'curves.py'
Blender: 27x
Group: 'Basics'
Tooltip: 'Show path objects'
"""
import bpy


def add_curves():
    """Create one of every type"""
    
    bpy.ops.curve.primitive_bezier_circle_add(location=(-3, 5, 0))
    bpy.ops.curve.primitive_bezier_curve_add(location=(3, 5, 0))
    bpy.ops.curve.primitive_nurbs_circle_add(location=(-3, 2, 0))
    bpy.ops.curve.primitive_nurbs_curve_add(location=(3, 2, 0))
    bpy.ops.curve.primitive_nurbs_path_add(location=(6, 1, 0))
    

def bezier_circle():
    """ Create bezier circls  
    
    - all control points are deactivated
    - activate the fourth control point 
    """
    
    bpy.ops.curve.primitive_bezier_circle_add(location=(3,-2,0),
                                              rotation=(0, 0, 0))
    bpy.ops.object.mode_set(mode = 'EDIT')
    print(bpy.context.selected_objects)
    bcircle= bpy.context.selected_objects[0]
    bcircle.name = "BezierCircle"    
    for i in range(0,4):
        bcircle.data.splines[0].bezier_points[i].select_control_point = False
        bcircle.data.splines[0].bezier_points[i].select_right_handle = False
        bcircle.data.splines[0].bezier_points[i].select_left_handle = False

    bcircle.data.splines[0].bezier_points[3].select_control_point = True
    bpy.ops.object.mode_set(mode = 'OBJECT')
    for i in bcircle.data.splines[0].bezier_points:
         print(i.co, i.select_control_point)

def bezier_circle_transform():
    """ Circle with transformation """
    
    bpy.ops.curve.primitive_bezier_circle_add(location=(-3,-2,0),
                                              rotation=(0, 0, 0))
    bpy.ops.object.mode_set(mode = 'EDIT')
    bcircle= bpy.context.selected_objects[0]
    bcircle.name = "BezierCircleTransformed"    
    for i in range(0,4):
        bcircle.data.splines[0].bezier_points[i].select_control_point = False
        bcircle.data.splines[0].bezier_points[i].select_right_handle = False
        bcircle.data.splines[0].bezier_points[i].select_left_handle = False
    bcircle.data.splines[0].bezier_points[3].select_control_point = True
    # not working!
    #bpy.ops.curve.extrude_move(CURVE_OT_extrude={"mode":'TRANSLATION'}, 
    #                           TRANSFORM_OT_translate={"value":(-1, -1, 0)})

    for i in bcircle.data.splines[0].bezier_points:
        print(i.co, i.select_control_point)


if __name__ == "__main__":
    # check poll() to avoid exception. 
    if bpy.ops.object.mode_set.poll():
        bpy.ops.object.mode_set(mode = 'OBJECT')

    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()


    bpy.ops.object.select_by_type(type='CURVE')
    bpy.ops.object.delete()

    add_curves()   
    bezier_circle()
    bezier_circle_transform()

    # check poll() to avoid exception.
    if bpy.ops.object.mode_set.poll():
        bpy.ops.object.mode_set(mode = 'OBJECT')
    bpy.context.area.type = 'VIEW_3D'
    bpy.ops.view3d.viewnumpad(type='TOP', align_active=False)


Kommentare