Guten Morgen Python! Alle, modellierst du heute gut?
Apropos, als ich versuchte, Blender mit einem Python-Skript auszuführen, litt ich unter einem mysteriösen Fehler. Als Ergebnis des Kampfes wurde festgestellt, dass die Ursache ** Änderung der API-Spezifikation ** war. Sie können sich vorstellen, dass der größte Teil des derzeit im Internet veröffentlichten Codes (für 79 2.79 oder früher) ** nicht nur durch Kopieren ** funktioniert.
Für den aktuell veröffentlichten Code funktioniert dies also mit 2.80! Ich werde eine modifizierte Version davon veröffentlichen. Nachdem ich den Code vor und nach der Änderung angeordnet habe, erkläre ich in der Form, dass das geänderte Teil auf diese Weise geändert wird, indem ich auf die entsprechende Referenz verweise. Die wichtigsten Änderungen sind für alle Codes ungefähr gleich, daher ist sie wahrscheinlich für alle nützlich, die einen Fehler in einem anderen Code erhalten.
Die Leute, die den Code geschrieben haben, sind überhaupt nicht schlecht, aber es gibt keine Hilfe dafür, weil sich die Spezifikationen geändert haben. Der sich entwickelnde Mixer ist auch nicht schlecht. Wenn Menschen leiden, wenn niemand schlecht ist ... werde ich diese Sünde tragen.
Blender x Python macht es einfach 3DCG!
Es ist ein Skript zum Erstellen des obigen Netzes.
Original
2.79
import bpy
import math
#reset objects
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(True)
#world
bpy.context.scene.world.horizon_color=(0.0,0.0,0.0)
#plane_add
for i in range(0,100):
bpy.ops.mesh.primitive_plane_add(radius = (i*1.1/100),location=(0,0,0),rotation=(math.pi*1/2,math.pi*i*8.2/360,math.pi*i*10/360))
for item in bpy.context.scene.objects:
if item.type == 'MESH':
bpy.context.scene.objects.active = bpy.data.objects[item.name]
bpy.ops.object.modifier_add(type='WIREFRAME')
bpy.context.object.modifiers['Wireframe'].thickness = 0.0025
bpy.context.object.modifiers['Wireframe'].use_boundary = True
#lamp add
bpy.ops.object.lamp_add(type='HEMI',location=(0.0,0.0,2.0))
#camera add
bpy.ops.object.camera_add(location=(5.0,0.0,0.0))
bpy.data.objects['Camera'].rotation_euler = (math.pi*1/2, 0, math.pi*1/2)
#render
bpy.context.scene.render.resolution_x = 1000
bpy.context.scene.render.resolution_y = 1000
bpy.context.scene.render.resolution_percentage = 100
bpy.context.scene.camera = bpy.context.object
bpy.context.scene.render.image_settings.file_format = 'PNG'
bpy.data.scenes["Scene"].render.filepath = "tmp/plane.png "
bpy.ops.render.render(write_still=True)
Nach der veränderung
2.80
import bpy
import math
#reset objects
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(True)
#plane_add
for i in range(0,100):
bpy.ops.mesh.primitive_plane_add(size = (i*1.1/100),location=(0,0,0),rotation=(math.pi*1/2,math.pi*i*8.2/360,math.pi*i*10/360))
for item in bpy.context.scene.objects:
if item.type == 'MESH':
bpy.context.view_layer.objects.active = bpy.data.objects[item.name]
bpy.ops.object.modifier_add(type='WIREFRAME')
bpy.context.object.modifiers['Wireframe'].thickness = 0.0025
bpy.context.object.modifiers['Wireframe'].use_boundary = True
#lamp add
bpy.ops.object.light_add(location=(0.0,0.0,2.0))
#camera add
bpy.ops.object.camera_add(location=(5.0,0.0,0.0))
bpy.data.objects['Camera'].rotation_euler = (math.pi*1/2, 0, math.pi*1/2)
#render
bpy.context.scene.render.resolution_x = 1000
bpy.context.scene.render.resolution_y = 1000
bpy.context.scene.render.resolution_percentage = 100
bpy.context.scene.camera = bpy.context.object
bpy.context.scene.render.image_settings.file_format = 'PNG'
bpy.data.scenes["Scene"].render.filepath = "tmp/plane.png "
bpy.ops.render.render(write_still=True)
2.79
bpy.ops.mesh.primitive_plane_add(radius = (i*1.1/100),location=(0,0,0),rotation=(math.pi*1/2,math.pi*i*8.2/360,math.pi*i*10/360))
2.80
bpy.ops.mesh.primitive_plane_add(size = (i*1.1/100),location=(0,0,0),rotation=(math.pi*1/2,math.pi*i*8.2/360,math.pi*i*10/360))
Ebenenprimitiv hinzugefügt. "Radius", der angibt, dass die Skala in "Größe" geändert wird.
Anwendbare Referenz: https://docs.blender.org/api/current/bpy.ops.mesh.html?highlight=primitive%20plane#bpy.ops.mesh.primitive_plane_add
2.79
bpy.context.scene.objects.active = bpy.data.objects[item.name]
2.80
bpy.context.view_layer.objects.active = bpy.data.objects[item.name]
Wählen Sie das aktive Objekt aus. Der Teil, der ursprünglich "bpy.context.scene" war, sollte in "bpy.context.view_layer" geändert werden. Ich bin mir nicht sicher, wie ich es genau verwenden soll, da die API von "scene" erhalten bleibt, aber hier ist die Referenz [hier](https://docs.blender.org/api/current/bpy.types.Scene ". Es scheint keine andere Wahl zu geben, als .html zu lesen und zu studieren.
2.79
bpy.ops.object.lamp_add(type='HEMI',location=(0.0,0.0,2.0))
2.80
bpy.ops.object.light_add(location=(0.0,0.0,2.0))
Zugabe von Lampe. Umbenannt in "Lampe" in "Licht". Auch das Licht vom Typ "HEMI" (Hemisphäre) ist verschwunden.
https://docs.blender.org/api/current/bpy.ops.object.html?highlight=light%20add#bpy.ops.object.light_add
#world
bpy.context.scene.world.horizon_color=(0.0,0.0,0.0)
Hierfür wurde keine alternative API gefunden. In der GUI
Sie können es ändern, indem Sie hier arbeiten. Es gibt eine API namens "bpy.context.scene.world.color", die sich jedoch nicht ändert, selbst wenn ich dies spezifiziere. Dies ist unerreichbar. Wenn Sie es reproduzieren möchten, ändern Sie es bitte manuell. Entschuldigung…….
Einführung in Blender Python script_Part 01
Dies ist ein Skript, das das obige Netz ohne Verwendung von Grundelementen generiert.
Original
2.79
import bpy
#Standardwürfel entfernen
def delete_all():
for item in bpy.context.scene.objects:
bpy.context.scene.objects.unlink(item)
for item in bpy.data.objects:
bpy.data.objects.remove(item)
for item in bpy.data.meshes:
bpy.data.meshes.remove(item)
for item in bpy.data.materials:
bpy.data.materials.remove(item)
delete_all()
#Scheitelpunktkoordinaten definieren
coords=[
(-1.0, -1.0, -1.0),
( 1.0, -1.0, -1.0),
( 1.0, 1.0, -1.0),
(-1.0, 1.0, -1.0),
( 0.0, 0.0, 1.0)
]
#Definieren Sie ein Gesicht mit diesem Index
#Jede Fläche wird durch eine Folge von vier ganzen Zahlen definiert
#Die dreieckige Fläche muss den gleichen ersten und vierten Eckpunkt haben
faces=[
(2,1,0,3),
(0,1,4,0),
(1,2,4,1),
(2,3,4,2),
(3,0,4,3)
]
#Erstellen Sie ein neues Netz
me = bpy.data.meshes.new("PyramidMesh")
#Erstellen Sie ein Objekt mit einem Netz
ob = bpy.data.objects.new("Pyramid", me)
#Platzieren Sie das Objekt an der 3D-Cursorposition
ob.location = bpy.context.scene.cursor_location
#Verknüpfen Sie Objekte mit der Szene
bpy.context.scene.objects.link(ob)
#Füllen Sie die Oberseiten, Seiten und Flächen des Netzes
me.from_pydata(coords,[],faces)
#Aktualisieren Sie das Netz mit neuen Daten
me.update(calc_edges=True)
Nach der veränderung
2.80
import bpy
#Standardwürfel entfernen
def delete_all():
for item in bpy.context.scene.objects:
bpy.context.scene.collection.objects.unlink(item)
for item in bpy.data.objects:
bpy.data.objects.remove(item)
for item in bpy.data.meshes:
bpy.data.meshes.remove(item)
for item in bpy.data.materials:
bpy.data.materials.remove(item)
delete_all()
#Scheitelpunktkoordinaten definieren
coords=[
(-1.0, -1.0, -1.0),
( 1.0, -1.0, -1.0),
( 1.0, 1.0, -1.0),
(-1.0, 1.0, -1.0),
( 0.0, 0.0, 1.0)
]
#Definieren Sie ein Gesicht mit diesem Index
#Jede Fläche wird durch eine Folge von vier ganzen Zahlen definiert
#Die dreieckige Fläche muss den gleichen ersten und vierten Eckpunkt haben
faces=[
(2,1,0,3),
(0,1,4,0),
(1,2,4,1),
(2,3,4,2),
(3,0,4,3)
]
#Erstellen Sie ein neues Netz
me = bpy.data.meshes.new("PyramidMesh")
#Erstellen Sie ein Objekt mit einem Netz
ob = bpy.data.objects.new("Pyramid", me)
#Platzieren Sie das Objekt an der 3D-Cursorposition
ob.location = bpy.context.scene.cursor.location
#Verknüpfen Sie Objekte mit der Szene
bpy.context.scene.collection.objects.link(ob)
#Füllen Sie die Oberseiten, Seiten und Flächen des Netzes
me.from_pydata(coords,[],faces)
#Aktualisieren Sie das Netz mit neuen Daten
me.update(calc_edges=True)
2.79
bpy.context.scene.objects.unlink(item)
2.80
bpy.context.scene.collection.objects.unlink(item)
Es ist ein Befehl über das Objekt in der aktuellen Szene, aber da unter "Szene" eine Hierarchie namens "Sammlung" hinzugefügt wurde, ist es notwendig, sie wiederzugeben. Es gibt auch "Objekte" direkt unter "Szene", und wenn dies der Fall ist, tritt ein Fehler auf, wenn das Objekt "verknüpft" oder "getrennt" wird, was das erste Töten ist. Viele Leute wurden möglicherweise durch den Fehler "AttributeError:" bpy_prop_collection "geweint. Das Objekt hat kein Attribut" link ".
2.79
ob.location = bpy.context.scene.cursor_location
2.80
ob.location = bpy.context.scene.cursor.location
Geben Sie die Cursorposition an. In 2.79 und darunter gab es eine API namens "curosr_location", aber in 2.80 scheint es eine hierarchische Struktur mit "location" unter "cursor" zu geben.
Anwendbare Referenz: https://docs.blender.org/api/current/bpy.types.View3DCursor.html
2.79
bpy.context.scene.objects.link(ob)
2.80
bpy.context.scene.collection.objects.link(ob)
Gleich wie die Geschichte von "Sammlung" früher.
In dieser Situation gibt es zu viele Änderungen und die erforderlichen Informationen sind immer noch klein. Daher muss nach einer API gesucht werden, die von Ihnen selbst verwendet werden kann. Zu solchen Zeiten
Durch Drücken der Tasten "Strg" + "Leertaste" auf der Python-Konsole von Blender wird eine Liste der Kandidatenbefehle angezeigt (wenn Sie zur Hälfte eingeben, werden die Kandidaten entsprechend eingegrenzt), was nützlich sein kann. ..
Lassen Sie uns ein gutes Leben in Blender 2.80 haben.
Recommended Posts