Incom ist die Kommunikations-Plattform der Fachhochschule Potsdam

In seiner Funktionalität auf die Lehre in gestalterischen Studiengängen zugeschnitten... Schnittstelle für die moderne Lehre

Incom ist die Kommunikations-Plattform der Fachhochschule Potsdam mehr erfahren

NYCCabs // Datascapes mit Houdini

NYCCabs ist eine 3D-Datenvisualisierung. Prozedural generiert mit der 3D-Grafiksoftware Houdini. Basierend auf realen Daten von der TLC - Taxi & Limousine Commission New York.

Houdini

Houdini ist eine 3D-Grafiksoftware des in Toronto ansässigen Entwicklers SideFX. Es ging Ende der 1990er aus dem Programm PRISMS zur prozeduralen Synthese von 3D-Objekten hervor. Sein Hauptaugenmerk liegt nach wie vor auf der prozeduralen Synthese, womit sich Houdini von anderer 3D-Grafiksoftware abhebt.

Houdini wird hauptsächlich für Spezialeffekte in Filmen und Computerspielen verwendet. Große Studios wie Walt Disney Animation Studios, Pixar, DreamWorks Animation, ILM und weitere haben Houdini u. a. für Fantasia 2000, Die Eiskönigin – Völlig unverfroren, Zoomania oder Rio verwendet.

Houdini ist eine Node-basierte 3D-Grafiksoftware. Es können vorgefertigte Bausteine „Nodes“ mit einander verbunden und parametrisch angepasst werden um Geometrie, Partikel, Flüssigkeiten, Feuer, Rauch, Simulationen, usw. zu erzeugen und zu steuern.  Es können auch eigene Nodes erstellt und gespeichert werden.

Es ist zudem möglich mit hscript, VEX und Python Nodes zu erzeugen und zu manipulieren.

Datascapes mit Houdini

In diesem Kurs wurden die vielfältigen Möglichkeiten, die die 3D-Grafiksoftware Houdini für Datenvisualisierung und generatives 3D-Design bietet, gelehrt und untersucht.

Exploration & Spielerei

Nach dem uns Julian die grundlegenden Prinzipien und Werkzeuge von Houdini näher gebracht hatte, mussten wir auch schon selber ran und begannen mit den ersten Gehversuchen in Houdini :)

VEX_3.gifVEX_3.gif
Mandala_2.pngMandala_2.png
Mandala.pngMandala.png
Blob_2.pngBlob_2.png
Aplitude.pngAplitude.png

NYCCabs

Die Idee zu NYCCabs entstand im Kurs - The Data Interface bei Boris Müller in Kooperation mit Leah Döllmann, Ekaterina Oreshnikova und Denys Ivanchenko.

Das Projekt war zweigeteilt. Das Konzept und das Interface entstanden im Kurs - The Data Interface und die 3D-Visualisierung im Kurs - Datascapaes mit Houdini bei Julian Braun. Die Doku des gesamten Projekts ist hier zu finden: NYCCabs // The Data Interface

Ich bedanke mich für die Zusammenarbeit!

TLC Datensatz

Die Daten der Taxifahrten werden seit 2009 von der TLC erhoben und sind öffentlich zugänglich.

Die Datensätze lassen sich in Form von CSV-Tabellen mit mehreren Millionen! Fahrten pro Monat bequem herunterladen.
Zusätzlich stellt die TLC ein shp.-Dateiformat zur verfügung. Dies ist ein Geodatenformat(GIS-Datenformat) das die Taxizonen von New York als „Flächen“ beinhaltet.

Prozess

Fahrten

Nach dem ich die CSV-Tabelle der Fahrten der Yellow Cabs von Oktober 2018 heruntergeladen hatte, fiel mir auf das die Datei knapp 800MB groß war und rund 9.000.000 Fahrten beinhaltete! Die CSV der Fahrten der Green Cabs war wesentlich kleiner mit ca. 700.000 Fahrten.

Nach dem ich etwas erschlagen war suchte ich nach Lösungen und stieß im Netz auf ein Python-Skript mit dem es möglich ist CSV-Dateien zu zerteilen. Ich musste es nur leicht anpassen. Mit dem Skript ist es zudem möglich die Anzahl der Zeilen pro Teil zu definieren.

Python-Script

import os
import shutil
def split_file():
    splitLen = 300000
    outputBase = 'SplitedFile/yellow_tripdata_2018-10_'
    input = open('InputFile/yellow_tripdata_2018-10.csv','r').read().split('\n')
    i = 1  

    for lines in range(0,len(input),splitLen):
        outputData = input[lines:lines+splitLen]
        output = open(outputBase+str("%05d"%i)+'.csv','w')
        output.write('\n'.join(outputData))
        output.close()
        i+=1  

    print("file split operation has been sucessfull")  

if __name__ == "__main__":
    split_file()

Das Skript exportiere dann knapp 30 CSV-Datei mit jeweils ca. 300.000 Fahrten. Rein rechnerisch sollte jeweils eine CSV einen Tag beinhalten.

Nach dem die riesige CSV zerteilt war konnte ich einen Tag aussuchen und in OpenRefine weiter bearbeiten. Ich entschied mich für den 15. Oktober. Ich säuberte die Tabelle von korrupten Einträgen und löschte Zeilen und Spalten die ich nicht brauchte. 

Ich entschied mich dazu mit folgenden Spalten weiter zu machen.

Pick Up Time = Uhrzeit Einstieg

Drop Off Time = Uhrzeit Ausstieg

Pick Up Location = Zonen-Id Einstieg

Drop off Location = Zonen-Id Ausstieg

Übrig blieb eine CSV mit 257.602 Fahrten. 

Das selbe musste ich dann noch für die Fahrten der Green Cabs machen.

Openrefine.pngOpenrefine.png

Zonen

Ich hatte bisher noch nie etwas mit .shp-Datein zu tun gehabt und musste herausfinden wie ich sie öffnen konnten. Nach einer Recherche stieß ich auf die Open-Source-Software QGIS.

QGIS (ehemals Quantum-GIS) ist ein freies Geoinformationssystem zum Betrachten, Bearbeiten, Erfassen und Analysieren von räumlichen Daten.

QGIS.pngQGIS.png

Mit QGIS lies sich die .shp-Datei problemlos öffnen. Dabei erkannte ich das jede Taxizone mit der entsprechenden Zonen-Id verknüpft war. 

Als nächstes musste ich herausfinden wie ich die .shp-Datei in Houdini geladen bekomme. Bei der Recherche fand ich keine Möglichkeit die Datei direkt in Houdini zu öffnen. Ich fand aber heraus das es ein GIS-Plug-In für Blender gibt. Das lud ich mir dann runter. Ich öffnete die .shp-Datei in Blender und war sehr froh. Die Zonenkarte von New York konnte ich nun im 3D-Raum drehen und wenden.

Blender.pngBlender.png

Die Zonenkarte lag mir nun folgendermaßen vor: 

Die einzelnen Zonen waren nun Polygone mit unterschiedlich vielen Eckpunkten. Jede Zone war so benannt wie die reale Zonen-Id lautet.

Ich exportierte die Zonenkarte in mehreren Versionen - ganz New York und auch als einzelne Viertel(Manhattan, Bronx, Brooklyn, Queens, Staten Island) als Alembic-Datein(.abc).

In Houdini konnte ich dann die Zonenkarte als Alembic-Datei problemlos mit der File-Node öffnen. Die CSV-Datein konnte ich mit der Table-Import-Node laden. Dabei müsste ich definieren welche Spalten ausgelesen werden sollen.

Houdini

Nach dem die Vorbereitungen abgeschlossen waren konnte ich nun endlich zu Houdini übergehen und an der Visualisierung tüfteln. Da dies mein erstes Houdini Projekt war war meine Herangehensweise explorativ. Ich brauchte mehre Anläufe bis ich zu dem Ergebnis kam. Schluss endlich verhalf mir ein ENTAGMA-Tutorial das mir Julian empfohlen hatte. In dem Video visualisieren die Jungs von ENTAGMA Flüge rund um den Globus. Ich konnte viel von dem Tutorial lernen. Danke Julian und ENTAGMA :)

