[PYTHON] J'ai trouvé un moyen de créer un modèle 3D à partir d'une photo.

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.

Essayer

Procédure </ b>

  1. Réduction de surface

... 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.

1. Réduction de surface

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)

Contrôle de fonctionnement

Enfin, voyons si le code fonctionne bien et cette fois à quel point les faces et les sommets ont été réduits.

1. Affichage des objets

Si l'objet est affiché comme ceci, il réussit. キャプチャ.PNG Comme vous pouvez le voir, les faces et les pics sont également réduits.

2. Nombre de réductions de face et d'apex

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. .. ..

prochain?

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.

Résumé du code

Si vous l'ajoutez après le code précédent, cela devrait fonctionner.

Edition de fonction

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()

Code d'exécution

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