Mittwoch, 8. Januar 2014

Der Große Tempel des Ilaisias: Evolution eines Sketchup-Modells 2008-2013 - Teil 2

Der folgende Text enthält einiges an Grafik-Fachjargon, wer sich nicht dafür interessiert, kann sich ja auch einfach nur die Bilder anschauen.

2013 – Unity und Sketchup: Perfekte Partner

Im Jahr 2010 war der Tempel durch das Hinzufügen des Innenraums für mich praktisch fertig. Abgesehen von kleineren Änderungen hier und da beließ ich es im Wesentlichen dabei und wandte mich anderen Projekten zu.
 
Erst, als sich mir vor etwa neun Monaten mit einem neuen, leistungsstarken PC sowie der großartigen Unity-Engine neue Möglichkeiten boten, unterzog ich den Tempel wieder mal einer Generalüberholung. Das war auch dringend nötig, denn erst durch den Export in die Unity Engine wurden mir teilweise gravierende Mängel des Modells bewusst. Es ist ein Segen und ein Fluch zugleich, dass Sketchup so leicht zu erlernen ist. Es handelt sich ohne Zweifel um ein großartiges und enorm vielseitiges Programm, insbesondere, da es durch zahllose großartige Plugins nahezu beliebig erweiterbar ist, doch in mindestens einem Punkt macht es den Einstieg vielleicht etwas zu leicht und so gewöhnt man sich Dinge an, die sich später noch rächen, wenn man die Modelle außerhalb von Sketchup nutzen will. Dies betrifft vor allem die Art, wie Sketchup Polygone behandelt. In der Regel stellen 3D-Grafikprogramme Polygone als eine Ansammlung von Punkten (Vertices) zusammen, die durch Linien verbunden sind, zwischen denen sich Flächen aufspannen. Diese Flächen sind dann wiederum eingeteilt in Dreiecke, quasi die kleinste Flächeneinheit eines 3D-Modells. In Sketchup ist ein Polygon lediglich eine von Linien umrahmte Fläche. Diese kann beliebig komplex sein, ein Drei- oder Viereck wird nicht anders dargestellt als eine komplex umrandete Fläche, die beispielsweise mit dem Freihandwerkzeug erstellt wurde. Die Vertices, die durch die Linien verbunden werden, bekommt man in der Regel überhaupt nicht zu sehen. So nimmt man ein wie auch immer aussehendes Polygon in Sketchup immer nur als eine einzelne Fläche wahr, die in Wahrheit viel komplexer ist als es scheint. So kann eine Form dann nach dem Export in Unity (wofür ich das geniale – und kostenlose – Plugin PlayUp Tools benutze) auf einmal aus vielen Dreiecken bestehen, die vorher schlichtweg unsichtbar waren. Wirklich problematisch wird es allerdings, wenn unterbrochene Kanten im Spiel sind. Für Sketchup selbst ist das kein Problem: Eine Linie kann ohne Probleme direkt an eine Kante gezeichnet werden ohne, dass sich augenscheinlich etwas ändert. Für die Fläche, an die diese Kante anschließt, bedeutet das aber, dass es ein Vertex mehr gibt, und folgerichtig ein Dreieck mehr, in das die Form aufgeteilt werden muss, was gleichzeitig auch mehr Rechenaufwand für den Computer bedeutet. Und so kann ein durchschnittliches Sketchup-Modell zahlreiche "versteckte" Dreiecke besitzen, die vermeidbar gewesen wären. Ein Mammutprojekt wie mein Tempel des Ilaisias enthält davon natürlich noch bedeutend mehr. Und so war es zunächst einmal notwendig, das gesamte Modell von oben nach unten nach unterbrochenen Linien abzusuchen und diese zu reparieren. Oftmals war dies nur möglich, in dem ich einander überschneidende Linien in separaten Objekten und Komponenten unterbrachte, so dass die Kanten nicht mehr unterbrochen wurden.
Gesamtansicht in der Unity Engine
Zudem wäre der Tempel als Gesamtobjekt viel zu komplex gewesen, um als Ganzes nach Unity exportiert zu werden. Playup Tools verfügt jedoch über die äußerst nützliche Funktion, aus Sketchup ein komplettes Level zu exportieren, das aus beliebig vielen Objekten bestehen kann, die einzeln nach Unity exportiert und dort wieder zusammengesetzt werden.  Jedoch werden nur Objekte, die sich praktisch auf der allerobersten Konstruktionsebene befinden separat berücksichtigt, so dass gruppierte Komponenten wie beispielsweise die Türme, die ihrerseits wieder aus mehreren Komponenten bestehen, immer noch nur als ein einzelnes Objekt exportiert werden, was je nach Komplexität die maximale Vertex-Anzahl eines Einzelobjekts in Unity überschreiten kann. Daher wurde es nötig, alle ineinander verschachtelten Komponenten und Gruppen, die ich separat exportieren wollte, auf die oberste Ebene zu verlagern. Sketchups Gruppierungs- und Komponentenfunktionen sind enorm nützlich, um ein Modell zu strukturieren, jedoch kommen andere Programme damit wiederum nur eingeschränkt klar. So entschied ich, wenigstens den Innenraum und das Äußere des Gesamtmodells voneinander zu trennen und sie einzeln zu exportieren. Zuvor waren sie lediglich durch verschiedene Komponenteninstanzen voneinander abgegrenzt.
Neu gestaltete Front

