Fur Rendering

Fur Rendering Simulieren von Realistischen Haaren auf 3D Modellen

Hier findet ihr das Ergebniss meines Softwarepraktikums das ich mit Andreas Ganser und Maximilian Möllers absolviert habe. Der Sourcecode steht unter der GPL und ist hier zu finden.

Erklärungen zur Thematik und Realisierung

Als erstes werde ich mal erklären was genau gemacht werden soll. Es soll ein 3D-Modell geladen werden und dann dynamisch mit einem Fell versehen werden. Ihr könnt euch das Vorstellen wie bei den Filmen IceAge oder MonsterAG. Allerdings haben wir natürlich nicht diese Rechenpauer und deswegen verfolgen wir einen ganz anderen Ansatz. Das Ergebnis ist also auch nicht mit dem Fell der Figuren in den Filmen zu vergleichen.

Das Konzept:

Das Konzept ist eigentlich recht einfach. Als erstes Zeichnen wir das einfach Modell und legen eine Textur über das Objeckt. Danach zeichnen wir in einem gewissen Abstand (“shrink-wert”) das ganze Objekt nochmal. Die erste Zeichnung liegt also in der Zweiten. Das geht dann immer so weiter je nach dem wieviele Schichten vom User verlangt wurden. Die einzelnen Schichten nennt man Layer. Jedes Layer wird mit einem anderen Alphawert gezeichnet. Die Layer werden also von unten nach oben immer transparenter. Wenn dann noch eine “gute” Textur gewählt wurde, dann entsteht der Eindruck das Modell hätte ein Fell.

Desweiteren sollten wir in das Programm einbauen das man die Haare schwingen lassen kann. Dieses haben wir auf zwei verschiedene Arten realisiert. Als erstes haben wir eine Vriante implementiert, die jedes Layer um einen betimmten shift-Vektor (für jedes Layer anders) versetzt zeichnet. Diesen shift-Vektor ändern wir dann mit einer bestimmten Funktion so, das der Eindruck entsteht das Fell würde sich bewegen. Bei der anderen Variante sollten die Haare sich bewegen wenn wir das Objekt drehen. Dies erreichen wir indem das Modell jedes mal ein bischen mehr drehen bevor wir ein Layer zeichnen. Also erstes Layer zeichnen dann das Model etwas weiter drehen, zweites layer zeichnen und wieder weiter drehen, drittes Layer zeichnen usw. Dadurch werden die “Haare” in eine Richtung weggebogen. Wie stark versetzt die Layer jeweils gezeichnet werden haben wir variabel gelassen. Das kann von dem User durch die Variablen “swing” und “swingTurn” beeinflußt werden.
Bild zur erklärung von den shrink- und swingwerten
Ein weiteres Problem das wir hatten was die Berechnung der Texturkoordinaten. Es sollten sich keine Muster auf dem Modell erkennen lassen, nur weil das Modell aus immer den gleichen Dreiecken besteht. Hierzu haben wir uns eine gnaz einfach Lösung einfallen lassen. Wir nehmen die längste Seite des zu zeichnen Dreiecks und setzten die zugehärigen Punkte A,B auf die Texturkoordinaten 0,0 und 0,(0+Länge der Seite). Jetzt muss noch die Texturkoordinate für den dritten Punkt C berechent werden. Dies wird gemacht indem wir virtuell zwei Kreise um die beiden Punkte A,B legen. Der Radius entspricht dem Abstand der Punkte A von C unde A von B. Dort wo sich die beiden Punkte schneiden liegt die Texturkoordinate von C. Dann wird noch jede Texturkoordinate um i*Primzal verschoben, damit auch immer ein anderer Ausschnitt der Textur genommen wird. i ist dabei eine Laufvariable.
Bild zur erklärung der Berechnung des dritten Punktes für die TexturKoordinaten
Weitere Informationen hierzu und zu der Bedienung des Programms findet ihr im Handbuch. Bei Fragen einfach eine Email an mich schicken, ich helfe gerne weiter.

Jetzt hier noch kurz ein paar Infos. Zum Laden der Modells benutzten wir OpenMesh. Es werden die Formate off, obj, stla, stl, stlb, stl und om unterstützt. Die Texturen können in den Formaten png, bmp, xbm, xpm und pnm geladen werden. Je nach dem wie QT installiert wurde können auch noch die Formate jpeg,mng und gif benutzt werden. Wir haben QT als Framework verwendet und zum kompilieren acgmake. OpenMesh und acgmake sind beides Projekte des Lehrstuhls für Informatik 8 der [http://www.rwth-aachen.de|Rwth-Aachen]. Beide Programme werden bei den Sourcen mit geliefert.

 
linuxfreax/fur_rendering.txt · Last modified: 2007/06/29 10:02 (external edit)
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki