ba_search_api

Übersicht: Python & Blender


Lernziel

Das Einfügen einfacher Objekte, wie es über die Menüfolge Add | Mesh ... interaktiv durchgeführt werden kann, wird nun über ein Skript umgesetzt. Wie man an die Informationen herankommt und im API die passenden Methoden finden kann, wird hier aufgezeigt.

Handlungsanweisungen

Aufgaben:
  1. Füge eine Funktion zum Skript hinzu, die alle Funktionsnamen auflistet, mit denen sich Mesh-Objekte erzeugen lassen.
  2. Erzeuge jeweils ein Objekt von jedem „einfachen Typ“.
  3. Positioniere die Objekte so im Raum, dass sie sich nicht berühren.
  4. Schreibe eine neue Funktion die aus einem Kegel und einer Kugel (UV_Sphere) einen Halmabaustein zusammensetzt.

Die Funktionen

Alle Manipulationen in Blender werden in den folgenden Modulen gruppiert und nur die ersten beiden Module werden am Anfang benötigt:

Application Modules

  • Data Access (bpy.data)
  • Operators (bpy.ops)
  • Types (bpy.types)
  • Utilities (bpy.utils)
  • Path Utilities (bpy.path)
  • Application Data (bpy.app)
  • Property Definitions (bpy.props)

Standalone Modules

  • Math Types & Utilities (mathutils)
  • Font Drawing (blf)
  • Audio System (aud)

Game Engine Modules

  • Game Engine bge.types Module
  • Game Engine bge.logic Module
  • Game Engine bge.render Module
  • Game Engine bge.events module

Welche »Primitive« gibt es?

  1. Eine Möglichkeit wäre, im Add-Menü des 3d-View nachzusehen, über Add » Mesh » ... und der Erkundung der Tool-Tipps.

  2. RTFM (Read the fine manuals)

    • Die Online-Documentation, suche nach »mesh primitive« on Blenderdocs
    • Durchsuche die Befehlsliste »OperatorList.txt«.
      Diese kann im Editor-Fenster geöffnet werden mit
      Help » Operator Cheat Sheet.
      Eine Kopie dieser Datei findest Du auch im Anhang: OperatorList.txt
  3. Wenn Du mit der Konsole von Blender vertraut bist, kannst Du auch dort die API näher untersuchen.

  4. Wenn die eigene Suche keien brauchbaren Ergebnisse liefert, wende Dich an die Community. Eine Linkliste findest Du im Anhang.

Hinweis:
  • Es ist wirklich wichtig, mit der API zu arbeiten!
  • Niemand kann alle Möglichkeiten aufsagen bzw. sich Alles merken.

Die richtige(n) Methode(n) finden

Ein Mesh-Objekt in der Konsole und mit Python statt mit dem Menü hinzuzufügen, wird im folgenden Bild gezeigt. Das ist aber fehleranfällig und ein Skript dafür zu verwenden, ist eine gute Idee.

/blender-basics/b-find-information/for-loop.png

Objekte erstellen

Jetzt wissen wir, wie neue Objekte erstellt werden. Ein Skript soll uns dabei helfen. Wo die Objekte platziert werden, steuert der Parameter location. In diesem Fall wird ein Tuple verwendet und in den runden Klammern werden die Positionen für die x-, y- und z-Achse angegeben.

Hier ein Fragment:

bpy.ops.mesh.primitive_cube_add(location=(2, 2, 0))
bpy.ops.mesh.primitive_cylinder_add(location=(-2, -2, 0))

Das Ergebnis könnte wie folgt aussehen:

/blender-basics/b-find-information/objects.png

Hinweise zur API

Beispiel

Versuche das folgende Konstrukt nachzubauen und verwende dazu Würfel aus dem Menü Add » Mesh » ...! Erstelle hier nur die Baumkrone, den Stamm kannst Du erzeugen, wenn das Kapitel der Skalierung behandelt wurde.

Das Beispiel stammt von folgender Website: http://b3d101.org/en/introduction/

/blender-basics/b-find-information/blender-tree.png

Wie man an dem Bild erkennt, werden drei Würfel ineinander verschachtelt, sie unterscheiden sich also nur im location-Parameter:

blender-basics/b-find-information/simple-tree.py (Source)

#!bpy
"""
Name: 'simpletree.py'
Blender: 2.7x
Group: 'Experiment'
Tooltip: 'Create an abstract tree'
"""

import bpy

def new_cube(coord=(0,0,0)):
    """Places a cube at a given location """

    bpy.ops.mesh.primitive_cube_add(location=coord,
                                    rotation=(0, 0, 0))

if __name__ == '__main__':
    # Stop edit mode
    if bpy.ops.object.mode_set.poll():
        bpy.ops.object.mode_set(mode='OBJECT')

    # delete all mesh objects from a scene
    bpy.ops.object.select_by_type(type='MESH')
    bpy.ops.object.delete()

    # call the new function
    new_cube(coord=(0,0,0))
    new_cube(coord=(-.6,-0.6,0.5))
    new_cube(coord=(0.6,0.6,0.7))

Kommentare