Ungeahnte Möglichkeiten dank Unity

Dies waren alles notwendige Anpassungen, die zwar eine Menge Aufwand bedeuteten und viel Zeit kosteten, jedoch mit lohnendem Ergebnis. So bot mir die Unity-Engine endlich all die Funktionen, die mir bei Sketchup immer gefehlt hatten, insbesondere Beleuchtungs- und Textureffekte. Zuerst begann ich damit, die kompletten Texturen des Tempels zu überarbeiten, und, wo sinnvoll, mit Effekten wie Spekularität oder Normal Mapping zu versehen. Endlich konnten die Dächer in dem goldenen Glanz erstrahlen, den ich mir immer vorgestellt hatte, ebenso bekamen die Mauern mehr Struktur und der große Kristall in der Mitte glaubwürdige Reflexionen. Außerdem nutzte ich die Gelegenheit (und die mir nun zur Verfügung stehenden Systemressourcen), um noch weitere Details  zu verbessern und zu korrigieren. Die komplette Frontseite wurde neu gestaltet, die Treppen innen und außen haben richtige, dreidimensionale Stufen und sind nicht mehr nur durch Texturen angedeutet. Die Türen innen an den Türmen wurden ebenfalls komplett neu gestaltet und mit einer dreidimensionalen Struktur versehen, die Ketten, an denen der Kristall hängt, haben nun richtige 3D-Glieder mit Glanzeffekt, während sie vorher nur aus flachen, ineinander verdrehten Bitmaps bestanden. Außerdem erlaubten mir neue Plugins wie ThruPaint und SketchUV (leider nicht kostenlos, aber die 5 Dollar mehr als wert), das UV-Mapping, also das Layout der Texturen auf den einzelnen Flächen, drastisch zu verbessern. An den Kuppeln beispielsweise konnten durch das in SketchUV verfügbare Spherical Mapping, wobei eine Textur abhängig vom Blickwinkel kugelförmig projiziert wird, die vorher sichtbaren Texturnähte praktisch vollständig entfernt werden, ebenso leistete der Quadface-Modus von Thrupaint, bei dem die Texturen an den Kanten viereckiger Polygone (Quads) ausgerichtet werden, an vielen Stellen gute Dienste. Insgesamt konnte ich also den Detailgrad und den Realismus nochmals deutlich erhöhen.
Die Kuppeln und Dächer erstrahlen dank Normal Maps erstmals in goldenem Glanz
Viele neue Details und verbesserte Texturen im Innenraum
Am Ende herausgekommen ist nun ein extrem komplexes Modell, das komplett mit Innen- und Außenbereich im Sketchup-Format ganze 27 Megabyte belegt. Als ich versucht habe, es nach Sketchfab hochzuladen, einer Website zum Veröffentlichen und direktem Anzeigen im Browser von 3D-Modellen,  wurde mir jedoch die ganze Komplexität erst richtig bewusst. Da Sketchup wie zuvor erwähnt nicht die Anzahl der Triangles, der kleinsten Flächeneinheit der 3D-Grafik, anzeigt, sondern die der Polygone, egal wie viele Kanten sie haben, ist die Zahl der Faces im Statistikfenster wenig aussagekräftig für die tatsächliche Komplexität des Modells. Mit über 330.000 hat diese aber auch ein für Sketchup bereits sehr hohes Niveau erreicht. Sketchfab präsentierte mir nun aber die tatsächliche Anzahl der Triangles: Unglaubliche 743.000 wurden mir da vorgezählt, was für ein in Echtzeit gerendertes 3D-Objekt extrem viel ist und sich im Browser so gar nicht gut darstellen lässt. Unity hat mit der Komplexität bisher keine Probleme, allerdings könnte sich das rasch ändern, sobald noch mehr Objekte in der Umgebung hinzukommen, auch wenn ich bereits eine Möglichkeit gefunden habe, Objekte, die weiter als eine bestimmte Strecke von der Kamera entfernt sind, ausblenden zu lassen. Das ist für den Innenraum, der ja ohnehin nur sichtbar ist, wenn man sich darin befindet, sehr praktisch, zumal dieser der weitaus komplexere Teil des Modells ist. Hauptschuldige für die Hohe Zahl an Triangles dürften wohl die Fenster und die goldenen Kettenglieder sein. Bei Gelegenheit muss ich das mal genauer untersuchen und herausfinden, ob ich noch ein paar Polygone einsparen kann. Möglich jedenfalls, dass ich in Zukunft beim Detailgrad wieder etwas zurückrudern muss, um das Ganze in Unity flüssig genug darstellen zu können. Für die Zukunft plane ich dann aber auch die Verwendung von Level-of-Detail-Objekten, die als wesentlich simplere Objekte dargestellt werden, wenn sie sich weiter weg von der Kamera befinden. Das ist zwar in der kostenlosen Unity-Version nicht integriert, kann aber durch Erweiterungen umgesetzt werden.
Blick unter die Kuppel
Neue Details im Innenraum

