Domo est Ksuke. Dans la partie 05, qui a proposé un moyen de créer un modèle 3D à partir de photos, nous réduirons le nombre de surfaces. Cliquez ici pour la partie 4 https://qiita.com/Ksuke/items/144c06f128b015b001dd
* Attention * </ b> Cet article ne donne que la fin de ce que j'ai trouvé et essayé, donc ça pourrait finir avec du matériel abrupt ou Bad End.
Procédure </ b>
... C'est tout (c'est un secret que le nombre de caractères dans l'article est plus petit que d'habitude car ce que je voulais faire était contenu dans une seule méthode malgré la difficulté de l'investiguer et de l'implémenter).
~~ Le code ici et là est celui résumé à la fin. Il n'y a que deux sources ~~, mais comme d'habitude, elles sont également postées à la fin.
La réduction de surface est effectuée à l'aide de la fonction blender. La fonction est Decimate, qui est l'un des modificateurs disponibles dans le mode objet de Blender. Si vous spécifiez certains paramètres et les exécutez, le nombre de faces sera réduit. En prime, nous supprimons également des sommets qui ne sont plus utilisés en raison de la réduction du nombre de faces.
Réduction de surface
#Fonction pour réduire le nombre de faces
def faceReduction(obj,modifierName="faceReductionDecimate"):
#Changer l'objet de modification pour qu'il soit actif
bpy.context.view_layer.objects.active = obj
#Passer en mode objet
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
#Ajout d'un modificateur, réduction du visage
bpy.ops.object.modifier_add(type='DECIMATE')
#Donne lui un nom
bpy.context.object.modifiers["Decimate"].name = modifierName
#Spécifiez la méthode de réduction
bpy.context.object.modifiers[modifierName].decimate_type = "COLLAPSE"
#Spécifiez le taux de réduction
bpy.context.object.modifiers[modifierName].ratio = 0.05
#Exécuter Decimate
bpy.ops.object.modifier_apply(modifier = modifierName)
#Passer en mode édition
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
#Supprimer les sommets non connectés
bpy.ops.mesh.delete_loose()
#Ajouter un objet(Jusqu'à la dernière fois, j'ai ajouté des objets uniquement pour confirmation.)
me,obj = addObj(coords=coords,faces=faces,name = "porigon",offset=[-50,-50,-50])
#Réduction de surface
faceReduction(obj)
Enfin, voyons si le code fonctionne bien et cette fois à quel point les faces et les sommets ont été réduits.
Si l'objet est affiché comme ceci, il réussit. Comme vous pouvez le voir, les faces et les pics sont également réduits.
Ajoutez un code comme celui-ci après affichage / réduction pour afficher le nombre de faces et de sommets avant et après réduction.
Pour vérifier le nombre de sommets et de faces
#Ajout d'objet de confirmation avant réduction du visage
originMe,originObj = addObj(coords=coords,faces=faces,name = "originPorigon",offset=[-50,-50,-50])
#Convertissez l'objet après réduction dans un format qui facilite la manipulation de chaque donnée
bm=bmesh.from_edit_mesh(obj.data)
#Revenir en mode édition
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
#Convertissez l'objet avant réduction dans un format qui facilite la manipulation de chaque donnée
originBm=bmesh.from_edit_mesh(originObj.data)
#Afficher le nombre de faces et de sommets de deux objets
print("originObj:")
print(" vertsLen:{}".format(len(originBm.verts)))
print(" facesLen:{}".format(len(originBm.faces)))
print()
print("faceReductedObj:")
print(" vertsLen:{}".format(len(bm.verts)))
print(" facesLen:{}".format(len(bm.faces)))
print()
Le résultat de sortie ressemble à ceci.
originObj:
vertsLen:13279
facesLen:26590
faceReductedObj:
vertsLen:594
facesLen:1328
C'est environ 1/20. Trop de données dans l'objet d'origine. .. ..
Enfin ça ressemble à ça, mais ça me manque car il n'y a pas de couleur, donc je vais coller l'image (celle utilisée pour générer le modèle) comme texture.
Si vous l'ajoutez après le code précédent, cela devrait fonctionner.
Résumé du code(Edition de fonction)
#Fonction pour réduire le nombre de faces
def faceReduction(obj,modifierName="faceReductionDecimate"):
#Changer l'objet de modification pour qu'il soit actif
bpy.context.view_layer.objects.active = obj
#Passer en mode objet
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
#Ajout d'un modificateur, réduction du visage
bpy.ops.object.modifier_add(type='DECIMATE')
#Donne lui un nom
bpy.context.object.modifiers["Decimate"].name = modifierName
#Spécifiez la méthode de réduction
bpy.context.object.modifiers[modifierName].decimate_type = "COLLAPSE"
#Spécifiez le taux de réduction
bpy.context.object.modifiers[modifierName].ratio = 0.05
#Exécuter Decimate
bpy.ops.object.modifier_apply(modifier = modifierName)
#Passer en mode édition
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
#Supprimer les sommets non connectés
bpy.ops.mesh.delete_loose()
Résumé du code(Code d'exécution)
#Ajouter un objet
me,obj = addObj(coords=coords,faces=faces,name = "porigon",offset=[-50,-50,-50])
#Réduction de surface
faceReduction(obj)
print("step05:face reduction success\n")
#Pour l'affichage de confirmation ci-dessous(Cela n'a rien à voir avec le flux principal, donc il disparaîtra probablement au prochain tour)
#Ajout d'objet de confirmation avant réduction du visage
originMe,originObj = addObj(coords=coords,faces=faces,name = "originPorigon",offset=[-50,-50,-50])
#Convertissez l'objet après réduction dans un format qui facilite la manipulation de chaque donnée
bm=bmesh.from_edit_mesh(obj.data)
#Revenir en mode édition
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
#Convertissez l'objet avant réduction dans un format qui facilite la manipulation de chaque donnée
originBm=bmesh.from_edit_mesh(originObj.data)
#Afficher le nombre de faces et de sommets de deux objets
print("originObj:")
print(" vertsLen:{}".format(len(originBm.verts)))
print(" facesLen:{}".format(len(originBm.faces)))
print()
print("faceReductedObj:")
print(" vertsLen:{}".format(len(bm.verts)))
print(" facesLen:{}".format(len(bm.faces)))
print()
Recommended Posts