[PYTHON] Créez un système stellaire avec le script Blender 2.80

untitled.png

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.

1. Placez un grand nombre de sphères

Pour le moment, à partir d'un simple code. Organisons automatiquement les sphères primitives.

image.png

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))

2. Qu'est-ce qu'une orbite planétaire a ajoutée

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».

image.png

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.

3. Spécification du matériau

image.png

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.

image.png

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

4 Création et rendu du soleil (comme des choses)

Puisque c'est un gros problème, placez le soleil (comme quelque chose) au centre.

image.png

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.

image.png

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.

untitled.png

Recommended Posts

Créez un système stellaire avec le script Blender 2.80
Créez une image diabolique avec le script de Blender
Comment créer un sous-menu avec le plug-in [Blender]
Créer un répertoire avec python
Créons un script qui s'enregistre avec Ideone.com en Python.
Créez un exemple de scène semblable à un jeu avec juste le script Blender 2.80
Créez un script de déploiement avec fabric et cuisine et réutilisez-le
Créez un environnement virtuel avec Python!
Créer un système de recommandation avec python
Créez un stepper de poisson avec numpy.random
Ecrire un script batch avec Python3.5 ~
Créer un téléchargeur de fichiers avec Django
Écrivez un script pour calculer la distance avec le système Elasticsearch 5 sans douleur
[Blender] Comment définir shape_key avec un script
Créer un décorateur de fonction Python avec Class
Créez une image factice avec Python + PIL.
[Python] Créez un environnement virtuel avec Anaconda
Créons un groupe gratuit avec Python
Créer une application graphique avec Tkinter de Python
Créer un gros fichier texte avec shellscript
Créer une machine virtuelle avec un fichier YAML (KVM)
Créez une application Web simple avec Flask
Créer un compteur de fréquence de mots avec Python 3.4
Gérez les générations de rotation des journaux avec un script shell.
Créer un voisin le plus proche de connexion avec NetworkX
Script pour créer un fichier de dictionnaire Mac
Créer un service Web avec Docker + Flask
Créer un référentiel privé avec AWS CodeArtifact
Créez un compteur de voiture avec Raspberry Pi
Créer une matrice avec PythonGUI (zone de texte)
Créer un graphique avec des bordures supprimées avec matplotlib
Créer un cadre avec un arrière-plan transparent avec tkinter [Python]
Afficher les prévisions météorologiques du jour avec le script shell
Créer un fichier exécutable GUI créé avec tkinter
Créer un LINE BOT avec Minette pour Python
Créez une interface utilisateur de jeu à partir de zéro avec pygame2!
Créer un fichier PDF avec une taille de page aléatoire
Créons un système de réception simple avec le framework sans serveur Python Chalice et Twilio
Créer un environnement virtuel avec conda avec Python
Créer une nouvelle tâche Todoist à partir d'un script Python
Créer une page qui se charge indéfiniment avec python
[Note] Créez une classe de fuseau horaire sur une ligne avec python
Vous pouvez facilement créer une interface graphique même avec Python
Créer un environnement de construction python3 avec Sublime Text3
Créez un système de synthèse bon marché avec des composants AWS
Créer un babillard avec Heroku, Flask, SQL Alchemy
Créez un tableau de bord pour les appareils réseau avec Django!
Créer une matrice avec PythonGUI (combo tkinter)
Créer une barre de couleurs avec Python + Qt (PySide)
J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python
Étapes pour créer un bot Twitter avec Python
Créer un arbre de décision à partir de 0 avec Python (1. Présentation)
Créer une nouvelle page en confluence avec Python
Créer un widget avec une couleur spécifiée avec Python + Qt (PySide)
Procédure de création d'application multi-plateforme avec kivy
Créer un système de notification des visiteurs à l'aide de Raspberry Pi
Créez une application Hello World avec un seul fichier avec django