Archiv des Autors

Tutorial: Voxel via Particle Flow

27.01.2012

ala

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)

ala

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.

ala

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

ala

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”

ala

.. das ist das Grundkonzept. Wenn man jetzt noch etwas tweaked kann man so ziemlich alles damit machen. Z.B. auch animierte Voxel:

ala

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:

Weihnachtsessen 2011

24.01.2012

.. nachträglich noch die Bilder vom Weihnachtsessen 2011 im Uto Kulm auf dem Uetliberg.

Der im dichten Nebel umhüllte Berg bot zwar keine sonst spektakuläre Aussicht auf Zürich, dafür aber eine besonders mystische Stimmung.

Max Script: AnimationReTimer

09.08.2011

Da es öfters vorkommt, dass man mehrere animierte Objekte in einer gewissen Reihenfolge animieren möchte (z.B. bei Auf- oder Abbauanimationen) habe ich vor einiger Zeit mal ein Script geschrieben welches ich nun teilen möchte.

Louis Marcoux hat auf seinem Blog ganz schön beschrieben wie man so ein Script selber programmieren kann: Reveal Techniques

Ich habe einen ähnlichen Ansatz allerdings mit einer kleinen Änderung welche mehr Dynamik und Flexibilität ermöglicht.

AnimationReTimer

Die Idee ist, dass sich jedes dieser Objekte an einem (oder mehreren) “Timer-Objekt” orientiert und zwar abhängig von der Distanz. Kommt also dieses Timer-Objekt in die Nähe eines anderen Objekts fängt dieses seine Animation an.
Somit kann ich jedes dieser Objekte frei animieren (alle mit der selben Animation wie im Video-Tutorial, aber auch jedes Objekt mit einer einzigartigen Animation).
Die Keys dieser Animation werden dann durch das Script einfach nur verschoben.

Objecs [Add] [Remove]
Timer-Objekt(e) hinzufügen.
Timer-Objekte sollten mindestens zwei Key-Frames haben (z.B. Start- & Endposition). Wird also ein Timer-Objekt durch ein Noise-Controller gesteuert sollten trotzdem (irgendwelche) Keyframes existieren, damit das Script weiss wann die Animation anfängt bzw. aufhört.

Animation Reference
Animation fängt an <-> hört auf wenn Timer-Objekt am nächsten ist.

Distance Reference
Distanz zum Timer-Objekt wird am
Anfang <-> Ende der Animation gemessen.
Nur sinnvoll wenn sich Objekt bewegt.

Delay
Ganze Animation verzögern (Frames).

Accuracy
Genauigkeit der Berechnung um diese zu beschleunigen. Eignet sich wenn das Skript auf sehr viele Objekte angewendet wird (höherer Wert = schnellere & ungenauere Berechnung).

Lazy Animation
Objekt kann auch vom Nachbar-Objekt aktiviert werden. Dieser Wert steuert den Zeitverzug. Timer-Objekt kann somit eine Art Welle erzeugen.

Distance Dependent
Wenn Aktiv wird Objekt nur vom nächsten Timer-Objekt aktiviert ansonsten kann es unabhängig auch vom Nachbar-Objekt aktiviert werden (je nach Wert von “Lazy Animation”).

RETIME!
Alle selektierten Objekte werden “Retimed”.

Installation:
Script einfach per Drag-and-Drop ins Fenster schieben.
Tool (AnimationReTimer) findet man bei der Kategorie “Animation-Tools”.

Download

.. hoffe das Script hilft euch wie es mir schon oft geholfen hat!

Hier ein kleines Tutorial:

… und noch eine weiteres Beispiel:

Guave Studios goes RED

17.06.2010

Red One

Wieder einmal hatten wir nun die Gelegenheit einen Action geladenen Trailer für einen unserer Kunden zu produzieren. Das Budget reichte zwar nur für einen Drehtag, aber das hat uns natürlich nicht davon abgehalten so viel “Action” wie nur möglich in den Trailer reinzupacken. Luxus Yacht, heisse Girls, schnelle Autos, Verfolgungsjagd, Gewehre, und was heutzutage auch nicht fehlen darf … ein Parkour Künstler!

Um das alles auch optisch anspruchsvoll zu verpacken war der Einsatz der RED ONE natürlich unumgänglich. Die mit einem Vollformat-35mm CMOS Sensor bestückte digitalen Filmkamera lieferte uns hochauflösende, gestochen scharfe, 4k Bilder. Zudem hatten wir die Möglichkeit die Framerate auf bis zu 120 fps einzustellen um somit die Zeit zu verlangsamen und wunderschöne Slow-Motion-Effekte zu erzeugen, die wir auch schon in TV Spots eingesetzt haben.

Durch einen optimierten digitalen 2k Workflow konnten wir die Post-Produktion sogar innerhalb von drei Tagen abschliessen (inkl. 3D Visual Effects!).

Diese “filmische Blitzaktion” verlangte natürlich grossen Einsatz des gesamten Teams und somit möchten wir uns nochmals bei allen Mitwirkenden bedanken für ihr Engagement!

… und nun noch ein paar Bilder des Drehs:

… und natürlich den “Fake-Trailer” (… in 3Dee !! ;-) ):

Jump ‘n Run – Official Fake Trailer from Guave Studios on Vimeo.

Tutorial: Timelapse bei ungünstigen Lichtverhältnissen

19.01.2010

Da wir für den Kurzfilm “The Prague Assignment” einen Sonnenaufgang filmen wollten, haben wir uns diesmal eine besondere Technik überlegt, womit sich ein Zeitraffer von der Nacht bis in den Tag erstellen lässt.

Der übliche Workflow für einen Zeitraffer ist im Grunde ja ganz einfach: mit einer Fotokamera Serienbilder aufnehmen. Je nach Geschwindigkeit des Videos stellt man den Zeitabstand zwischen den Aufnahmen ein. Das geht entweder mit einer speziellen Remote Control oder man schliesst die Kamera an einem Laptop an und verwenden ein spezielles Programm (Die meisten Hersteller bieten eine solche Software an).

Das Problem bei einem Sonnenaufgang (oder -untergang) ist folgendes:
Es ist so gut wie unmöglich die Kamera so einzustellen, dass die Nacht nicht unterbelichtet, bzw. der Tag nicht überbelichtet ist. Die einzige Möglichkeit, um das Problem zu lösen, ist mit Automatik zu fotografieren (entweder Shutter- oder Apertureautomatik). Da ergibt sich aber gleich ein neues Problem, nämlich dass der Zeitraffer dann extrem flimmert bzw. flackert. Das liegt daran, dass die Shutter- bzw. Apertureeinstellungen nicht stufenlos sind. Eine Möglichkeit das Flimmern etwas zu verringern ist, wenn man die Belichtungsmessung auf ein Objekt stellt, das sich nicht bewegt. Darum sollte man nicht den Himmel messen, da immer wenn eine Wolke vorbeisaust, das Bild kurz dunkler und dann wieder heller wird. Trotzdem verändern sich mit der Zeit die Lichtverhältnisse und speziell in dem Moment wo die Sonne aufgeht, wird das Video extrem flackern. Und genau dieses Flackern wird sich rein fototechnisch nicht wirklich verhindern lassen.

Es gibt allerdings eine Technik, mit der sich das flackernde Bildmaterial ausgleichen lässt. Nämlich Tone Mapping (bei HDR Bilder).
Das Problem ist allerdings, dass die Fotos die man geschossen hat keine HDR Bilder sind. Wenn man die Fotos aber als RAW speichert, lässt sich daraus recht gut ein “Fake HDR” erzeugen.
Hierbei hilft uns die Software “Photomatix”. Mit einem “Batch Process” (in Photomatix gibt es die Option “Batch Single Files”) lässt sich aus allen Fotos ein Pseudo-HDR erzeugen. Das alleine hilft natürlich noch nicht. Schlussendlich wird uns hier das Tone Mapping das flackern ausgleichen.
Warum? Ganz einfach, weil (einfach ausgedrückt) Tone Mapping in einem Bild die besten “Kontrastverhältnisse” sucht. Wenn ein Foto also etwas heller oder etwas dunkler ist, ist das Optimum meist irgendwo dazwischen.
Hier kann man wieder einen Batch Prozess über die gerade eben erstellten HDR Bilder laufen lassen, aber dieses mal mit Tone Mapping.

Das Ergebnis kann dann so aussehen und beispielsweise in Movies oder TV Spots eingesetzt werden.
(oben: normale JPGs der Kamera; unten: die bearbeiteten Pseudo HDR Bilder)

Pseudo HDR Timelapse Comparison from Guave Studios on Vimeo.

Wie man sieht ist das Flackern nicht 100 %tig entfernt, vor allem in den dunklen Bereichen, da diese recht stark erhellt wurden. Aber ansonsten kann sich das Ergebnis schon sehen lassen.
Ich denke, wenn man mit den Tone Mapping Einstellungen noch etwas spielt, verschwindet auch noch das bisschen Flackern.

Ich hoffe dieses Tutorial war halbwegs verständlich. Ich habe die einzelnen Arbeitsschritte nicht aufgezählt, da die meisten HDR Programme eigentlich sehr einfach zu bedienen sind. Der selbe Effekt lässt sich übrigens auch mit anderen Programmen erzielen, als mit Photomatix. Falls aber doch Unklarheiten bestehen sollten, könnt ihr gerne Fragen stellen.
Ansonsten wünsche ich viel Spass beim selber Probieren!