Ja, ich gib’s zu, ich bin ein Minecraft Fan!
Da ich mir für diverse Bauprojekte gerne eine Blaupause herstelle, hab ich mir ein Workflow überlegt, wie man ein normales (High-Poly)Mesh in diesen klassischen Block-Voxel-Style umwandeln kann.
Im Grunde gibt es dazu zwei verschiedene Herangehensweisen: die einzelnen Voxel mit (A) üblichen Polygon-Boxen herstellen oder (B) mit einem Partikel-System.
Beide habe ich ausprobiert und bin zum Entschluss gekommen, dass die Partikel-Variante schneller und vor allem flexiebler ist. Gerade bei einem hohen Voxel-Count ist das Partikel-System von grossem Vorteil.
Verwendet habe ich dabei Particle-Flow und etwas Max-Script.
Meine Lösung funktioniert in etwa so:
1. Fülle ein Bereich/Box mit Voxel/Partikel
2. Entferne alle Voxel/Partikel die nicht innerhalb des Objektes sind
… klingt einfach und das ist es auch
Und das ganze jetzt Schritt für Schritt:
Partikel System erstellen
1. “PF Source” in der Szene erstellen
2. Icon Type der PF-Source auf “Box” stellen und die Dimensionen so eingeben dass sie das Objekt umschliesst welches wir in den Voxel-Haufen umwandeln möchten (in meinem Beispiel ist das Objekt ein Torus Knopf).
Später werde ich “Logo Size” etwas zweckentfremden, dieser Wert steht dann für die Grösse der Voxel-Boxen (bzw. den Abstand des 3D-Rasters)
Nicht Vergessen: Bei “Quantity Multiplier” Viewport auf 100% stellen (damit man später auch wirklich alles sieht)
Voxel generieren
3. “Particle View” öffnen
4. Da es keinen Operator gibt der ein 3D-Raster mit Partikel füllt muss man sich hier mit etwas MaxScript aushelfen. Darum erstell ich im ersten Event mal ein “Birth Script” Operator.
5. Das Script soll ein 3D-Raster erstellen (mit den Dimensionen der Particel-Source) und dieses dann mit Partikel füllen. Dazu könnt ihr folgendes Script einfach kopieren:
on ChannelsUsed pCont do ( pCont.useAge = true pCont.useTime = true pCont.usePosition = true ) on Init pCont do ( global ps = pCont.getParticleSystemNode() global RasterSize = ps.logo_size global RasterSegments = [floor(ps.emitter_width/RasterSize+.5) as integer,floor(ps.emitter_length/RasterSize+.5) as integer,floor(ps.emitter_height/RasterSize+.5) as integer] --print RasterSegments ) on Proceed pCont do ( t = pCont.getTimeStart() as float if t < 0 do ( for x = 0 to (RasterSegments.x-1) do ( for y = 0 to (RasterSegments.y-1) do ( for z = 0 to (RasterSegments.z-1) do ( pCont.AddParticle() pCont.particleIndex = pCont.NumParticles() pCont.particleAge = 0 pCont.particlePosition = ps.center + ([x*RasterSize,y*RasterSize,z*RasterSize]-(RasterSegments-[1,1,1])*RasterSize*.5) ))) ) ) on Release pCont do ( )
Voxel filtern
6. Mit Hilfe des “Group Selection” Operator werden alle Partikel herausgefiltert, die sich (nicht) im Objekt befinden.
Dazu einfach den Operator in das selbe Event schieben und als “Inside Object” unseren Torus Knopf auswählen. Zusätzlich “Reverse Selection” aktivieren.
7. Mit “Split Group” und einem “Delete” Operator können wir nun alle überflüssigen Voxels löschen
Voxel Form festlegen
8. Jetzt noch mit dem “Shape” Operator die gewünschte Voxelform und -grösse auswählen und fertig ist unser “Voxel-Generator”
.. das ist das Grundkonzept. Wenn man jetzt noch etwas tweaked kann man so ziemlich alles damit machen. Z.B. auch animierte Voxel:
Wem die Partikel-Technik nicht geheuer ist kann auch gerne dieses Script “Block Creator” verwenden:
Download
Zum Installieren das Script einfach per Drag-and-Drop ins Fenster schieben. Das Tool findet man in der Kategorie “GSTools”.
dazu noch ein kurzes Tutorial:












