Bonjour Python! Tout le monde, modélisez-vous bien aujourd'hui!
En parlant de cela, lorsque j'ai essayé d'exécuter Blender avec un script Python, je souffrais d'une erreur mystérieuse. En raison de difficultés, il a été constaté que la cause était un ** changement de spécification de l'API **. Vous pouvez penser que la plupart du code actuellement publié sur le net (pour ≒ 2.79 ou antérieur) ** ne fonctionne pas simplement en copiant **.
Donc, pour le code actuellement publié, cela fonctionnera avec 2.80! Je vais en publier une version modifiée. Après avoir arrangé le code avant et après le changement, j'expliquerai sous la forme que la partie modifiée est modifiée comme ceci en se référant à la référence correspondante. Les principaux changements sont à peu près les mêmes pour tous les codes, c'est donc probablement utile pour quiconque obtient une erreur dans un autre code.
Les gens qui ont écrit le code ne sont pas du tout mauvais, mais cela ne sert à rien car les spécifications ont changé. Le Blender en évolution n'est pas mal non plus. Si les gens souffrent alors que personne n'est mauvais ... Je porterai ce péché.
Blender x Python facilite la 3DCG!
C'est un script pour créer le maillage ci-dessus.
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)
Après le changement
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))
Ajout d'une primitive d'avion. «Rayon» indiquant que l'échelle est modifiée en «taille».
Référence applicable: 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]
Sélectionnez l'objet actif. La partie qui était à l'origine bpy.context.scene ~
doit être remplacée par bpy.context.view_layer ~
. Je ne sais pas exactement comment l'utiliser car l'API de scene
reste, mais voici la référence [par ici](https://docs.blender.org/api/current/bpy.types.Scene" Il ne semble pas y avoir d'autre choix que de lire .html) et d'étudier.
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))
Ajout de lampe. Renommé «lampe» en «lumière». De plus, la lumière de type «HEMI» (hémisphère) a disparu.
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)
Aucune API alternative n'a été trouvée pour cela. Dans GUI
Vous pouvez le modifier en opérant ici. Il existe une API appelée bpy.context.scene.world.color
, mais elle ne change pas même si je le spécifie. C'est hors de portée. Si vous souhaitez le reproduire, veuillez le modifier manuellement. Excusez-moi…….
Introduction au script python de Blender_Part 01
Il s'agit d'un script qui génère le maillage ci-dessus sans utiliser de primitives.
original
2.79
import bpy
#Supprimer le cube par défaut
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()
#Définir les coordonnées des sommets
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)
]
#Définir un visage à l'aide de cet indice
#Chaque face est définie par une séquence de quatre entiers
#La face triangulaire doit avoir les mêmes premier et quatrième sommets
faces=[
(2,1,0,3),
(0,1,4,0),
(1,2,4,1),
(2,3,4,2),
(3,0,4,3)
]
#Créer un nouveau maillage
me = bpy.data.meshes.new("PyramidMesh")
#Créer un objet avec un maillage
ob = bpy.data.objects.new("Pyramid", me)
#Placez l'objet à la position du curseur 3D
ob.location = bpy.context.scene.cursor_location
#Lier des objets à la scène
bpy.context.scene.objects.link(ob)
#Remplissez les sommets, les côtés et les faces du maillage
me.from_pydata(coords,[],faces)
#Mettre à jour le maillage avec de nouvelles données
me.update(calc_edges=True)
Après le changement
2.80
import bpy
#Supprimer le cube par défaut
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()
#Définir les coordonnées des sommets
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)
]
#Définir un visage à l'aide de cet indice
#Chaque face est définie par une séquence de quatre entiers
#La face triangulaire doit avoir les mêmes premier et quatrième sommets
faces=[
(2,1,0,3),
(0,1,4,0),
(1,2,4,1),
(2,3,4,2),
(3,0,4,3)
]
#Créer un nouveau maillage
me = bpy.data.meshes.new("PyramidMesh")
#Créer un objet avec un maillage
ob = bpy.data.objects.new("Pyramid", me)
#Placez l'objet à la position du curseur 3D
ob.location = bpy.context.scene.cursor.location
#Lier des objets à la scène
bpy.context.scene.collection.objects.link(ob)
#Remplissez les sommets, les côtés et les faces du maillage
me.from_pydata(coords,[],faces)
#Mettre à jour le maillage avec de nouvelles données
me.update(calc_edges=True)
2.79
bpy.context.scene.objects.unlink(item)
2.80
bpy.context.scene.collection.objects.unlink(item)
C'est une commande sur l'objet dans la scène courante, mais comme une hiérarchie appelée «collection» a été ajoutée sous «scène», il est nécessaire de la refléter. Il y a aussi des «objets» directement sous la «scène», et si tel est le cas, une erreur se produira lorsque «lier» ou «désengager» l'objet, ce qui est le premier meurtre. ʻAttribute Error: De nombreuses personnes peuvent avoir été criées par l'erreur'bpy_prop_collection'object has no attribute'link'`.
2.79
ob.location = bpy.context.scene.cursor_location
2.80
ob.location = bpy.context.scene.cursor.location
Spécifiez la position du curseur. En 2.79 et au-dessous, il y avait une API appelée curosr_location
, mais en 2.80, il semble qu'il y ait une structure hiérarchique avec emplacement
sous curseur
.
Référence applicable: 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)
Identique à l'histoire de collection
plus tôt.
Dans cette situation, il y a trop de changements et les informations requises sont encore petites, il est donc nécessaire de rechercher une API utilisable par vous-même. Dans de tels moments
Appuyer sur les touches «Ctrl» + «Espace» sur la console Python de Blender fera apparaître une liste de commandes candidates (si vous tapez à mi-chemin, les candidats seront réduits en conséquence), ce qui peut être utile. ..
Ayons une bonne vie dans Blender 2.80.