Dies ist ein Artikel über das Erstellen eines Sternsystems (sieht aus wie) mit dem Blender-Skript, das jeder liebt. Voll kompatibel mit Blender 2.80!
Im Grunde ist es ein Skript, das eine Iteration dreht und eine große Menge auf ein Objekt legt, aber diesmal setze ich auch Materialien.
Vorerst aus einem einfachen Code. Lassen Sie uns die primitiven Kugeln automatisch anordnen.
import bpy
import numpy as np
#Setzen Sie den Status Quo zurück
for mat in bpy.data.materials:
bpy.data.materials.remove(mat)
for obj in bpy.data.objects:
bpy.data.objects.remove(obj)
for obj in bpy.context.scene.objects:
bpy.data.objects.remove(obj)
#Zahlen, die Kugeln erzeugen
number = 10
for i in range(number):
x = np.random.rand()*number*10-50
y = np.random.rand()*number*10-50
bpy.ops.mesh.primitive_uv_sphere_add(radius=np.random.rand()+1,location=(x,y,0))
Wenn Sie für jede Kugel, die durch die Kugel geht, einen Ring mit dem Ursprung als Mittelpunkt festlegen, sieht dies wie ein Sternensystem aus. Ursprünglich wurden die Koordinaten durch "x" und "y" angegeben, aber für zukünftige Berechnungen werden die Koordinaten durch die Polarkoordinaten von "r" und "Theta" angegeben.
import bpy
import numpy as np
#Setzen Sie den Status Quo zurück
for mat in bpy.data.materials:
bpy.data.materials.remove(mat)
for obj in bpy.data.objects:
bpy.data.objects.remove(obj)
for obj in bpy.context.scene.objects:
bpy.data.objects.remove(obj)
#Zahlen, die Kugeln erzeugen
number = 10
bpy.data.materials.new(name = 'orbit')
mat = bpy.data.materials['orbit']
mat.use_nodes = False
mat.diffuse_color = (1,1,0,1)
for i in range(number):
#In Polarkoordinaten berechnet
r = np.random.rand()*number*10+10
theta = np.random.rand()*np.pi*2
x = r*np.cos(theta)
y = r*np.sin(theta)
#Dies ist ein Planet
bpy.ops.mesh.primitive_uv_sphere_add(radius=np.random.rand()+1,location=(x,y,0))
#Dies ist die Umlaufbahn
bpy.ops.mesh.primitive_torus_add(major_radius=256,minor_radius=.1)
bpy.context.object.scale = (r/256,r/256,1)
Hier wird die API von bpy.ops.mesh.primitive_torus_add
verwendet. Die Referenz lautet hier. Der Radius des Donutrings wird durch "major_radius" angegeben, und der Radius des Querschnitts des Donuts wird durch "minor_radius" angegeben. Der Grund, warum major_radius
hier auf 0 gesetzt wird, ist, dass es eine unklare Angabe gibt, dass ** 257 oder mehr mit dieser API nicht angegeben werden können ** (ich war zuerst süchtig danach), also habe ich einen Donut mit einem Radius von 256 gewählt. Es wird durch Skalieren mit "bpy.context.object.scale" an "r" angepasst.
Dieses Mal werden wir auch das Material einstellen. Seit Blender 2.80 sind Shader beim Einstellen von Materialien fast unverzichtbar geworden, aber ** ich habe mich nicht so sehr mit dem Studium von Skripten beschäftigt **, daher werde ich diesmal in einem Modus erklären, in dem keine Shader verwendet werden. Ich werde. Wenn Sie Materialien mit einem Skript festlegen, fügen Sie nach dem Erstellen von Materialdaten mit bpy.data.materials.new
dem Zielobjekt mit bpy.ops.object.material_slot_add ()
einen Materialschlitz hinzu und fügen Sie diesen Schlitz hinzu. Der Ablauf besteht darin, das Material mit "bpy.context.object.active_material" für das Ziel festzulegen.
Die Materialreferenz lautet hier, dies ist jedoch nur der Anfang bei Verwendung von ** Knoten. **, Sie müssen mit der API eines feineren Knotens herumspielen. Vorerst werden wir es diesmal ohne Verwendung von Knoten einstellen (mat.use_nodes = False
), also geben Sie nur diffuse_color
, metallic
und roughness
mit Zufallszahlen an.
Dies ist die Anzeige in der GUI. Beachten Sie, dass sich diese Anzeige auch abhängig von der Render-Engine ändert und die obige Abbildung für "Zyklen" gilt.
import bpy
import numpy as np
#Setzen Sie den Status Quo zurück
for mat in bpy.data.materials:
bpy.data.materials.remove(mat)
for obj in bpy.data.objects:
bpy.data.objects.remove(obj)
for obj in bpy.context.scene.objects:
bpy.data.objects.remove(obj)
#Zahlen, die Kugeln erzeugen
number = 10
#Zuerst wird nur das Orbitalmaterial eingestellt
bpy.data.materials.new(name = 'orbit')
mat = bpy.data.materials['orbit']
mat.use_nodes = False
mat.diffuse_color = (1,1,0,1)
for i in range(number):
r = np.random.rand()*number*10+10
theta = np.random.rand()*np.pi*2
x = r*np.cos(theta)
y = r*np.sin(theta)
#Dies ist ein Planet
bpy.ops.mesh.primitive_uv_sphere_add(radius=np.random.rand()+1,location=(x,y,0))
#Stellen Sie individuelle Materialien für den Planeten ein
mat_name = 'material' + str(i)
bpy.data.materials.new(name = mat_name)
mat = bpy.data.materials[mat_name]
mat.use_nodes = False
mat.diffuse_color = np.random.rand(4)
mat.diffuse_color[3] = 1
mat.metallic = np.random.rand()
mat.roughness = np.random.rand()
bpy.ops.object.material_slot_add()
bpy.context.object.active_material=mat
#Dies ist die Umlaufbahn
bpy.ops.mesh.primitive_torus_add(major_radius=100,minor_radius=.1)
bpy.context.object.scale = (r/100,r/100,1)
#Wenden Sie das zuvor eingestellte Flugbahnmaterial an
mat = bpy.data.materials['orbit']
bpy.ops.object.material_slot_add()
bpy.context.object.active_material=mat
Da es eine große Sache ist, setzen Sie die Sonne (wie etwas) in die Mitte.
Zum obigen Code hinzugefügt
bpy.ops.mesh.primitive_uv_sphere_add(radius=4)
bpy.data.materials.new(name = 'sun')
mat = bpy.data.materials['sun']
mat.use_nodes = False
mat.diffuse_color = (1,.5,0,1)
bpy.ops.object.material_slot_add()
bpy.context.object.active_material=mat
Da der Radius und die Position des Planeten durch Zufallszahlen angegeben werden, wird bei jedem Drehen des Skripts ein anderes Sternensystem erzeugt. Das solide Display von Blender sieht gut aus, aber lassen Sie uns auch zu diesem Zeitpunkt rendern. Es ist pechschwarz wie es ist, so dass Sie das Licht in der Mitte einstellen können, aber die falsche Sonne wird das Licht blockieren. Hier stellen wir das Material manuell so ein, dass die falsche Sonne selbst scheint.
Shader-Knoten. Wir müssen uns daran gewöhnen, auch wenn es uns nicht gefällt.
Das Folgende wird mit der Kamera und dem Hintergrund gerendert. Der Sternenhimmel im Hintergrund wurde von CG Beginner ausgeliehen.
Recommended Posts