Buat asteroid 3D acak

8

Bayangkan Anda sedang mengerjakan adaptasi 3D dari gim video klasik Asteroid . Tugas Anda adalah menulis algoritma yang dapat membuat asteroid 3D acak.

Ini adalah kontes popularitas, bukan golf kode. Tulis kode yang bagus dan buat hasil yang menarik. Tambahkan fitur keren lainnya jika Anda mau.

Aturan:

  • Algoritme Anda harus benar-benar membuat model, bukan hanya memuatnya dari sumber eksternal atau serupa.
  • Hasilnya harus (pseudo-) acak. Menjalankan algoritma beberapa kali harus menciptakan hasil yang berbeda.
  • Kemampuan waktu nyata diinginkan, tetapi tidak perlu.
  • Jumlah poligon rendah atau tinggi? Realistis atau bergaya? Kamu putuskan...
  • Output harus berupa mesh , baik dalam memori atau sebagai file seperti Wavefront OBJ . Dalam kedua kasus tersebut, Anda perlu membuatnya dengan beberapa cara.
  • Jelaskan algoritma Anda, sehingga semua orang bisa belajar darinya.
  • Tampilkan beberapa gambar hasil Anda.
Sebastian Negraszus
sumber

Jawaban:

25

Blender + Python

Skrip Python bawaan Blender sangat cocok untuk hal semacam ini.

Animasi GIF dari asteroid yang berputar

Buka konsol Python dan rekatkan pada yang berikut ini:

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

Kemudian asteroid akan dibuat di posisi kursor 3D Anda:

Wireframe membuat model 3D asteroid

Ingin asteroid lain? Pindahkan kursor 3D di tempat lain lalu ketik kembali asteroid()ke konsol Python (atau hanya Enteruntuk mengulangi baris terakhir yang dimasukkan).

Untuk membuatnya lebih terlihat seperti sepotong batu ruang angkasa dan kurang seperti gumpalan plastik, Anda perlu menerapkan bahan yang cocok. Materi prosedural berikut berfungsi dengan baik. Saya menggunakan warna difus #635C5B, dan #8D887Fdalam tekstur marmer.

Pengaturan material batuan ruang angkasa

Bagaimana itu bekerja:

  1. Mulai dengan membuat icosahedron sederhana ( bpy.ops.mesh.primitive_ico_sphere_add()).
  2. Masuk ke mode edit ( bpy.ops.object.mode_set(mode='EDIT')) dan terapkan shading halus sehingga masing-masing sisi menyatu satu sama lain ( bpy.ops.mesh.faces_shade_smooth()).
  3. Pilih subset acak dari simpul objek ( bpy.ops.mesh.select_random()).
  4. Skala mereka secara acak dalam arah X, Y dan Z ( bpy.ops.transform.resize()).
  5. Pilih seluruh objek ( bpy.ops.mesh.select_all(action='SELECT')) dan terapkan subdivisi halus untuk menambahkan simpul baru dengan menginterpolasi dengan lancar di seluruh objek yang dideformasi ( bpy.ops.mesh.subdivide(smoothness=1)).
  6. (Ulangi langkah 3–5 beberapa kali lagi.)
  7. Regangkan objek ke arah X untuk membuatnya agak kurang bulat ( bpy.ops.transform.resize(value=(stretch,1,1)))
  8. Terapkan transformasi rotasi acak ( bpy.ops.transform.rotate())
  9. Akhirnya, keluar dari mode edit dan biarkan objek dipilih ( bpy.ops.object.mode_set(mode='OBJECT')).

Lebih banyak contoh:

Asteroid 1Asteroid 2Asteroid 3Asteroid 4

r3mainer
sumber
2
Bajeezus suci! .
luser droog