Noch lange nicht fertig...

Meine weiteren Pläne den Tempel betreffend sehen vor, den Innenraum mit noch mehr Details zu versehen, wie beispielsweise mit den auf den Bildern sichtbaren Kerzenständern, und im Zuge dessen auch die Beleuchtung zu verbessern. Da Unity die Möglichkeit bietet, Lichtquellen zu verwenden, habe ich dies auf jeden Fall auch vor. Problematisch ist momentan noch, dass sich der Innenraum im selben Worldspace befindet wie der Außenbereich, und somit auch von der als Sonne fungierenden Lichtquelle beeinflusst wird, was vor allem insofern unpraktisch ist, dass die kostenlsose Unity-Version keine Echtzeitschatten erlaubt und somit der Innenraum gleichmäßig hell bleibt wie der Außenbereich Weitere Lichtquellen sind also erst mal kontraproduktiv, da alles dadurch nur noch heller wird. Ob sich das schließlich etwa durch Lightmaps lösen lässt, wird sich noch zeigen.
Goldene 3D-Kettenglieder
Reflexionen

Ein weiterer Aspekt, mit dem ich mich momentan noch befasse, ist die Kollisionsabfrage. Da ich den Tempel und die geplante umliegende Stadt gerne aus der Ego-Perspektive erkundbar machen möchte, muss Unity wissen, dass Objekte nicht durchlässig, sondern solide sind und der Betrachter nicht etwa durch Wände oder Säulen hindurch laufen kann. Unity kann für importierte Objekte automatisch Kollisionsmeshes erstellen, die dann identisch mit dem eigentlichen 3D-Modell sind. Je nach Komplexität des Modells kostet das dann aber einiges an Systemressourcen, die sich einsparen lassen können, wenn man ein simpleres Kollisionsmesh verwendet. Insbesondere bei den Fenstern ist es völlig unnötig, diese in ihrer vollen Komplexität als Kollisionsmeshes zu verwenden, dort sind einfache Flächen viel sinnvoller. Im Grunde kann ich eine stark simplifizierte Version des ganzen Tempels erstellen und dann in Unity als Kollisionsmesh an das Gesamtobjekt anfügen. Dieses Objekt wird dann zwar nicht sichtbar dargestellt, aber als Grundlage für die Kollisionsberechnung verwendet. Auch das ist nochmal ein zusätzlicher Arbeitsschritt, aber er lohnt sich auch.


