Cet article est l'article de 24 jours (bien que tardif) du Calendrier de l'Avent Nextremer 2019.
Blender est un logiciel de création de données de modèle pour les graphiques 3D. Le code source est un logiciel public et gratuit sous licence GPL-v3.0. Python est intégré à Blender en tant que langage de script, et il semble que les opérations de l'interface utilisateur puissent être automatisées.
N'est-il pas possible de créer et d'organiser beaucoup d'objets et de jouer comme faire de l'art génératif dans Processing parce qu'il peut être exploité par programme? Si vous le recherchez dans cet esprit, les articles suivants apparaîtront. Je suis reconnaissant.
À propos, en tant que méthode d'ajout d'un objet, il semble que la méthode de faire comme suit dans la console de l'onglet Script de Blender soit introduite.
#Si vous le faites avec un fichier`import bpy`Est nécessaire
>>> bpy.ops.mesh.primitive_cube_add()
{'FINISHED'}
>>>
La valeur de retour est {" FINISHED "}
. Au fait, si vous faites cela avec Blender immédiatement après le démarrage, un objet appelé Cube.001
sera ajouté sous Collection de scènes
> Collection
(car un objet appelé Cube
est déjà placé). Et si j'essaye de changer ces informations Cube.001
après primitive_cube_add ()
?
#À partir des éléments enfants de Collection dans Scene Collection"Cube.001"Tiré par le nom
>>> bpy.data.collections.data.objects['Cube.001']
bpy.data.objects['Cube.001']
Au fait, le nom Cube.001
sera Cube.002
si vous faitesprimitive_cube_add ()
en présence de Cube.001
. En d'autres termes, le nom diffère en fonction de l'état de l'interface utilisateur. Hmmm, je veux dire, dans la programmation Python normale, je veux que vous retourniez le nom de l'objet créé avec primitive_cube_add ()
.
Au fait, il semble que le module bpy.obs
soit un ** module qui fournit ** des opérations d'interface utilisateur en tant que fonction.
Si c'est. Il doit y avoir une API de création / manipulation d'objets de niveau inférieur qui est appelée lors de la manipulation de l'interface utilisateur.
Dans cet article, jouons avec l'API de manipulation d'objets de bas niveau de Blender.
Le contenu de cet article utilise la version GNU / Linux du binaire Blender 2.81 distribué sur le site officiel de Blender.
$ 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
Commençons donc par invoquer ce singe Blender Suzanne avec une API de bas niveau. Faites ceci sur la console.
#Créez un objet B Mesh en important un module qui manipule les informations brutes de maillage de Blender
>>> import bmesh
>>> bm = bmesh.new()
#Définir les données de maillage de Suzanne sur bm
>>> bmesh.ops.create_monkey(bm)
... #D'une manière ou d'une autre, les données de sommet de nom sortent
#Objet BMesh réel défini sur bm
>>> bm
<BMesh(0x7f40f970ba08), totvert=507, totedge=1005, totface=500, totloop=1968>
#Créer un objet de maillage pour l'affichage, convertir le maillage B en maillage et définir
>>> mesh = bpy.data.meshes.new('suzanne')
>>> bm.to_mesh(mesh)
>>> bm.free() #Si vous en faites beaucoup, vous devriez le libérer
#Pour l'affichage*objet*objetをmeshを指定して作成する
>>> obj = bpy.data.objects.new('suzanne', mesh)
#Lien (registre) vers la liste d'objets de la collection dans le contexte courant (affiché comme)
>>> bpy.context.collection.objects.link(obj)
En conséquence, cela ressemble à ceci (la boîte placée par défaut est supprimée).
En passant, vous pouvez invoquer Suzanne en tant qu'opération d'interface utilisateur avec bpy.ops.mesh.primitive_monkey_add ()
(API doc À partir de # bpy.ops.mesh.primitive_monkey_add)).
À partir des opérations ci-dessus et de la documentation de l'API Python (https://docs.blender.org/api/current/bpy.types.html et https://docs.blender.org/api/current/bmesh.html), d'une manière ou d'une autre Vous pouvez deviner quelque chose comme le modèle de données de Blender.
bpy.data
([Blend Data Fields](https://docs.blender.org/api/current/bpy.types.", Tels que bpy.data.objects
et bpy.data.lights
. BlendData.html)) sera visible par Blender lorsque link (obj)
est terminébpy.context
bpy.data
. Inclus par typebpy_struct
autre que
bpy_struct. --Une instance de cette classe peut être passée au deuxième argument de
bpy.data.objects.new (nom, object_data)--Par exemple,
TextCurvehttps://docs.blender.org/api/current/bpy.types.TextCurve.html --Par exemple,
Text https://docs.blender.org/api/current/bpy.types.Text.html ――Mais si vous essayez de créer une instance telle quelle, une erreur se produira. --Guess: L'intérieur de Blender est fait avec l'architecture Entity Component System, et ʻID
correspond à Entity et component ...?Il peut être amusant de lire le code source pour voir comment il est fait.
#Charger la police
font = bpy.data.fonts.load('/home/grey/.fonts/en/Nobile/Nobile-Regular.ttf')
#Créer une collection
col = bpy.data.collections.new('nils')
bpy.context.scene.collection.children.link(col)
#Matériau à poser sur l'objet(Couleur=noir)Préparer
mat = bpy.data.materials.new(name="black")
mat.diffuse_color = (0, 0, 0, 1.0)
#Créer un objet FontCurve
text_curve = bpy.data.curves.new(type='FONT', name='fontcurve')
nil = bpy.data.objects.new('nil', text_curve)
#Définir le corps, la police et le matériau de la chaîne de caractères
nil.data.body = 'nil'
nil.data.font = font
nil.data.materials.append(mat)
#Une fonction qui place des caractères en spécifiant un angle ou un emplacement
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)
#En fait, mettez le personnage
put_nil(0, 0, 0)
Le résultat est ici.
()
(liste vide)#Une fonction qui arrange juste beaucoup de rien
def nils(xr, yr, zr):
for x in xr:
for y in yr:
for z in zr:
put_nil(x, y, z)
#C'est déjà beaucoup de listes vides
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)]
)
Si vous faites cela pour la partie qui appelle la fonction put_nil ()
, vous aurez une Circle cut image créée pour le Technical Book 8.
Recommended Posts