Ceci est un article sur la création d'un arrangement système stellaire (ressemble à) avec le script Blender que tout le monde aime. Entièrement compatible avec Blender 2.80!
Fondamentalement, c'est un script qui tourne une itération et en place une grande quantité sur un objet, mais cette fois, je place également des matériaux.
Pour le moment, à partir d'un simple code. Organisons automatiquement les sphères primitives.
import bpy
import numpy as np
#Réinitialiser le statu quo
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)
#Des nombres qui produisent des sphères
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))
Si vous définissez un anneau pour chaque sphère qui traverse la sphère avec l'origine comme centre, cela ressemble à un système stellaire. À l'origine, les coordonnées étaient spécifiées par «x» et «y», mais pour le calcul futur, les coordonnées sont spécifiées par les coordonnées polaires de «r» et «thêta».
import bpy
import numpy as np
#Réinitialiser le statu quo
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)
#Des nombres qui produisent des sphères
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):
#Calculé en coordonnées polaires
r = np.random.rand()*number*10+10
theta = np.random.rand()*np.pi*2
x = r*np.cos(theta)
y = r*np.sin(theta)
#C'est une planète
bpy.ops.mesh.primitive_uv_sphere_add(radius=np.random.rand()+1,location=(x,y,0))
#C'est l'orbite
bpy.ops.mesh.primitive_torus_add(major_radius=256,minor_radius=.1)
bpy.context.object.scale = (r/256,r/256,1)
Ici, l'API de bpy.ops.mesh.primitive_torus_add
est utilisée. La référence est ici. Le rayon de l'anneau de l'anneau est spécifié par «major_radius» et le rayon de la section transversale de l'anneau est spécifié par «minor_radius». La raison pour laquelle major_radius
est défini sur 0 ici est qu'il y a une spécification peu claire que ** 257 ou plus ne peut pas être spécifié avec cette API ** (j'en étais accro au début), j'ai donc choisi un beignet avec un rayon de 256. Il est fait pour s'adapter à r
en le mettant à l'échelle avec bpy.context.object.scale
.
Cette fois, nous définirons également le matériau. Depuis que Blender 2.80 est devenu Blender 2.80, les shaders sont devenus presque indispensables lors de la définition des matériaux, mais ** je n'ai pas tellement rattrapé l'étude des scripts **, donc cette fois je vais expliquer dans un mode qui n'utilise pas de shaders. Je vais. Lorsque vous définissez des matériaux avec un script, après avoir créé des données de matériau avec bpy.data.materials.new
, ajoutez un emplacement de matériau à l'objet cible avec bpy.ops.object.material_slot_add ()
et ajoutez cet emplacement. Le flux consiste à définir le matériau avec bpy.context.object.active_material
pour la cible.
La référence matérielle est ici, mais ce n'est que le début lors de l'utilisation de nœuds **. **, vous devez jouer avec l'API d'un nœud plus fin. Pour le moment, nous le définirons sans utiliser de nœuds cette fois (mat.use_nodes = False
), alors spécifiez uniquement diffuse_color
, metallic
et rughness
avec des nombres aléatoires.
Ceci est l'affichage dans l'interface graphique. Notez que cet affichage change également en fonction du moteur de rendu, et la figure ci-dessus est pour Cycles
.
import bpy
import numpy as np
#Réinitialiser le statu quo
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)
#Des nombres qui produisent des sphères
number = 10
#Seul le matériau orbital est défini en premier
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)
#C'est une planète
bpy.ops.mesh.primitive_uv_sphere_add(radius=np.random.rand()+1,location=(x,y,0))
#Définir des matériaux individuels pour la planète
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
#C'est l'orbite
bpy.ops.mesh.primitive_torus_add(major_radius=100,minor_radius=.1)
bpy.context.object.scale = (r/100,r/100,1)
#Appliquer le matériau de trajectoire précédemment défini
mat = bpy.data.materials['orbit']
bpy.ops.object.material_slot_add()
bpy.context.object.active_material=mat
Puisque c'est un gros problème, placez le soleil (comme quelque chose) au centre.
Ajouté au code ci-dessus
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
Puisque le rayon et la position de la planète sont spécifiés par des nombres aléatoires, un système stellaire différent est généré chaque fois que le script est tourné. L'affichage solide de Blender a l'air bien, mais rendons aussi à ce stade. Il est noir comme c'est le cas, vous pouvez donc régler la lumière au centre, mais le faux soleil bloquera la lumière. Ici, nous réglons manuellement le matériau de sorte que le faux soleil lui-même brille.
Noeud Shader. Nous devons nous y habituer même si cela ne nous plaît pas.
Ce qui suit est celui rendu avec la caméra et le jeu d'arrière-plan. Le ciel étoilé en arrière-plan a été emprunté à CG Beginner.
Recommended Posts