** * La version de Blender est 2.80 **
Certaines modélisations dans Blender peuvent être considérablement réduites dans le temps à l'aide de scripts Python. Le travail d'agencement d'un grand nombre d'objets est le meilleur. Je vais vous montrer un exemple.
Organisez les primitives (figures simples).
Si vous divisez la fenêtre et appuyez sur Shift + F11
avec le curseur sur un côté, ce sera comme suit.
Appuyez sur "Nouveau" pour créer un nouveau script.
Copiez le texte suivant.
import bpy
#reset objects
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(True)
max = 20
for i in range(0,max):
for j in range(0,max):
bpy.ops.mesh.primitive_cone_add(
radius1=.7,
location=(i,j,0)
)
Cliquez sur "Exécuter le script" ou entrez ʻAlt + P`, et l'image suivante sera créée.
Vous pouvez spécifier la largeur de répétition en jouant avec la valeur de «max». Si c'est environ «20», je pense que ça va avec la plupart des ordinateurs, mais si c'est «100», il peut se figer pendant quelques minutes. radius1
spécifie le rayon du bas, et 0.7
spécifie une valeur proche de $ \ frac {1} {\ sqrt {2}} $ de sorte que les bas de l'autre se touchent à peine. Faire.
import bpy
import math
#reset objects
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(True)
max = 20
for i in range(0,max):
for j in range(0,max):
height = 2+math.sin(i+j)
bpy.ops.mesh.primitive_cone_add(
radius1=.7,
location=(i,j,height/2),
depth = height)
Ajoutez une variation à la hauteur du cône. Utilisez une fonction triangulaire pour changer la hauteur périodiquement. Si vous n'ajoutez pas la moitié de la hauteur spécifiée dans profondeur
à la position z, la hauteur du fond ne correspondra pas, donc profondeur = hauteur
,location = (i, j, hauteur / 2)
Je vais.
import bpy
#reset objects
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(True)
max = 5
for i in range(-max,max):
for j in range(-max,max):
for k in range(-max,max):
bpy.ops.mesh.primitive_cone_add(
location=(i*4,j*4,k*4)
)
Ressentez l'univers. La plage d'itération va de «0» <«max» à «-max» <«max» pour faciliter les calculs futurs.
import bpy
import numpy
#reset objects
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(True)
max = 5
for i in range(-max,max):
for j in range(-max,max):
for k in range(-max,max):
bpy.ops.mesh.primitive_cone_add(
location=(i*4,j*4,k*4),
rotation=numpy.random.rand(3)*3,
)
Un nombre aléatoire est spécifié pour "rotation". C'est magnifique avec ça.
import bpy
import math
#reset objects
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(True)
max = 5
for i in range(-max,max):
for j in range(-max,max):
for k in range(-max,max):
dist = math.sqrt(i*i+j*j)
zx = math.atan2(j,i)
zy = -math.pi/2-math.atan2(k,dist)
bpy.ops.mesh.primitive_cone_add(
location=(i*8,j*8,k*8),
depth=dist*2,
rotation=(0,zy,zx)
)
Tous les cônes sont centrés. $ \ Tan ^ {-1} (\ frac {j} {i}) $ pour la longitude, $ \ tan ^ {-1} (\ frac {k} {\ sqrt {i ^ 2 + j ^ 2}}) La latitude est calculée avec $. La «profondeur» est également ajustée pour créer une sensation d'être vers le centre.
C'est ennuyeux s'il ne s'agit que de primitives, alors copiez et arrangez des objets arbitraires. Nous le ferons en organisant et en sélectionnant celui qui sera la source de la copie, et en le copiant sérieusement.
C'est,
Comme ça.
import bpy
import numpy
for i in range(0,500):
bpy.ops.object.duplicate()
bpy.context.object.location = numpy.random.rand(3)*40-20
bpy.context.object.rotation_euler = numpy.random.rand(3)*3
Si vous souhaitez apporter d'autres modifications à la figure, vous pouvez préparer à l'avance fbx, obj ou ply et en importer un grand nombre. Juste avant Nous avons généré un grand nombre de modèles de corps humains, alors importons-les tous en même temps et organisons-les. Il est nécessaire de préparer à l'avance un grand nombre de fichiers dans un dossier spécifique et de les préparer pour qu'ils puissent être traités collectivement par numéro de série.
Est-ce Neo Exdes?
import bpy
import numpy
#Entrez ici le chemin du fichier (juste avant le numéro de série)
dir = r'~~~'
for i in range(0,500):
#Spécifiez le numéro de série et l'extension (obj avec ce code)
path = dir + str(i) + '.obj'
bpy.ops.import_scene.obj(filepath=path)
for i in range(0,500):
bpy.data.objects[i].location = numpy.random.rand(3)*20-10
Recommended Posts