Zu viele Baustellen

Abgesehen davon will ich den Tempel nun auch so langsam mal wieder soweit als abgeschlossen betrachten und mich den umliegenden Gebäuden zuwenden. Der Plan für die Stadt, die ich zu basteln versuche, sieht vor, dass sich auf dem bereits zu sehenden Felsen nicht bloß der Tempel, sondern auch das Senatsgebäude sowie der Kaiserpalast des Reiches Argosia befinden, dessen Hauptstadt Nariva das Ganze ja irgendwann mal darstellen soll. Diese Gebäude sind zudem angeordnet um einen großen Platz herum. Während ich das Senatsgebäude bereits vor längerer Zeit in Sketchup erstellt habe, jedoch dessen Konvertierung für Unity noch nicht sehr weit fortgeschritten ist, habe ich begonnen, den Platz wieder ganz neu zu gestalten, ebenso wie die festungsähnliche Struktur, die als Aufstieg von der niedrigeren Umgebung zum Gipfel des Felsens dient. Damit bin ich auch noch nicht besonders weit, aber in nächster Zeit möchte ich da wieder größere Fortschritte machen. Mit dem Kaiserpalast wiederum schlage ich mich bereits eine ganze Weile herum. Während sich die Form und später sogar der Innenraum des Tempel wie gesagt beinahe von selbst entwarf, versuche ich schon seit längerem, ein Design für den Palast zu finden, das mir zusagt und auch meinen Vorstellungen der Architektur entspricht. Ich hoffe, da auch bald mal eine Richtung zu finden, mit der ich zufrieden bin und die ich dann auch konsequent gebastelt bekomme. Außerdem sind für beide Gebäude zumindest teilweise Innenräume geplant (hier habe ich bereits erste Entwürfe für den Thronsaal begonnen). Was die umliegenden Stadtgebiete angeht, diese sollen nach und nach auch folgen, und dafür existieren auch bereits Modelle einzelner Häuser, wobei ich selbstverständlich nicht beabsichtige, jedes Haus einzeln zu basteln, sondern eine Reihe von Standardhäusern geschickt zu kombinieren versuche, um einerseits eine gewisse Einheitlichkeit, aber andererseits dennoch genügend Abwechslung zu erhalten, um dem ganzen ein organisches Gefühl zu verleihen. Mit einer neuen, modularen Version der Stadtmauer habe ich ebenfalls bereits begonnen. Wie immer ist mein größtes Problem, dass ich buchstäblich zu viele Baustellen gleichzeitig habe, und daher jede einzelne unter Umständen sehr lange braucht, um fertig oder auch nur vorzeigbar zu werden. Aber ich werde versuchen, in diesem Blog die Entwicklungen laufend zu dokumentieren. In der Zwischenzeit werde ich aber nach und nach auch noch weitere, schon ältere und abgeschlossene, oder auch frisch überarbeitete Projekte vorzustellen, ebenso wie Texte zu anderen Themen.

Ein Downloadlink für das komplette Sketchup-Modell folgt noch in den nächsten Tagen.

Kommentare:

  1. Sehr schick, sehr schick! Dass muss ich dir einfach immer wieder sagen und ich bin immer auf weitere Renderbilder von dir gespannt!

    AntwortenLöschen
    Antworten
    1. Das sind ja so gesehen keine Renderbilder, sondern in Echtzeit berechnete Screenshots aus der Unity-Engine. Genau in dieser Qualität kann man also in dem Modell frei herumlaufen. Vielleicht werde ich daraus auch mal eine tatsächliche "spielbare" Version veröffentlichen.

      Löschen