Bearbeiten Sie Objekte mit der einfachen Python-API von Blender 2.8

Dieser Artikel ist der Artikel zum 24. Tag (obwohl spät) von Nextremer Adventskalender 2019.

Zusammenfassung

Blender ist eine Software zum Erstellen von Modelldaten für 3D-Grafiken. Der Quellcode ist öffentliche und freie Software, die mit GPL-v3.0 lizenziert ist. Python ist als Skriptsprache in Blender integriert, und es scheint, dass UI-Vorgänge automatisiert werden können.

Ist es nicht möglich, viele Objekte zu erstellen und anzuordnen und wie generative Kunst in Processing zu spielen, weil sie programmgesteuert betrieben werden kann? Wenn Sie diesbezüglich nachschlagen, werden die folgenden Artikel angezeigt. Ich bin dankbar.

Übrigens, als Methode zum Hinzufügen eines Objekts scheint die folgende Methode in der Konsole der Registerkarte "Skripterstellung" von Blender eingeführt zu sein.

#Wenn Sie es mit einer Datei tun`import bpy`Ist notwendig
>>> bpy.ops.mesh.primitive_cube_add()
{'FINISHED'}
>>> 

Der Rückgabewert ist "{" FINISHED "}". Übrigens, wenn Sie dies unmittelbar nach dem Start mit Blender tun, wird unter "Szenensammlung"> "Sammlung" ein Objekt namens "Cube.001" hinzugefügt (da bereits ein Objekt namens "Cube" platziert ist). Was ist, wenn ich versuche, diese Cube.001-Information nach primitive_cube_add () zu ändern?

#Aus den untergeordneten Elementen der Sammlung in der Szenensammlung"Cube.001"Vom Namen gezogen
>>> bpy.data.collections.data.objects['Cube.001']
bpy.data.objects['Cube.001']

Übrigens lautet der Name "Cube.001" "Cube.002", wenn Sie "primitive_cube_add ()" in Gegenwart von "Cube.001" ausführen. Mit anderen Worten, der Name unterscheidet sich je nach Status der Benutzeroberfläche. Hmmm, ich meine, in der normalen Python-Programmierung möchte ich, dass Sie den Namen des erstellten Objekts mit "primitive_cube_add ()" zurückgeben.

Übrigens scheint das Modul "bpy.obs" ein ** -Modul zu sein, das den Betrieb der Benutzeroberfläche als Funktion bereitstellt.

Wenn ja. Es muss eine untergeordnete API zur Objekterstellung / -manipulation geben, die bei der UI-Manipulation aufgerufen wird.

In diesem Artikel spielen wir mit der einfachen Objektmanipulations-API von Blender.

Betriebsumgebung

Der Inhalt dieses Artikels verwendet die GNU / Linux-Version der Blender 2.81-Binärdatei, die auf der offiziellen Website von Blender verteilt wird.

$ blender -v
Blender 2.81 (sub 16)
        build date: 2019-12-04
        build time: 13:48:07
        build commit date: 2019-12-04
        build commit time: 11:32
        build hash: f1aa4d18d49d
        build platform: Linux
        build type: Release
        build c flags:  -Wall -Wcast-align -Werror=implicit-function-declaration -Werror=return-type -Werror=vla -Wstrict-prototypes -Wmissing-prototypes -Wno-char-subscripts -Wno-unknown-pragmas -Wpointer-arith -Wunused-parameter -Wwrite-strings -Wlogical-op -Wundef -Winit-self -Wmissing-include-dirs -Wno-div-by-zero -Wtype-limits -Wformat-signedness -Wnonnull -Wuninitialized -Wredundant-decls -Wshadow -Wno-error=unused-but-set-variable  -fuse-ld=gold -std=gnu11   -msse -pipe -fPIC -funsigned-char -fno-strict-aliasing -msse2 -D_GLIBCXX_USE_CXX11_ABI=0
        build c++ flags:  -Wredundant-decls -Wall -Wno-invalid-offsetof -Wno-sign-compare -Wlogical-op -Winit-self -Wmissing-include-dirs -Wno-div-by-zero -Wtype-limits -Werror=return-type -Wno-char-subscripts -Wno-unknown-pragmas -Wpointer-arith -Wunused-parameter -Wwrite-strings -Wundef -Wformat-signedness -Wuninitialized -Wundef -Wmissing-declarations  -fuse-ld=gold -std=c++11   -msse -pipe -fPIC -funsigned-char -fno-strict-aliasing -msse2 -D_GLIBCXX_USE_CXX11_ABI=0
        build link flags:  -Wl,--version-script='/home/sources/buildbot-x86_64-slave/linux_glibc217_x86_64_cmake/blender.git/source/creator/blender.map'
        build system: CMake

Erstellen Sie ein Objekt

Beschwören wir also zuerst den Blender-Affen Suzanne mit einer Low-Level-API. Tun Sie dies auf der Konsole.

#Erstellen Sie ein B-Mesh-Objekt, indem Sie ein Modul importieren, das die Rohmesh-Informationen von Blender bearbeitet
>>> import bmesh
>>> bm = bmesh.new()

#Setze Suzannes Netzdaten auf bm
>>> bmesh.ops.create_monkey(bm)
... #Irgendwie kommen Namensscheitelpunktdaten heraus

#Tatsächliches BMesh-Objekt auf bm gesetzt
>>> bm
<BMesh(0x7f40f970ba08), totvert=507, totedge=1005, totface=500, totloop=1968>

#Erstellen Sie ein Netzobjekt für die Anzeige, konvertieren Sie B-Netz in Netz und legen Sie es fest
>>> mesh = bpy.data.meshes.new('suzanne')
>>> bm.to_mesh(mesh)
>>> bm.free()  #Wenn Sie viel machen, sollten Sie es freigeben

