Crie um asteróide 3D aleatório


8

Imagine que você está trabalhando em uma adaptação em 3D do clássico videogame Asteroids . Sua tarefa é escrever um algoritmo que possa criar um asteróide 3D aleatório.

Este é um concurso de popularidade, não código de golfe. Escreva um bom código e crie resultados interessantes. Adicione outros recursos interessantes, se quiser.

Regras:

  • Seu algoritmo deve realmente criar o modelo, não apenas carregá-lo de uma fonte externa ou similar.
  • Os resultados devem ser (pseudo-) aleatórios. A execução do algoritmo várias vezes deve criar resultados diferentes.
  • A capacidade em tempo real é desejável, mas não necessária.
  • Contagem baixa ou alta de polígonos? Realista ou estilizado? Você decide...
  • A saída deve ser uma malha , na memória ou como um arquivo, como o Wavefront OBJ . Em ambos os casos, você precisa renderizá-lo de alguma forma.
  • Explique seu algoritmo, para que todos possam aprender com ele.
  • Mostre algumas imagens dos seus resultados.

Respostas:


25

Blender + Python

O script Python incorporado do Blender é perfeito para esse tipo de coisa.

Animação GIF de um asteróide em rotação

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:

Wireframe render do modelo 3D de asteróide

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 #8D887Fna textura de mármore.

Configurações de material de rocha espacial

Como funciona:

  1. Comece criando um icosaedro simples ( bpy.ops.mesh.primitive_ico_sphere_add()).
  2. 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()).
  3. Selecione um subconjunto aleatório dos vértices do objeto ( bpy.ops.mesh.select_random()).
  4. Escale-os aleatoriamente nas direções X, Y e Z ( bpy.ops.transform.resize()).
  5. 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)).
  6. (Repita as etapas 3 a 5 mais algumas vezes.)
  7. Estique o objeto na direção X para torná-lo um pouco menos esférico ( bpy.ops.transform.resize(value=(stretch,1,1)))
  8. Aplicar uma transformação de rotação aleatória ( bpy.ops.transform.rotate())
  9. Por fim, saia do modo de edição e deixe o objeto selecionado ( bpy.ops.object.mode_set(mode='OBJECT')).

Mais exemplos:

Asteróide 1Asteróide 2Asteróide 3Asteróide 4


2
Santo Bajeezus! .
Luser droog 13/03/2019
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.