Blender + Python
O script Python incorporado do Blender é perfeito para esse tipo de coisa.
Abra um console Python e cole o seguinte:
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()
Um asteróide será criado na posição do seu cursor 3D:
Quer outro asteróide? Mova o cursor 3D para outro lugar e digite asteroid()
no console Python novamente (ou apenas ↑Enterpara repetir a última linha inserida).
Para fazer com que pareça mais um pedaço de rocha espacial e menos uma gota de plástico, você precisa aplicar um material adequado. O material processual a seguir funciona muito bem. Eu usei uma cor difusa de #635C5B
, e #8D887F
na textura de mármore.
Como funciona:
- Comece criando um icosaedro simples (
bpy.ops.mesh.primitive_ico_sphere_add()
).
- Entre no modo de edição (
bpy.ops.object.mode_set(mode='EDIT')
) e aplique sombreamento suave para que as facetas individuais se misturem ( bpy.ops.mesh.faces_shade_smooth()
).
- Selecione um subconjunto aleatório dos vértices do objeto (
bpy.ops.mesh.select_random()
).
- Escale-os aleatoriamente nas direções X, Y e Z (
bpy.ops.transform.resize()
).
- Selecione o objeto inteiro (
bpy.ops.mesh.select_all(action='SELECT')
) e aplique a subdivisão suave para adicionar novos vértices, interpolando suavemente pelo objeto deformado ( bpy.ops.mesh.subdivide(smoothness=1)
).
- (Repita as etapas 3 a 5 mais algumas vezes.)
- Estique o objeto na direção X para torná-lo um pouco menos esférico (
bpy.ops.transform.resize(value=(stretch,1,1))
)
- Aplicar uma transformação de rotação aleatória (
bpy.ops.transform.rotate()
)
- Por fim, saia do modo de edição e deixe o objeto selecionado (
bpy.ops.object.mode_set(mode='OBJECT')
).
Mais exemplos: