Domo ist Ksuke. In Teil 05, in dem ein 3D-Modell aus Fotos erstellt wurde, werden wir die Anzahl der Oberflächen reduzieren. Klicken Sie hier für Teil 4 https://qiita.com/Ksuke/items/144c06f128b015b001dd
* Achtung * </ b> Dieser Artikel gibt nur das Ende dessen an, was ich mir ausgedacht und versucht habe, sodass es zu abruptem Material oder schlechtem Ende kommen kann.
Vorgehensweise </ b>
Dies ist die ganze Zeit (es ist ein Geheimnis, dass die Anzahl der Zeichen in dem Artikel geringer als gewöhnlich ist, da das, was ich tun wollte, trotz der Schwierigkeit, es zu untersuchen und zu implementieren, in einer Methode enthalten war).
~~ Der Code hier und da ist der am Ende zusammengefasste. Es gibt nur zwei Quellen ~~, aber wie üblich werden sie auch am Ende veröffentlicht.
Die Oberflächenreduzierung erfolgt mit der Mixerfunktion. Welche Art von Funktion ist die Funktion Decimate unter den Modifikatoren, die im Objektmodus von Blender verwendet werden können? Wenn Sie einige Parameter angeben und ausführen, wird die Anzahl der Flächen reduziert. Als Bonus löschen wir auch Scheitelpunkte, die aufgrund der Reduzierung der Anzahl der Flächen nicht mehr verwendet werden.
Oberflächenreduzierung
#Funktion zum Reduzieren der Anzahl der Gesichter
def faceReduction(obj,modifierName="faceReductionDecimate"):
#Ändern Sie das Änderungsobjekt so, dass es aktiv ist
bpy.context.view_layer.objects.active = obj
#Wechseln Sie in den Objektmodus
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
#Modifikator hinzugefügt, Gesichtsreduzierung
bpy.ops.object.modifier_add(type='DECIMATE')
#Gib ihm einen Namen
bpy.context.object.modifiers["Decimate"].name = modifierName
#Geben Sie die Reduktionsmethode an
bpy.context.object.modifiers[modifierName].decimate_type = "COLLAPSE"
#Reduktionsrate angeben
bpy.context.object.modifiers[modifierName].ratio = 0.05
#Führen Sie Decimate aus
bpy.ops.object.modifier_apply(modifier = modifierName)
#Wechseln Sie in den Bearbeitungsmodus
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
#Löschen Sie nicht verbundene Scheitelpunkte
bpy.ops.mesh.delete_loose()
#Objekt hinzufügen(Bis zum letzten Mal habe ich Objekte nur zur Bestätigung hinzugefügt.)
me,obj = addObj(coords=coords,faces=faces,name = "porigon",offset=[-50,-50,-50])
#Oberflächenreduzierung
faceReduction(obj)
Lassen Sie uns abschließend sehen, ob der Code einwandfrei funktioniert und wie stark die Flächen und Scheitelpunkte dieses Mal reduziert wurden.
Wenn das Objekt so angezeigt wird, ist es erfolgreich. Wie Sie sehen können, werden auch die Gesichter und Spitzen reduziert.
Fügen Sie nach der Anzeige / Verkleinerung Code wie diesen hinzu, um die Anzahl der Flächen und Scheitelpunkte vor und nach der Verkleinerung anzuzeigen.
Zum Überprüfen der Anzahl der Eckpunkte und Flächen
#Hinzufügen eines Bestätigungsobjekts vor der Gesichtsreduktion
originMe,originObj = addObj(coords=coords,faces=faces,name = "originPorigon",offset=[-50,-50,-50])
#Konvertieren Sie das Objekt nach der Verkleinerung in ein Format, mit dem Sie die einzelnen Daten einfach bearbeiten können
bm=bmesh.from_edit_mesh(obj.data)
#Wechseln Sie erneut in den Bearbeitungsmodus
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
#Konvertieren Sie das Objekt vor der Verkleinerung in ein Format, mit dem Sie die einzelnen Daten einfach bearbeiten können
originBm=bmesh.from_edit_mesh(originObj.data)
#Zeigen Sie die Anzahl der Flächen und Scheitelpunkte zweier Objekte an
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()
Das Ausgabeergebnis sieht folgendermaßen aus.
originObj:
vertsLen:13279
facesLen:26590
faceReductedObj:
vertsLen:594
facesLen:1328
Es ist ungefähr 1/20. Zu viele Daten im Originalobjekt. .. ..
Endlich sieht es so aus, aber ich vermisse es, weil es keine Farbe gibt, also werde ich das Bild (das zum Generieren des Modells verwendete) als Textur einfügen.
Wenn Sie es nach dem vorherigen Code hinzufügen, sollte es funktionieren.
Codeübersicht(Funktionsausgabe)
#Funktion zum Reduzieren der Anzahl der Gesichter
def faceReduction(obj,modifierName="faceReductionDecimate"):
#Ändern Sie das Änderungsobjekt so, dass es aktiv ist
bpy.context.view_layer.objects.active = obj
#Wechseln Sie in den Objektmodus
bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
#Modifikator hinzugefügt, Gesichtsreduzierung
bpy.ops.object.modifier_add(type='DECIMATE')
#Gib ihm einen Namen
bpy.context.object.modifiers["Decimate"].name = modifierName
#Geben Sie die Reduktionsmethode an
bpy.context.object.modifiers[modifierName].decimate_type = "COLLAPSE"
#Reduktionsrate angeben
bpy.context.object.modifiers[modifierName].ratio = 0.05
#Führen Sie Decimate aus
bpy.ops.object.modifier_apply(modifier = modifierName)
#Wechseln Sie in den Bearbeitungsmodus
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
#Löschen Sie nicht verbundene Scheitelpunkte
bpy.ops.mesh.delete_loose()
Codeübersicht(Ausführungscode)
#Objekt hinzufügen
me,obj = addObj(coords=coords,faces=faces,name = "porigon",offset=[-50,-50,-50])
#Oberflächenreduzierung
faceReduction(obj)
print("step05:face reduction success\n")
#Zur Bestätigung unten anzeigen(Es hat nichts mit dem Hauptfluss zu tun, daher wird es wahrscheinlich in der nächsten Runde verschwinden)
#Hinzufügen eines Bestätigungsobjekts vor der Gesichtsreduktion
originMe,originObj = addObj(coords=coords,faces=faces,name = "originPorigon",offset=[-50,-50,-50])
#Konvertieren Sie das Objekt nach der Verkleinerung in ein Format, mit dem Sie die einzelnen Daten einfach bearbeiten können
bm=bmesh.from_edit_mesh(obj.data)
#Wechseln Sie erneut in den Bearbeitungsmodus
bpy.ops.object.mode_set(mode='EDIT', toggle=False)
#Konvertieren Sie das Objekt vor der Verkleinerung in ein Format, mit dem Sie die einzelnen Daten einfach bearbeiten können
originBm=bmesh.from_edit_mesh(originObj.data)
#Zeigen Sie die Anzahl der Flächen und Scheitelpunkte zweier Objekte an
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()