[PYTHON] Ich habe mir eine Möglichkeit ausgedacht, aus einem Foto ein 3D-Modell zu erstellen.

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.

Versuchen

Vorgehensweise </ b>

  1. Oberflächenreduzierung

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.

1. Oberflächenreduzierung

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)

Funktionsprüfung

Lassen Sie uns abschließend sehen, ob der Code einwandfrei funktioniert und wie stark die Flächen und Scheitelpunkte dieses Mal reduziert wurden.

1. Anzeige von Objekten

Wenn das Objekt so angezeigt wird, ist es erfolgreich. キャプチャ.PNG Wie Sie sehen können, werden auch die Gesichter und Spitzen reduziert.

2. Anzahl der Gesichts- und Apexreduktionen

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

Nächster?

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.

Codeübersicht

Wenn Sie es nach dem vorherigen Code hinzufügen, sollte es funktionieren.

Funktionsausgabe

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

Ausführungscode

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

Recommended Posts