Blenders Skript erstellt so etwas **, über das auf der Expo gesprochen wurde. Da es prozedural basierend auf Zufallszahlen generiert wird, ist es möglich, unzählige Muster zu generieren. Die Version von Blender ist 2.8.
import bpy
import numpy as np
#Stellen Sie hier rotes Material ein
bpy.data.materials.new(name = 'red')
mat_red = bpy.data.materials['red']
mat_red.use_nodes = False
mat_red.diffuse_color = (1,0,0,1)
#Kugelgenerierung
bpy.ops.mesh.primitive_uv_sphere_add(radius=1,location=(0,0,0))
bpy.ops.object.material_slot_add()
bpy.context.object.active_material=mat_red
Wir werden eine rote Kugel erzeugen, indem wir ein Grundelement erzeugen und ein einfaches Material spezifizieren. Sie können eine UV-Kugel mit bpy.ops.mesh.primitive_uv_sphere_add
erstellen.
Ich würde gerne unzählige rote Kugeln erstellen, aber ich habe das Gefühl, dass das Leben scheint, wenn es eine Art Kontinuität gibt, anstatt es nur mit einer for-Anweisung zu tun. Deshalb werde ich es hier mit einer rekursiven Funktion implementieren. Ich werde entscheiden. Eine rekursive Funktion ist ein Programm, das sich beim Kopieren selbst erstellt (sehr gut geeignet).
import bpy
import numpy as np
#Stellen Sie hier rotes Material ein
bpy.data.materials.new(name = 'red')
mat_red = bpy.data.materials['red']
mat_red.use_nodes = False
mat_red.diffuse_color = (1,0,0,1)
def add_sphere(r,x,y,z,count):
if count > 20: #Endlosschleife ohne diese
return
bpy.ops.mesh.primitive_uv_sphere_add(radius=r,location=(x,y,z))
bpy.ops.object.material_slot_add()
bpy.context.object.active_material=mat_red
add_sphere(r,x+1,y,z,count+1) #Rufen Sie eine Kopie von sich
return
add_sphere(1,0,0,0,1)
Eine Kugel wird durch eine Funktion namens "add_sphere" erzeugt, aber auch eine Funktion namens "add_sphere" wird hierauf aufgerufen. Aber es ist nicht genau dasselbe, es erzeugt eine Kopie, die x mal 1 von sich selbst entfernt ist. Es tritt eine Endlosschleife auf, in der die Kopie um eins weiter verschoben wird, und ein kontinuierlicher Prozess kann einfach beschrieben werden. Dies ist nur eine horizontale Bewegung, aber mit einem Befehl wie "add_sphere (1.1 * r, y, x + 1, z, count + 1)" sieht es folgendermaßen aus:
Sie können das Geheimnis des Lebens fühlen.
Dies ist jedoch zu regelmäßig und ich spüre die Brillanz nicht. Betrachtet man das Originalmaterial, so scheint es, dass mehrere rote Kugeln unterschiedlicher Größe zu einem Ring verbunden sind. Immerhin scheint ein Lebensgefühl zu entstehen, wenn es Unterschiede in der Größe gibt. Die Positionen des gegenseitigen Auftretens sollten auch so gestaltet sein, dass sie vom Elternteil zum Kind wachsen.
import bpy
import numpy as np #Numpy-Import hinzufügen
#Stellen Sie hier rotes Material ein
bpy.data.materials.new(name = 'red')
mat_red = bpy.data.materials['red']
mat_red.use_nodes = False
mat_red.diffuse_color = (1,0,0,1)
def add_sphere(r,x,y,z,count):
if count > 20: #Endlosschleife ohne diese
return
bpy.ops.mesh.primitive_uv_sphere_add(radius=r,location=(x,y,z))
bpy.ops.object.material_slot_add()
bpy.context.object.active_material=mat_red
#Geben Sie zufällig Längen- und Breitengrad an
theta = np.random.rand()*np.pi*2
phi = (np.random.rand()-0.5)*np.pi
#Geben Sie neue Koordinaten an
nr = r*(0.5 + np.random.rand())#Der Ball des Kindes ist die 0 des Elternteils.5 mal zu 1.5 mal
nx = x+(r+nr)*np.cos(theta)*np.cos(phi)
ny = y+(r+nr)*np.sin(theta)*np.cos(phi)
nz = z+(r+nr)*np.sin(phi)
add_sphere(nr,nx,ny,nz,count+1)#Rufen Sie eine Kopie von sich
return
add_sphere(1,0,0,0,1)
Ich werde einen niedlichen Augapfel hinzufügen. Es wäre schön, wenn ich die Textur einstellen könnte, aber hier werde ich nur mit Primitiven zeichnen.
Es scheint viel. Wenn Sie danach die Schattierung ein wenig anordnen und rendern, können Sie wie am Anfang ein leuchtendes Bild erzeugen.
Der Code enthält viele redundante Teile, daher habe ich einige davon als Funktionen vereinfacht.
import bpy
import numpy as np #Numpy-Import hinzufügen
#Das Schreiben von drei Materialeinstellungen ist langwierig, machen Sie es also zu einer Funktion
def create_material(color_name,r,g,b):
bpy.data.materials.new(name = color_name)
mat = bpy.data.materials[color_name]
mat.use_nodes = False
mat.diffuse_color = (r,g,b,1)
return mat
mat_red = create_material('red',1,0,0)
mat_white = create_material('white',1,1,1)
mat_eye = create_material('eye',0,1.5,1)
#Das Schreiben von drei Koordinatenspezifikationen ist langwierig und daher teilweise funktionalisiert
def next_params(x,y,z,theta,phi,dist):
nx = x + dist*np.cos(theta)*np.cos(phi)
ny = y + dist*np.sin(theta)*np.cos(phi)
nz = z + dist*np.sin(phi)
return nx,ny,nz
#Das Schreiben von drei UV-Kugelgenerationen dauert lange, daher ist es teilweise funktionalisiert.
def create_sphere(r,x,y,z,mat):
bpy.ops.mesh.primitive_uv_sphere_add(radius=r,location=(x,y,z))
bpy.ops.object.material_slot_add()
bpy.context.object.active_material=mat
return
#Übrigens ist auch die Winkelerzeugung funktionalisiert
def create_angular():
theta = np.random.rand()*np.pi*2
phi = (np.random.rand()-0.5)*np.pi
return theta,phi
def add_sphere(r,x,y,z,count):
if count > 20: #Endlosschleife ohne diese
return
create_sphere(r,x,y,z,mat_red)
theta,phi = create_angular()
nr = r*(0.5 + np.random.rand())
nx,ny,nz = next_params(x,y,z,theta,phi,r+nr)
add_sphere(nr,nx,ny,nz,count+1)#Rufen Sie eine Kopie von sich
#Weiße Augen erzeugen (dies ist nur eine Funktion)
theta,phi = create_angular()
nx,ny,nz = next_params(x,y,z,theta,phi,r/3)
create_sphere(0.8*r,nx,ny,nz,mat_white)
#Schüler erzeugen (dies ist nur eine Funktion)
nx,ny,nz = next_params(x,y,z,theta,phi,r/2)
create_sphere(0.65*r,nx,ny,nz,mat_eye)
return
add_sphere(1,0,0,0,1)
Sie können eine andere Schönheit des Lebens sehen, indem Sie es in der Mitte teilen oder den Ball des Kindes verkleinern.
Wenn Sie interessiert sind, kann es eine gute Idee sein, mit verschiedenen Parametern zu spielen. Beachten Sie jedoch, dass bei einer Änderung um "Anzahl> 20" die Anzahl der Objekte möglicherweise exponentiell zunimmt und Blender je nach Aufbau des Programms einfriert.
Recommended Posts