Houdini.pngHoudini.png

Ich verwendete hauptsächlich vorgefertigte Nodes von Houdini. Lediglich das Erzeugen der Fahrten als gekrümmte Splines musste ich mit VEX coden.

Der Houdini-Sketch im Detail:

Nodes_Tree.pngNodes_Tree.png

Diese VEXpression erzeugt die Linien(Bézierkurve) die einen Start- und Zielpunkt verbinden und dadurch eine Taxifahrt zwischen zwei Zonen visualisieren.

int src = findattribute(1, "point", "id", i@src);    
int dst = findattribute(1, "point", "id", i@dst);  

if(src >= 0 && dst >= 0){        
    int newprim = addprim(0, "polyline");        
    setprimgroup(0, "new", newprim, 1);        
    vector v1 = point(1, "p", src);        
    vector v2 = point(1, "p", dst);        
    int p1 = addpoint(0, v1);        
    int p2 = addpoint(0, v2);        
    float distance = distance(v1, v2);        
    setpointattrib(0, "dist", p1, distance);         
    setpointattrib(0, "dist", p2, distance);        
    addvertex(0, newprim, p1);        
    addvertex(0, newprim, p2);    
}

Zum Steuern der Krümmung und Höhe der Kurven ist folgende VEXpression nötig. Diese erzeugt ein UI-Element innerhalb von Houdini mit dessen Hilfe es möglich wird die Krümmung und relative Höhe der Kurven händisch anpassen zu können.

float scale = chf("Lift_Scale");  
float lift = chramp("Lift_Amount", @curveu);  

vector liftpos = v@P + (v@N * lift * scale * @dist);  

v@P = liftpos;

Visualisierung

Das Rendern der 3D-Grafiken erfolgte mit der Houdini eigenen Render-Engine Mantra. 

Die folgenden Darstellungen zeigen alle Fahrten des 15.10.2018. Die Fahrten einer Stunde am 15.10.2018. Und alle Fahrten die von oder zu einem der drei Flughäfen gingen.

NYC_NYC_1h.pngNYC_NYC_1h.png
NYC_NYC_24h.pngNYC_NYC_24h.png
NYC_Airports_24h.pngNYC_Airports_24h.png

Die folgenden Renderings fokussieren sich auf die einzelnen Bezirke New Yorks.

Da in Manhattan besonders viele Taxen unterwegs sind, zeigt die Darstellung die Fahrten der Yellow-Cabs auf der Oberseite und die Fahrten der Green-Cabs auf der Unterseite. Es ist deutlich zu erkennen das die Green-Cabs nur im Nördlichen Teil von New York Fahrgäste aufnehmen dürfen.

NYC_Bronx.pngNYC_Bronx.png
NYC_Manhattan.pngNYC_Manhattan.png
NYC_Brooklyn.pngNYC_Brooklyn.png
NYC_Queens.pngNYC_Queens.png

Für die Werkschau entwickelte ich ein Audiovisuelles-Format das Animationen, Texte, eine Zeitleiste und eine Legende die als Drop-Down-Menü realisiert wurde.

Fazit

Houdini ist so vielfältig wie komplex! Ich konnte viel in diesem Kurs lernen und hatte sehr viel Spaß obwohl es nicht immer einfach war. Houdini kann sehr schnell sehr komplex und sehr rechenintensiv werden. Es war ein sehr vielschichtiges Projekt in dem ich viele meiner Skills nutzen konnte. 

Ich denke Datenvisualisierungen im 3D-Raum werden in Zukunft eine größere Rolle spielen. Erst recht im Hinblick auf AR/VR. Mit Sicherheit ist es wenig sinnvoll jegliche Daten im Raum zu visualisieren. Es sollte sehr wohl überlegt sein die dritte Dimension zu betreten.

Ein Projekt von

Fachgruppe

Interfacedesign

Art des Projekts

Studienarbeit im zweiten Studienabschnitt

Betreuung

foto: Julian Braun

Zugehöriger Workspace

Datascapes mit Houdini

Entstehungszeitraum

Sommersemester 2019

Keywords