#Zur Ausstellung*Objekt*Objektをmeshを指定して作成する
>>> obj = bpy.data.objects.new('suzanne', mesh)

#Link (Register) zur Objektliste der Sammlung im aktuellen Kontext (angezeigt als)
>>> bpy.context.collection.objects.link(obj)

Infolgedessen sieht es so aus (das standardmäßig platzierte Feld wird gelöscht).

blender-01.png

Übrigens können Sie Suzanne als UI-Operation mit bpy.ops.mesh.primitive_monkey_add () (API-Dokument aufrufen. Von # bpy.ops.mesh.primitive_monkey_add)).

Stellen Sie sich ein wenig über das Innere vor

Aus den obigen Vorgängen und der Python-API-Dokumentation (https://docs.blender.org/api/current/bpy.types.html und https://docs.blender.org/api/current/bmesh.html) Sie können so etwas wie das Datenmodell von Blender erraten.

Es kann Spaß machen, den Quellcode zu lesen, um zu sehen, wie er erstellt wird.

Zeichen in Farbe anzeigen

#Schriftart laden
font = bpy.data.fonts.load('/home/grey/.fonts/en/Nobile/Nobile-Regular.ttf')

#Erstellen Sie eine Sammlung
col = bpy.data.collections.new('nils')
bpy.context.scene.collection.children.link(col)

#Material, das auf das Objekt gesetzt werden soll(Farbe=schwarz)Bereiten
mat = bpy.data.materials.new(name="black")
mat.diffuse_color = (0, 0, 0, 1.0)

#Erstellen Sie ein FontCurve-Objekt
text_curve = bpy.data.curves.new(type='FONT', name='fontcurve')
nil = bpy.data.objects.new('nil', text_curve)

#Legen Sie den Zeichenkettenkörper, die Schriftart und das Material fest
nil.data.body = 'nil'
nil.data.font = font
nil.data.materials.append(mat)

#Eine Funktion, die Zeichen durch Angabe eines Winkels oder einer Position platziert
def put_nil(x, y, z):
    obj = nil.copy()
    obj.location = (x, y, z)
    obj.rotation_euler = (0, 0, PI/2)
    col.objects.link(obj)

#Setzen Sie tatsächlich den Charakter
put_nil(0, 0, 0)

Das Ergebnis ist hier.

Setzen Sie viel () (leere Liste)

#Eine Funktion, die nur viel Null arrangiert
def nils(xr, yr, zr):
    for x in xr:
        for y in yr:
            for z in zr:
                put_nil(x, y, z)

#Es sind schon viele leere Listen
nils(
    [x/1.1 for x in range(-6, 6)],
    [y/1.8 for y in range(-5, 7)],
    [z/15 for z in range(-5, 5)]
)

Wenn Sie dies für den Teil tun, der die Funktion put_nil () aufruft, wird ein für Technical Book 8 erstelltes Kreisschnittbild erstellt.

Recommended Posts

Bearbeiten Sie Objekte mit der einfachen Python-API von Blender 2.8
[S3] CRUD mit S3 unter Verwendung von Python [Python]
Bearbeiten Sie Tabellenkalkulationen lokal mit Python
Blender Python API in Houdini (Python 3)
Datenerfassung mit Python Googlemap API
[Python3] Google übersetzt Google Übersetzung ohne Verwendung von API
Versuchen Sie es mit der Pleasant-API (Python / FastAPI).
Überprüfen Sie JSON-Objekte mit Python DictShield
Versuchen Sie es mit der Aktions-API von Python argparse
Führen Sie Ansible über Python mithilfe der API aus
Mausbedienung mit Windows-API in Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
Tweet mit der Twitter-API in Python
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Erstellen einer Google-Tabelle mit der Python / Google Data-API
Vorgehensweise zur Verwendung der WEG-API von TeamGant (mit Python)
[Python] Holen Sie sich alle Kommentare mit Youtube Data Api
Versuchen Sie es mit der BitFlyer Ligntning API in Python
Holen Sie sich die Bild-URL mithilfe der Flickr-API in Python
Lassen Sie uns Emotionen mithilfe der Emotions-API in Python beurteilen
Letzte Ranglistenerstellung mit der Qiita-API mit Python
Anonymer Upload von Bildern mit der Imgur-API (mit Python)
Finden Sie eine Polynomnäherung mit der Low-Level-API von TensorFlow 2.x.
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden
Versuchen Sie, die DropBox Core-API mit Python zu verwenden
Blender 2.9 Python Extrude extrudieren
Starten Sie Python
Scraping mit Python
Laden Sie eine JPG-Datei mit der Google Drive-API in Python hoch
Grundeinstellungen bei Verwendung der foursquare-API mit Python
PUSH-Benachrichtigung von Python an Android mithilfe der Google-API
Holen Sie sich LEAD-Daten mit der REST-API von Marketo in Python
[Blender] Ergänzen Sie die Python-API von Blender mit einem Texteditor
[Frage] Über die API-Konvertierung von Chat-Bot mit Python
Senden und empfangen Sie Google Mail über die Google Mail-API mit Python
Registrieren Sie Tickets mit der Redmine-API mithilfe von Python-Anforderungen
[Python] Verwenden der Linien-API [1. Erstellung des Beauty-Bots]
OpenVINO verwendet die Inference Engine Python API in einer PC-Umgebung
Kopieren Sie S3-Dateien mit GSUtil von Python nach GCS
Sprachtranskriptionsverfahren mit Python und Google Cloud Speech API
Verwenden Sie die Such-API der National Parliament Library in Python
Sprachdateierkennung durch Google Speech API v2 mit Python