Manipulez des objets à l'aide de l'API Python de bas niveau de Blender 2.8

Cet article est l'article de 24 jours (bien que tardif) du Calendrier de l'Avent Nextremer 2019.

Résumé

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.

Environnement d'exploitation

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

Créer un objet

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

blender-01.png

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

Imaginez un peu l'intérieur

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

Il peut être amusant de lire le code source pour voir comment il est fait.

Afficher les caractères en couleur

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

Mettez beaucoup de () (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

Manipulez des objets à l'aide de l'API Python de bas niveau de Blender 2.8
[S3] CRUD avec S3 utilisant Python [Python]
Manipulez les feuilles de calcul localement à l'aide de Python
API Blender Python dans Houdini (Python 3)
Acquisition de données à l'aide de l'API googlemap de python
[Python3] Google translate google translation sans utiliser l'API
Essayez d'utiliser l'API de Pleasant (python / FastAPI)
Valider les objets JSON à l'aide de Python DictShield
Essayez d'utiliser l'API d'action de Python argparse
Exécutez Ansible à partir de Python à l'aide de l'API
Fonctionnement de la souris à l'aide de l'API Windows en Python
Essayez d'utiliser l'API Kraken avec Python
Tweet à l'aide de l'API Twitter en Python
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
Créer une feuille de calcul Google à l'aide de l'API Python / Google Data
Procédure pour utiliser l'API WEB de TeamGant (en utilisant python)
[Python] Obtenez tous les commentaires à l'aide de Youtube Data Api
Essayez d'utiliser l'API BitFlyer Ligntning en Python
Obtenir l'URL de l'image à l'aide de l'API Flickr en Python
Jugons les émotions à l'aide de l'API Emotion en Python
Création récente de classement à l'aide de l'API Qiita avec Python
Téléchargement anonyme d'images à l'aide de l'API Imgur (à l'aide de Python)
Trouvez une approximation polynomiale à l'aide de l'API de bas niveau de TensorFlow 2.x
Essayez d'utiliser l'API ChatWork et l'API Qiita en Python
Essayez d'utiliser l'API DropBox Core avec Python
Extrusion Python Extrude de Blender 2.9
Commencez à utiliser Python
Scraping à l'aide de Python
Importez un fichier JPG à l'aide de l'API Google Drive en Python
Paramètres initiaux lors de l'utilisation de l'API foursquare avec python
Notification PUSH de Python vers Android à l'aide de l'API de Google
Obtenez des données LEAD à l'aide de l'API REST de Marketo en Python
[Blender] Complétez l'API Python de Blender avec un éditeur de texte
[Question] À propos de la conversion API du chat bot à l'aide de Python
Envoyez et recevez Gmail via l'API Gmail en utilisant Python
Enregistrez des tickets avec l'API de Redmine en utilisant des requêtes Python
[Python] Utilisation de l'API Line [1ère création de Beauty Bot]
OpenVINO utilisant l'API Python d'Inference Engine dans un environnement PC
Copier les fichiers S3 de Python vers GCS à l'aide de GSUtil
Procédure de transcription vocale à l'aide de Python et de l'API Google Cloud Speech
Utiliser l'API de recherche de la Bibliothèque du Parlement national en Python
Reconnaissance vocale des fichiers par l'API Google Speech v2 à l'aide de Python