[PYTHON] Abgeschlossenes Blender-Skript (2.8), das nur den Rock löscht

** * Blender-Version ist 2.8 ***

Um genau zu sein, es ist ein ** Skript, das die Eckpunkte löscht, auf denen das Gewicht des Knochens mit einer beliebigen Zeichenkette platziert ist **, aber da es interessant ist, habe ich versucht, den Rock vorerst auf die Vorderseite zu legen. Es kann auch Praktikabilität (?) In Modifikation geben. Ich hatte auch so viele Probleme mit der API von Blender, deshalb habe ich einige Erklärungen dazu hinzugefügt.

Stand der Anwendung

Vor der Anwendung

image.png

Nach der Anwendung

image.png

Beim Zielen auf Haare

image.png

Beim Zielen auf Brust

image.png

Quellcode

import bpy

for ob in bpy.data.objects:
    try:
        me = ob.to_mesh()
        bpy.context.view_layer.objects.active = ob
        vg = ob.vertex_groups
        for v in bpy.data.meshes[me.name].vertices:
            v.select = False
            for g in v.groups:
                if "Skirt" in vg[g.group].name or "skirt" in vg[g.group].name: #Geben Sie hier die Zeichenfolge des Bones an, den Sie löschen möchten
                    v.select = True 
        bpy.ops.object.mode_set(mode='EDIT', toggle=False)
        bpy.ops.mesh.delete(type='VERT')
        bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
        print(ob.name + "... completed")
    except:
        print(ob.name + "... no mesh!")

Kommentar

Gewichte werden in Übereinstimmung mit Scheitelpunktgruppen verwaltet. Wenn sich ein Scheitelpunkt in einer Gruppe von Scheitelpunkten mit dem Namen eines Knochens befindet, wird davon ausgegangen, dass er Gewichte aufweist. Es durchsucht alle Scheitelpunkte, um festzustellen, ob sie sich in einer Scheitelpunktgruppe befinden, die "Rock" oder "Rock" enthält, und entfernt sie in diesem Fall.

Erkunden Sie zunächst alle Objekte.

for ob in bpy.data.objects:

Als nächstes erhalten Sie die Netzdaten, die das Objekt enthalten. Die Datenstruktur dazu wird auch in meiner Arbeit Folgen der Datenstruktur von Blender und Extrahieren von Scheitelpunktkoordinaten aus fbx erläutert. Ich würde es begrüßen, wenn Sie es lesen könnten.

    me = ob.to_mesh()

Außerdem gibt diese Anweisung einen Fehler für Objekte aus, die kein Netz haben (z. B. "Kamera" oder "Armatur"), sodass die Klausel "try:" ihn umgeht. Es ist kein sehr kluger Weg.

    bpy.context.view_layer.objects.active = ob

Zu diesem Zeitpunkt ist das Zielobjekt aktiviert. Bitte beachten Sie, dass die bpy.context.scene.objects.active, die in der 2.7-Ära verfügbar war, nicht mehr verfügbar ist. Dies ist höchstwahrscheinlich der Fall, wenn die Fehlermeldung "bpy_prop_collection: Attribut" aktiv "nicht gefunden" angezeigt wird.

    vg = ob.vertex_groups

Rufen Sie dann die Liste der im Objekt enthaltenen Scheitelpunktgruppen ab. Beachten Sie, dass dies im Objekt enthalten ist, nicht im Netz. Die Namen von Scheitelpunktgruppen wie "Hüften" und "Brust" sind hier enthalten. Sie können den Namen in der Form "bpy.data.objects [x] .vertex_groups [x] .name" erhalten.

        for v in bpy.data.meshes[me.name].vertices:

Dann erkunden Sie alle Eckpunkte. Die Scheitelpunktdaten sind im Netz enthalten. Sie können die Liste in der Form "bpy.data.meshes [x] .vertices" erhalten. Zuerst habe ich versucht, die Scheitelpunktdaten aus dem zuvor definierten "Ich" zu extrahieren, aber es scheint, dass eine Variable mit einer anderen ID generiert wurde, und selbst wenn ich mit dem "Ich" herumspiele, ändert sich der Scheitelpunkt des Objekts nicht. Seitdem war ich gezwungen, auf die Netzdaten in Form von "meshes ['mesh name']" zu verweisen. Sowohl "Objekte []" als auch "Netze []" können numerisch oder nach Namen referenziert werden, z. B. nach dem Wörterbuchtyp.

            v.select = False
            for g in v.groups:
                if "Skirt" in vg[g.group].name or "skirt" in vg[g.group].name: #Geben Sie hier die Zeichenfolge des Bones an, den Sie löschen möchten
                    v.select = True 

