[PYTHON] Script Blender terminé (2.8) qui n'efface que la jupe

** * La version de Blender est de 2,8 ***

Pour être précis, c'est un ** script qui efface les sommets sur lesquels le poids de l'os contenant une chaîne de caractères arbitraire est placé **, mais comme c'est intéressant, j'ai essayé de mettre la jupe sur le devant pour le moment. Il peut aussi y avoir des aspects pratiques (?) En modification. J'ai aussi beaucoup lutté avec l'API de Blender, j'ai donc ajouté quelques explications à ce sujet.

État d'application

Avant l'application

image.png

Après application

image.png

Lorsque vous ciblez les cheveux

image.png

Lorsque vous ciblez Chest

image.png

Code source

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: #Spécifiez ici la chaîne de caractères de l'os que vous souhaitez effacer
                    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!")

Commentaire

Les poids sont gérés en correspondance avec les groupes de sommets. Si un sommet fait partie d'un groupe de sommets portant le nom d'un os, il est considéré comme ayant des poids. Il recherche tous les sommets pour déterminer s'ils sont dans un groupe de sommets contenant «jupe» ou «jupe», et si c'est le cas, les supprime.

Tout d'abord, explorez tous les objets.

for ob in bpy.data.objects:

Ensuite, récupérez les données de maillage contenant l'objet. La structure de données autour de cela est également expliquée dans mon travail Suite à la structure de données de Blender et extraction des coordonnées des sommets de fbx. Je vous serais reconnaissant si vous pouviez le lire.

    me = ob.to_mesh()

De plus, cette instruction renvoie une erreur pour les objets qui n'ont pas de maillage (comme Camera ou ʻArmature), donc elle est échappée par la clause try:`. Ce n'est pas une manière très intelligente.

    bpy.context.view_layer.objects.active = ob

A ce moment, l'objet cible est activé. Veuillez noter que le bpy.context.scene.objects.active qui était disponible à l'ère 2.7 n'est plus disponible. Ceci est très probable si vous obtenez le message d'erreur «bpy_prop_collection: attribut« actif »introuvable».

    vg = ob.vertex_groups

Récupérez ensuite la liste des groupes de sommets contenus dans l'objet. Notez que cela est contenu dans l'objet, pas dans le maillage. Les noms des groupes de sommets tels que «Hips» et «Chest» sont inclus ici. Vous pouvez obtenir le nom sous la forme bpy.data.objects [x] .vertex_groups [x] .name.

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

Puis explorez tous les sommets. Les données de sommet sont incluses dans le maillage. Vous pouvez obtenir la liste sous la forme bpy.data.meshes [x] .vertices. Au début, j'ai essayé d'extraire les données de sommet du «moi» défini précédemment, mais il semble qu'une variable avec un identifiant différent a été générée, et même si je joue avec le «moi», le sommet de l'objet ne change pas. Depuis que c'est arrivé, j'ai été obligé de me référer aux données du maillage sous la forme de mailles ['nom du maillage']. Les ʻobjects [] et meshes [] `peuvent être référencés numériquement ou par nom, comme le type de dictionnaire.

            v.select = False
            for g in v.groups:
                if "Skirt" in vg[g.group].name or "skirt" in vg[g.group].name: #Spécifiez ici la chaîne de caractères de l'os que vous souhaitez effacer
                    v.select = True 

Pour chaque sommet, nous vérifions s'il existe un groupe de vertex contenant les caractères «Jupe» ou «jupe». Si vous utilisez des expressions régulières ici, vous pourrez couvrir diverses conditions plus froidement. Puisqu'un sommet peut être inclus dans plusieurs types de groupes de sommets (bien qu'en réalité, un ou deux exemples soient extrêmement courants), il est nécessaire de poursuivre la recherche en boucle. Il y a. A partir d'un sommet, les groupes de sommets qui le contiennent sont accessibles avec bpy.data.meshes [x] .vertices [x] .groups, donc recherchez-le avec pour g dans v.groups:.

C'est déroutant après cela, mais comme vous pouvez trouver le ** nombre ** du groupe de sommets dans bpy.data.meshes [x] .vertices [x] .groups.group, vous l'avez recherché avant bpy.data Vous pouvez trouver le nom du groupe de vertex en le référençant à .objects [x] .vertex_groups. Rond point!

Après cela, si vous incluez la chaîne de caractères spécifiée, définissez bpy.data.meshes [x] .vertices [x] .select sur True, sinon définissez-le sur 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)

Cette commande efface la pièce sélectionnée.

dépannage

Si vous exécutez ce script dans son état d'origine, il semble que tous les maillages de l'objet peuvent disparaître pour une raison quelconque. Cela semble être dû au fait que tous les sommets sont sélectionnés dans l'état initial (et ** pour une raison quelconque, il ne peut pas être changé **), de sorte qu'il peut être modifié en entrant une fois en mode d'édition et en désélectionnant les sommets. Devenir. Quelle est cette spécification ……. En mode objet, avec le maillage sélectionné, appuyez sur ʻa pour tout sélectionner-> appuyez sur Tabpour passer en mode d'édition-> tous les sommets sont sélectionnés, donc ʻa Tout ce que vous avez à faire est d'appuyer surpour désélectionner-> Tab pour revenir en mode objet. La cause de ceci est la recherche nécessaire. Si vous le connaissez, veuillez prendre des mesures correctives ....

Page qui a été prise en charge

Blender Python Mesh Data Access Cheet Sheet (Blender Python Mesh Data Access Cheet Sheet) Créer un script python qui peut être utilisé avec Blender Part 13 (Sélectionner des sommets à partir des informations de maillage)

Recommended Posts

Script Blender terminé (2.8) qui n'efface que la jupe
[Blender] Script pour vérifier si celui sélectionné est un mesh
[Blender] Utilisez OpenGL depuis l'intérieur du script
[Blender] Préparer l'environnement de débogage du script Blender (Eclipse + PyDev)
Ceci est le seul examen de base de Python ~ 1 ~
Ceci est le seul examen de base de Python ~ 2 ~
Ceci est le seul examen de base de Python ~ 3 ~
Un script qui poursuit sa recherche jusqu'à ce que l'URL correspondante soit mise en signet avec Hatena Bookmark