Crea un asteroide 3D al azar

8

Imagina que estás trabajando en una adaptación 3D del clásico videojuego Asteroids . Su tarea es escribir un algoritmo que pueda crear un asteroide 3D aleatorio.

Este es un concurso de popularidad, no un código de golf. Escribe un buen código y crea resultados interesantes. Agregue otras características interesantes si lo desea.

Reglas:

  • Su algoritmo debe crear el modelo, no solo cargarlo desde una fuente externa o similar.
  • Los resultados deben ser (pseudo-) aleatorios. Ejecutar el algoritmo varias veces debe crear resultados diferentes.
  • La capacidad en tiempo real es deseable, pero no necesaria.
  • Recuento de polígonos bajo o alto? ¿Realista o estilizado? Tú decides...
  • La salida debe ser una malla , ya sea en la memoria o como un archivo como Wavefront OBJ . En cualquier caso, debe representarlo de alguna manera.
  • Explica tu algoritmo, para que todos puedan aprender de él.
  • Muestra algunas imágenes de tus resultados.
Sebastian Negraszus
fuente

Respuestas:

25

Blender + Python

El script de Python incorporado de Blender es perfecto para este tipo de cosas.

Animación GIF de un asteroide giratorio

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:

Procesamiento de alambre del modelo 3D de asteroides

¿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 #8D887Fen la textura de mármol.

Configuración de material de roca espacial

Cómo funciona:

  1. Comience creando un icosaedro simple ( bpy.ops.mesh.primitive_ico_sphere_add()).
  2. 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()).
  3. Seleccione un subconjunto aleatorio de los vértices del objeto ( bpy.ops.mesh.select_random()).
  4. Escala al azar en las direcciones X, Y y Z ( bpy.ops.transform.resize()).
  5. 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)).
  6. (Repita los pasos 3 y 5 un par de veces más).
  7. Estire el objeto en la dirección X para hacerlo un poco menos esférico ( bpy.ops.transform.resize(value=(stretch,1,1)))
  8. Aplicar una transformación de rotación aleatoria ( bpy.ops.transform.rotate())
  9. Finalmente, salga del modo de edición y deje el objeto seleccionado ( bpy.ops.object.mode_set(mode='OBJECT')).

Más ejemplos:

Asteroide 1Asteroide 2Asteroide 3Asteroide 4

r3mainer
fuente
2
Santo Bajeezus! .
luser droog