Für jeden Scheitelpunkt prüfen wir, ob es eine Scheitelpunktgruppe gibt, die die Buchstaben "Rock" oder "Rock" enthält. Wenn Sie hier reguläre Ausdrücke verwenden, können Sie verschiedene Bedingungen kühler abdecken. Da ein Scheitelpunkt in mehreren Arten von Scheitelpunktgruppen enthalten sein kann (obwohl in der Realität ein oder zwei Beispiele überwiegend häufig sind), ist eine weitere Schleife erforderlich, um die Untersuchung durchzuführen. Es gibt. Von einem Scheitelpunkt aus kann auf die Scheitelpunktgruppen, die ihn enthalten, mit "bpy.data.meshes [x] .vertices [x] .groups" zugegriffen werden. Suchen Sie also mit "for g in v.groups:" danach.

Danach ist es verwirrend, aber da Sie die ** Nummer ** der Scheitelpunktgruppe in bpy.data.meshes [x] .vertices [x] .groups.group finden, haben Sie vor bpy.data danach gesucht Sie finden den Namen der Scheitelpunktgruppe, indem Sie auf .objects [x] .vertex_groups verweisen. Kreisel!

Wenn Sie danach die angegebene Zeichenfolge einfügen, setzen Sie "bpy.data.meshes [x] .vertices [x] .select" auf "True", andernfalls auf "False".

        bpy.ops.object.mode_set(mode='EDIT', toggle=False)
        bpy.ops.mesh.delete(type='VERT')
        bpy.ops.object.mode_set(mode='OBJECT', toggle=False)

Dieser Befehl löscht das ausgewählte Teil.

Fehlerbehebung

Wenn Sie dieses Skript im ursprünglichen Zustand ausführen, scheinen aus irgendeinem Grund alle Netze des Objekts zu verschwinden. Dies scheint auf die Tatsache zurückzuführen zu sein, dass alle Scheitelpunkte im Ausgangszustand ausgewählt sind (und ** ich kann sie aus irgendeinem Grund nicht ändern **), sodass ich sie ändern kann, indem ich einmal in den Bearbeitungsmodus wechsle und die Auswahl von Scheitelpunkten aufhebe. Werden. Was ist diese Spezifikation ……. Drücken Sie im Objektmodus bei ausgewähltem Netz "a", um alle auszuwählen -> drücken Sie "Tab", um in den Bearbeitungsmodus zu wechseln -> alle Scheitelpunkte sind ausgewählt, also "a" Alles was Sie tun müssen, ist zum Abwählen-> Tab` zu drücken, um zum Objektmodus zurückzukehren. Die Ursache hierfür ist Forschungsbedarf. Wenn Sie damit vertraut sind, ergreifen Sie bitte Korrekturmaßnahmen ....

Seite, für die gesorgt wurde

Blender Python Mesh Datenzugriffs-Cheet Sheet (Blender Python Mesh Datenzugriffs-Cheet Sheet) Erstellen eines Python-Skripts, das mit Blender Part 13 verwendet werden kann (Auswählen von Scheitelpunkten aus Netzinformationen)

Recommended Posts

Abgeschlossenes Blender-Skript (2.8), das nur den Rock löscht
[Blender] Skript zum Überprüfen, ob es sich bei dem ausgewählten um ein Netz handelt
[Blender] Verwenden Sie OpenGL aus dem Skript heraus
[Blender] Bereiten Sie die Debugging-Umgebung für Blender-Skripte vor (Eclipse + PyDev).
Dies ist die einzige grundlegende Überprüfung von Python ~ 1 ~
Dies ist die einzige grundlegende Überprüfung von Python ~ 2 ~
Dies ist die einzige grundlegende Überprüfung von Python ~ 3 ~
Ein Skript, das so lange sucht, bis die entsprechende URL mit einem Hatena-Lesezeichen versehen ist