** * 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.
Avant l'application
Après application
Lorsque vous ciblez les cheveux
Lorsque vous ciblez Chest
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!")
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.
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 sur
pour 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 ....
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