Dieser Artikel ist der Artikel zum 24. Tag (obwohl spät) von Nextremer Adventskalender 2019.
Blender ist eine Software zum Erstellen von Modelldaten für 3D-Grafiken. Der Quellcode ist öffentliche und freie Software, die mit GPL-v3.0 lizenziert ist. Python ist als Skriptsprache in Blender integriert, und es scheint, dass UI-Vorgänge automatisiert werden können.
Ist es nicht möglich, viele Objekte zu erstellen und anzuordnen und wie generative Kunst in Processing zu spielen, weil sie programmgesteuert betrieben werden kann? Wenn Sie diesbezüglich nachschlagen, werden die folgenden Artikel angezeigt. Ich bin dankbar.
Übrigens, als Methode zum Hinzufügen eines Objekts scheint die folgende Methode in der Konsole der Registerkarte "Skripterstellung" von Blender eingeführt zu sein.
#Wenn Sie es mit einer Datei tun`import bpy`Ist notwendig
>>> bpy.ops.mesh.primitive_cube_add()
{'FINISHED'}
>>>
Der Rückgabewert ist "{" FINISHED "}". Übrigens, wenn Sie dies unmittelbar nach dem Start mit Blender tun, wird unter "Szenensammlung"> "Sammlung" ein Objekt namens "Cube.001" hinzugefügt (da bereits ein Objekt namens "Cube" platziert ist). Was ist, wenn ich versuche, diese Cube.001
-Information nach primitive_cube_add ()
zu ändern?
#Aus den untergeordneten Elementen der Sammlung in der Szenensammlung"Cube.001"Vom Namen gezogen
>>> bpy.data.collections.data.objects['Cube.001']
bpy.data.objects['Cube.001']
Übrigens lautet der Name "Cube.001" "Cube.002", wenn Sie "primitive_cube_add ()" in Gegenwart von "Cube.001" ausführen. Mit anderen Worten, der Name unterscheidet sich je nach Status der Benutzeroberfläche. Hmmm, ich meine, in der normalen Python-Programmierung möchte ich, dass Sie den Namen des erstellten Objekts mit "primitive_cube_add ()" zurückgeben.
Übrigens scheint das Modul "bpy.obs" ein ** -Modul zu sein, das den Betrieb der Benutzeroberfläche als Funktion bereitstellt.
Wenn ja. Es muss eine untergeordnete API zur Objekterstellung / -manipulation geben, die bei der UI-Manipulation aufgerufen wird.
In diesem Artikel spielen wir mit der einfachen Objektmanipulations-API von Blender.
Der Inhalt dieses Artikels verwendet die GNU / Linux-Version der Blender 2.81-Binärdatei, die auf der offiziellen Website von Blender verteilt wird.
$ blender -v
Blender 2.81 (sub 16)
build date: 2019-12-04
build time: 13:48:07
build commit date: 2019-12-04
build commit time: 11:32
build hash: f1aa4d18d49d
build platform: Linux
build type: Release
build c flags: -Wall -Wcast-align -Werror=implicit-function-declaration -Werror=return-type -Werror=vla -Wstrict-prototypes -Wmissing-prototypes -Wno-char-subscripts -Wno-unknown-pragmas -Wpointer-arith -Wunused-parameter -Wwrite-strings -Wlogical-op -Wundef -Winit-self -Wmissing-include-dirs -Wno-div-by-zero -Wtype-limits -Wformat-signedness -Wnonnull -Wuninitialized -Wredundant-decls -Wshadow -Wno-error=unused-but-set-variable -fuse-ld=gold -std=gnu11 -msse -pipe -fPIC -funsigned-char -fno-strict-aliasing -msse2 -D_GLIBCXX_USE_CXX11_ABI=0
build c++ flags: -Wredundant-decls -Wall -Wno-invalid-offsetof -Wno-sign-compare -Wlogical-op -Winit-self -Wmissing-include-dirs -Wno-div-by-zero -Wtype-limits -Werror=return-type -Wno-char-subscripts -Wno-unknown-pragmas -Wpointer-arith -Wunused-parameter -Wwrite-strings -Wundef -Wformat-signedness -Wuninitialized -Wundef -Wmissing-declarations -fuse-ld=gold -std=c++11 -msse -pipe -fPIC -funsigned-char -fno-strict-aliasing -msse2 -D_GLIBCXX_USE_CXX11_ABI=0
build link flags: -Wl,--version-script='/home/sources/buildbot-x86_64-slave/linux_glibc217_x86_64_cmake/blender.git/source/creator/blender.map'
build system: CMake
Beschwören wir also zuerst den Blender-Affen Suzanne mit einer Low-Level-API. Tun Sie dies auf der Konsole.
#Erstellen Sie ein B-Mesh-Objekt, indem Sie ein Modul importieren, das die Rohmesh-Informationen von Blender bearbeitet
>>> import bmesh
>>> bm = bmesh.new()
#Setze Suzannes Netzdaten auf bm
>>> bmesh.ops.create_monkey(bm)
... #Irgendwie kommen Namensscheitelpunktdaten heraus
#Tatsächliches BMesh-Objekt auf bm gesetzt
>>> bm
<BMesh(0x7f40f970ba08), totvert=507, totedge=1005, totface=500, totloop=1968>
#Erstellen Sie ein Netzobjekt für die Anzeige, konvertieren Sie B-Netz in Netz und legen Sie es fest
>>> mesh = bpy.data.meshes.new('suzanne')
>>> bm.to_mesh(mesh)
>>> bm.free() #Wenn Sie viel machen, sollten Sie es freigeben
#Zur Ausstellung*Objekt*Objektをmeshを指定して作成する
>>> obj = bpy.data.objects.new('suzanne', mesh)
#Link (Register) zur Objektliste der Sammlung im aktuellen Kontext (angezeigt als)
>>> bpy.context.collection.objects.link(obj)
Infolgedessen sieht es so aus (das standardmäßig platzierte Feld wird gelöscht).
Übrigens können Sie Suzanne als UI-Operation mit bpy.ops.mesh.primitive_monkey_add ()
(API-Dokument aufrufen. Von # bpy.ops.mesh.primitive_monkey_add)).
Aus den obigen Vorgängen und der Python-API-Dokumentation (https://docs.blender.org/api/current/bpy.types.html und https://docs.blender.org/api/current/bmesh.html) Sie können so etwas wie das Datenmodell von Blender erraten.
link (obj)
fertig istbpy.data
. Nach Typ enthaltenbpy_struct
ID
entspricht Entity und Komponente ...?Es kann Spaß machen, den Quellcode zu lesen, um zu sehen, wie er erstellt wird.
#Schriftart laden
font = bpy.data.fonts.load('/home/grey/.fonts/en/Nobile/Nobile-Regular.ttf')
#Erstellen Sie eine Sammlung
col = bpy.data.collections.new('nils')
bpy.context.scene.collection.children.link(col)
#Material, das auf das Objekt gesetzt werden soll(Farbe=schwarz)Bereiten
mat = bpy.data.materials.new(name="black")
mat.diffuse_color = (0, 0, 0, 1.0)
#Erstellen Sie ein FontCurve-Objekt
text_curve = bpy.data.curves.new(type='FONT', name='fontcurve')
nil = bpy.data.objects.new('nil', text_curve)
#Legen Sie den Zeichenkettenkörper, die Schriftart und das Material fest
nil.data.body = 'nil'
nil.data.font = font
nil.data.materials.append(mat)
#Eine Funktion, die Zeichen durch Angabe eines Winkels oder einer Position platziert
def put_nil(x, y, z):
obj = nil.copy()
obj.location = (x, y, z)
obj.rotation_euler = (0, 0, PI/2)
col.objects.link(obj)
#Setzen Sie tatsächlich den Charakter
put_nil(0, 0, 0)
Das Ergebnis ist hier.
()
(leere Liste)#Eine Funktion, die nur viel Null arrangiert
def nils(xr, yr, zr):
for x in xr:
for y in yr:
for z in zr:
put_nil(x, y, z)
#Es sind schon viele leere Listen
nils(
[x/1.1 for x in range(-6, 6)],
[y/1.8 for y in range(-5, 7)],
[z/15 for z in range(-5, 5)]
)
Wenn Sie dies für den Teil tun, der die Funktion put_nil ()
aufruft, wird ein für Technical Book 8 erstelltes Kreisschnittbild erstellt.
Recommended Posts