Erstellen Sie einen zufälligen 3D-Asteroiden

8

Stellen Sie sich vor, Sie arbeiten an einer 3D-Adaption des klassischen Videospiels Asteroids . Ihre Aufgabe ist es, einen Algorithmus zu schreiben, der einen zufälligen 3D-Asteroiden erzeugen kann.

Dies ist ein Beliebtheitswettbewerb, kein Code-Golf. Schreiben Sie schönen Code und erstellen Sie interessante Ergebnisse. Fügen Sie weitere coole Funktionen hinzu, wenn Sie möchten.

Regeln:

  • Ihr Algorithmus muss das Modell tatsächlich erstellen und nicht nur von einer externen Quelle oder ähnlichem laden.
  • Die Ergebnisse müssen (pseudo-) zufällig sein. Wenn Sie den Algorithmus mehrmals ausführen, müssen unterschiedliche Ergebnisse erzielt werden.
  • Echtzeitfähigkeit ist wünschenswert, aber nicht notwendig.
  • Niedrige oder hohe Polygonzahl? Realistisch oder stilisiert? Du entscheidest...
  • Die Ausgabe muss ein Netz sein , entweder im Speicher oder als Datei wie Wavefront OBJ . In beiden Fällen müssen Sie es auf irgendeine Weise rendern.
  • Erklären Sie Ihren Algorithmus, damit jeder daraus lernen kann.
  • Zeigen Sie einige Bilder Ihrer Ergebnisse.
Sebastian Negraszus
quelle

Antworten:

25

Mixer + Python

Das integrierte Python-Skript von Blender ist perfekt für diese Art von Dingen.

GIF-Animation eines sich drehenden Asteroiden

Öffnen Sie eine Python-Konsole und fügen Sie Folgendes ein:

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

An der Position Ihres 3D-Cursors wird dann ein Asteroid erstellt:

Drahtgitter-Rendering eines Asteroiden-3D-Modells

Willst du noch einen Asteroiden? Bewegen Sie den 3D-Cursor an eine andere Stelle und geben Sie ihn asteroid()erneut in die Python-Konsole ein (oder Enterwiederholen Sie einfach die zuletzt eingegebene Zeile).

Damit es eher wie ein Stück Weltraumgestein und weniger wie ein Plastikklumpen aussieht, müssen Sie ein geeignetes Material auftragen. Das folgende Verfahrensmaterial funktioniert recht gut. Ich habe eine diffuse Farbe von #635C5Bund #8D887Fin der Marmorstruktur verwendet.

Space Rock Materialeinstellungen

Wie es funktioniert:

  1. Erstellen Sie zunächst ein einfaches Ikosaeder ( bpy.ops.mesh.primitive_ico_sphere_add()).
  2. Rufen Sie den Bearbeitungsmodus ( bpy.ops.object.mode_set(mode='EDIT')) auf und wenden Sie eine glatte Schattierung an, damit die einzelnen Facetten ineinander übergehen ( bpy.ops.mesh.faces_shade_smooth()).
  3. Wählen Sie eine zufällige Teilmenge der Eckpunkte des Objekts aus ( bpy.ops.mesh.select_random()).
  4. Skalieren Sie sie zufällig in X-, Y- und Z-Richtung ( bpy.ops.transform.resize()).
  5. Wählen Sie das gesamte Objekt aus ( bpy.ops.mesh.select_all(action='SELECT')) und wenden Sie eine glatte Unterteilung an, um neue Scheitelpunkte hinzuzufügen, indem Sie sanft über das deformierte Objekt interpolieren ( bpy.ops.mesh.subdivide(smoothness=1)).
  6. (Wiederholen Sie die Schritte 3 bis 5 noch einige Male.)
  7. Dehnen Sie das Objekt in X-Richtung, um es etwas weniger sphärisch zu machen ( bpy.ops.transform.resize(value=(stretch,1,1)))
  8. Wende eine zufällige Rotationstransformation an ( bpy.ops.transform.rotate())
  9. Beenden Sie zum Schluss den Bearbeitungsmodus und lassen Sie das Objekt ausgewählt ( bpy.ops.object.mode_set(mode='OBJECT')).

Mehr Beispiele:

Asteroid 1Asteroid 2Asteroid 3Asteroid 4

r3mainer
quelle
2
Heiliger Bajeezus! .
luser droog