Blender + Python
El script de Python incorporado de Blender es perfecto para este tipo de cosas.
Abra una consola de Python y pegue lo siguiente:
import bpy
import random
def asteroid():
bpy.ops.mesh.primitive_ico_sphere_add()
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.faces_shade_smooth()
bpy.ops.mesh.select_mode(type='VERT')
bpy.ops.mesh.select_random()
bpy.ops.transform.resize(value=(random.uniform(1.1,1.4),random.uniform(1.1,1.4),random.uniform(1.1,1.4)))
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.subdivide(smoothness=1)
bpy.ops.mesh.select_random()
bpy.ops.transform.resize(value=(random.uniform(1.05,1.15),random.uniform(1.05,1.15),random.uniform(1.05,1.15)))
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.subdivide(smoothness=1)
bpy.ops.mesh.select_random()
bpy.ops.transform.resize(value=(random.uniform(0.92,1.05),random.uniform(0.92,1.05),random.uniform(0.92,1.05)))
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.subdivide(smoothness=1)
stretch = random.uniform(0.9,1.5)
bpy.ops.transform.resize(value=(stretch,1,1))
bpy.ops.transform.rotate(value=(random.uniform(-1.57,1.57)), axis=(random.uniform(-1.57,1.57),random.uniform(-1.57,1.57),random.uniform(-1.57,1.57)))
bpy.ops.object.mode_set(mode='OBJECT')
asteroid()
Luego se creará un asteroide en la posición de su cursor 3D:
¿Quieres otro asteroide? Mueva el cursor 3D a otro lugar y luego escriba asteroid()
en la consola de Python nuevamente (o simplemente ↑Enterpara repetir la última línea ingresada).
Para que se vea más como una pieza de roca espacial y menos como una gota de plástico, debe aplicar un material adecuado. El siguiente material de procedimiento funciona bastante bien. Usé un color difuso de #635C5B
, y #8D887F
en la textura de mármol.
Cómo funciona:
- Comience creando un icosaedro simple (
bpy.ops.mesh.primitive_ico_sphere_add()
).
- Ingrese al modo de edición (
bpy.ops.object.mode_set(mode='EDIT')
) y aplique un sombreado suave para que las facetas individuales se mezclen entre sí ( bpy.ops.mesh.faces_shade_smooth()
).
- Seleccione un subconjunto aleatorio de los vértices del objeto (
bpy.ops.mesh.select_random()
).
- Escala al azar en las direcciones X, Y y Z (
bpy.ops.transform.resize()
).
- Seleccione todo el objeto (
bpy.ops.mesh.select_all(action='SELECT')
) y aplique una subdivisión suave para agregar nuevos vértices interpolando suavemente a través del objeto deformado ( bpy.ops.mesh.subdivide(smoothness=1)
).
- (Repita los pasos 3 y 5 un par de veces más).
- Estire el objeto en la dirección X para hacerlo un poco menos esférico (
bpy.ops.transform.resize(value=(stretch,1,1))
)
- Aplicar una transformación de rotación aleatoria (
bpy.ops.transform.rotate()
)
- Finalmente, salga del modo de edición y deje el objeto seleccionado (
bpy.ops.object.mode_set(mode='OBJECT')
).
Más ejemplos: