© Alexander Altmayer Anleitung zur Modellierung und
Transcription
© Alexander Altmayer Anleitung zur Modellierung und
© Alexander Altmayer Anleitung zur Modellierung und Programmierung im Projekt o27inSpace 1. Modellierung (in 3D-Studio Max) Koordinatensystem: Vorweg das Wichtigste: 3D-Studio Max verwendet ein anderes Koordinatensystem als OpenGL bzw. o27inSpace. Die x- und yAchsen sind hier vertauscht. Das bedeutet, dass man in 3D-Studio Max am besten schon im OpenGL-Koordinatensystem modelliert! Hierzu muss man nur die Ansicht um 90° um die x-Achse drehen und dann anfangen zu modellieren. Alternativ dazu genügt es, nach der Modellierung Objekte um 90° an der x-Achse zu drehen und dann zu speichern/exportieren. Nachträgliche Änderungen beim Import oder im Quellcode sind zwar möglich, aber oft sehr fehleranfällig - v.a. bei nächträglicher Änderung der Objektrotation, da die Reihenfolge der Rotationen (welche Achse zuerst) bedeutend ist. Auch bei der Animation können dann häufig unerwünschte Effekte auftreten. Format: Grundsätzlich sollte das 3DS-Format verwendet werden, da der Import alle wichtigsten Funktionen inkl. Animation unterstützt und zudem wenig Speicherplatz benötigt. Der Vorteil beim ASCII-lesbaren ASEFormats liegt in der Speicherung der Normalen und der besseren Einsicht in die Dateien und das Format selbst. Um sich einen Überblick oder Einstieg über die Speicherung von 3D-Daten zu verschaffen, ist das ASE-Format recht praktisch. Offiziell sollte es aber nicht mehr verwendet werden. Tutorial: Das Tutorial von 3D-Studio Max ist recht gut. Zumindest die Grundlagen kann und sollte man hier recht gut üben. Allerdings sollte man auf jeden Fall auch eine erfahrene Person zu Rate ziehen, da es z.B. manchmal vorkommen kann, dass irgend ein Schalter (nicht) gesetzt ist und dadurch etwas nicht funktioniert, obwohl man sich an die TutorialAnweisung hält. Modellierung allgemein: Wenn möglich und sinnvoll beschafft man sich vom zu modellierenden Objekt Fotos von verschiedenen Perspektiven (vorne/hinten/Seite/oben). Die Fotos kann man dann leicht als Schablone verwenden, indem man sie als Textur auf eine Ebene legt (Hinweis: wenn Teile des Fotos / der Vorlage im endgültigen Objekt auftauchen – z.B. als Textur für das nachmodellierte Objekt - muß darauf geachtet werden, daß das Foto selber frei von Urheberrechten ist!!! D.h. einfach Bilder von beliebigen Webseiten ohne Zustimmung des Autors zu nehmen ist nicht zulässig!!!). Es ist zwar möglich, aber noch nicht ganz sinnvoll, mehrere Objekte bzw. eine Gruppenhierarchie von Objekten in einer Szene nach 3DS zu exportieren. Der Import baut zwar die Hierarchie nach, aber da Plurix kein Dateisystem verwendet, können Verweise auf Texturen nicht automatisch verarbeitet werden. Das bedeutet, dass man für jedes Unterobjekt die Textur im Quelltext per Hand setzen müsste - sehr umständlich und mühsam. Im Abschnitt 2 (Einbindung der Objekte...) wird erklärt, wie man Unterobjekten die Texturen einzeln zuweist, aber das ist wie gesagt ein wenig umständlich. Stattdessen geht man folgendermassen vor: Man verwendet für alle Unterobjekte dieselbe Textur. Hat man für ein Gesamtobjekt mehrere Texturen, so fügt man diese zuvor mittels eines Zeichenprogramms aneinander. Am Ende fügt man alle Unterobjekte zusammen, indem man sie zuerst in ein Mesh umwandelt (Rechtsklick auf Objekt -> Convert To: -> Convert To Editable Mesh) und dann bei einem Objekt auf der Modify-Seite den Edit Geometry-Eintrag aufklappt und auf AttachList klickt. Im Dialog dann alle Unterobjekte anwählen und auf Attach gehen. Was noch nicht ganz umgesetzt wurde, ist die Verwendung von einheitlichen Maßeinheiten. Man muß sich im Klaren sein, wie groß ein Objekt im Verhältnis zur Umgebung ist und wie eine Einheit in der virtuellen Welt in Metern/Zentimetern umgerechnet wird - je früher, desto besser. Explizite Nachskalierungen des Objekts sind dann hinfällig (als Faustregel: 1 Einheit im Modellierungsprogramm entspricht 1m in Realität). Auch im Hinblick auf die Physik kann dann ein für alle mal festgelegt werden, um wieviel Einheiten pro Sekunde sich ein Objekt bewegt (dadurch bewegt sich dann z.B. ein Objekt auch nicht mehr plötzlich schneller). Eine Beispielmodellierung: Anhand der Modellierung eines Tisches Modelliervorgang veranschaulicht werden: soll ein typischer 1. Tischbeine: Eine Box mit gewünschten Ausmassen erstellen 2. Die Box in einen Editable Mesh wie oben beschrieben umwandeln 3. Nun soll sich das Tischbein nach unten hin etwas verjüngen. Deswegen auf der Modify-Seite Polygon auswählen und die obere Seite des Tischbeins anwählen. Mit dem Skalierungstool zieht man dann die obere Fläche auseinander. Damit das Bein nicht gar so seltsam aussieht, verlängern wir nun den oberen Teil des Beines. Dazu in der Modify-Seite Edit Geometry ausklappen und Extrude anwählen (das Polygon auf der oberen Seite muss noch ausgewählt sein). Mit der Maus auf die Pfeilknöpfe gehen, gedrückt halten und das Bein etwas nach oben ziehen. Tipp: Zur Abwahl einer Selektion nochmal auf diese drücken (in diesem Fall Polygon), damit man wieder andere Objekte anwählen kann. 4. Tischplatte: Eine Box mit entsprechenden Ausmassen erstellen, richtig drehen und so nahe wie möglich auf das Tischbein legen (diese auch gleich in Mesh umwandeln). 5. Texturen: a) Wenn nötig die aktuelle Auswahl löschen, damit nicht nur ein Teil angewählt ist und das gesamte Objekt anwählen. 'M' drücken. Im Materialdialog ein Material auswählen. Bei Blinn Basic Parameters den Knopf neben Diffuse drücken und danach im Material/Map Browser Doppelklick auf Bitmap. Eine Textur-Datei auswählen. Zurück im Material-Editor auf Assign Material to Selection und Show Material in Viewport. Das Material auch dem zweiten Objekt zuweisen. b) Ein Objekt auswählen und auf der Modify-Seite in der Modify List 'Unwrap UVW' auswählen. Anmerkung: Bei komplexen Objekten (und das ist der Tisch schon!) ist es meistens unmöglich mit einer einfachen Wrapper-Funktion die Textur automatisch passend um das Objekt zu legen. Hier ist also Handarbeit gefragt. Unter der Modify List dann Unwrap UVW ausklappen und Select Face anwählen. Eine Seite des Objekts anwählen und danach Parameters ausklappen (Tipp: manchmal kann man mehrere Faces auf einer Seite des Objektes gleichzeitig anwählen. So kann man Übergänge von einem Face auf das nächste exakt modellieren). Auf Edit drücken. Nun will man ja nur die Texturkoordinaten der angewählten Seite ändern, weswegen man mit Filter Selected Faces im aktuellen Edit UVWs-Dialog den Rest ausblendet. Falls hier die ausgewählte Textur nicht zu sehen ist, so liegt dies möglicherweise an folgender Einstellung: Im Edit UVWs-Menü auf Options -> Advanced Options gehen. Dort schaltet man die Option Affect Center Tile aus. Um die Texturkoordinaten richtig positionieren zu können, muss häufig die Achse eingestellt werden, an der das Face für das Texturmapping ausgerichtet werden soll. Während der Edit UVWs-Dialog noch geöffnet ist, bei Parameters -> Subobject Parameters eine Achse auswählen und Planar Map anklicken. Wenn man nicht gleich auf die richtige Achse kommt, einfach ausprobieren und im Manual nochmal nachschauen. Die Eckpunkte des/der Faces dann so hinziehen bis es in etwa passt. Das ganze macht man für alle Seiten aller Objekte. Am Ende das Objekt wieder in einen Mesh konvertieren, damit man weiterarbeiten kann. 6. Tischbeine kopieren (CTRL-V) und die Kopien an die Ecken schieben. Am Ende alle Objekte mittels Attach List wie oben beschrieben zusammenfügen. Der Weld-Operator verschmilzt Nahtstellen (Näheres dazu im Manual). Dies ist zwar nicht der schönste Tisch, aber man hat schon einiges zur Modellierung dazugelernt. 2. Einbindung der Objekte in Plurix / o27inSpace Alle Modell- und Texturdateien müssen zunächst umbenannt werden. Alle Erweiterungen werden ersetzt durch .pjc (Plurix Java Compiled). Als Namenskonvention wird die Art der Datei, der Name und die ursprüngliche Dateinamenerweiterung jeweils getrennt durch einen Unterstrich verwendet (bspw. „Obj3D_Tisch_3ds.pjc”, „Tex2D_Gras_jpg.pjc”, „Font_Courier8_bdf.pjc”). Die Einbindung der Objekte erfolgt in der Klasse WorldBuilder. Zunächst werden die Modelldaten via ASE oder 3DS-Filter importiert. Die ASE-Methode benötigt als Übergabeparameter nur die zu importierende Datei. Der Name, unter dem man das Objekt im Plurix Namensdienst wieder findet, extrahiert der ASE-Filter automatisch aus dem Szenenamen von 3D-Studio Max (zur Not in der ASE-Datei selbst ändern). Beim 3DS-Filter ist der zweite Parameter ein Namensstring, unter dem das Objekt eingetragen wird. Mit Hilfe der Namensdienstklasse NameSvc holt man sich das NamedObj entsprechend dem angegebenen Stringnamen aus dem angegebenen Verzeichnis in eine Variable z.B. „no” und erstellt ein neues Gruppenobjekt oder Avatar mittels des Konstruktors und des Objekts, das in no.obj steckt. Danach folgen die Transformationsanpassungen. Transformationen werden (auch in der Darstellung) in der folgenden Reihenfolge ausgeführt: 1. Skalierung 2. Rotation um x-Achse, dann um y-Achse, dann um z-Achse 3. Translation Die Transformationen wirken sich auf die untergeordneten Knoten in der Hierarchie aus. Die Texturdateien müssen in der Breite und Höhe Zweierpotenzen aufweisen, um Grafikfehler zu vermeiden. Die Textur selbst wird dann mit dem Aufruf JPEG.convert(String Texturname, byte[] Texturfile) erstellt und wird über die Shapevariable „tex0” (..„tex2”) mit dem zugehörigen Objekt verknüpft. Über Group.scaleTexCoord(char c, float f) kann man eine Kachelung einstellen. Der erste Parameter gibt die Achse an ('u' oder 'v'), der zweite die Kachelungsskalierung. Falls man denn mal ein Objekt aus mehreren Unterobjekten und Texturen zusammenbaut, dann muss man (noch) jedem Unterobjekt einzeln die Textur zuweisen. Um ein bestimmtes Unterobjekt mit einem bestimmten Namen zu suchen, verwendet man Group.getSubobjectByName(String name). 3. Animation Über den 3DS-Import können Animationsinformationen aus 3D-Studio Max übernommen werden. Einbindung der Animation: Voraussetzung für eine Animation ist, dass das Objekt ein Avatar ist. Die Animation wird mittels 3DS-Import im Objekt gespeichert. Die Steuerung der Animation geschieht im obersten Objekt der Hierachie, welches eine AvatarControlTA sowie ein AIInterface enthält. Bei der Animation werden dann alle Unterobjekte und das oberste Objekt selbst durchlaufen und nach einer Animation durchsucht. Ist diese vorhanden, so wird sie über AIInterface.ProcessAction2Transformation ausgeführt. Vorsicht: Wenn ein Avatar die Kontrolle startet bevor er in einem Container ist, gibt es einen Crash. Also erst mal Avatar in irgendeinen Container stecken. Die Kontrolle eines Avatars wird über die Methode Avatar.StartAIControl(int points) eingeleitet. Die points geben an, welche vordefinierte Animation (in der Klasse Animation definiert) gestartet werden soll. Eine -1 als Parameter legt eine neue Animation an. Um die gespeicherte 3D-Studio Max-Animation zu verwenden, weist man dem AIInterface des Avatars eine neue Animation zu. Die Kontrollpunkte werden der Animation des Avatars entnommen (erster Parameter), die Anzahl gibt man ebenfalls an (zweiter Parameter). Die Anzahl kann nicht der Länge des Kontrollpunkt-Arrays entnommen werden, da 3D-Studio Max leider zuviel Kontrollpunkte angibt: auch wenn nach dem letzten Frame keine Änderungen mehr stattfinden, gibt 3D-Studio Max immer 100 an und nicht den tatsächlich letzten KeyFrame. Deshalb wird im 3DS-Import auch als Anzahl (Animation.n_s) das endFrame gespeichert, welche man dann ebenfalls als Anzahl der Kontrollpunkte übernehmen sollte. Anmerkung: die KeyFrames werden im 3DS-Import interpoliert, um sanftere (und langsamere) Animationen zu erzeugen. Um eine Animation dann laufen zu lassen, ruft man noch AIInterface.startAnimation(Group gr) auf. Der Parameter sollte dabei der Avatar sein, in dem auch die Kontrollinstanz steckt. Derzeit werden alle Animationen als Splines ausgeführt, also als Kurve. Die Transformationsdaten aus den Keyframes werden also automatisch als Splines behandelt, auch wenn dies nicht explizit angegeben wurde. Für einen Spline müssen mindestestens vier Kontrollpunkte vorhanden sein, damit die Animation ausgeführt wird (also bei der Modellierung darauf achten). Es ist aber angedacht, sobald wie möglich zunächst auf lineare Animation umzusteigen. In 3D-Studio Max kann man Animationen auch einen Path Constraint zuweisen. Dadurch läuft ein Objekt z.B. an einer Linie oder einer Kurve entlang. Ersten Tests nach zu urteilen wird im 3DS-Format der Path Constraint als eigenes Objekt gespeichert. Hier wäre für die Zukunft zu überprüfen, wie genau gespeichert wird, ob der Path Constraint eine Kurve oder eine Linie ist, und wie man dann dies wieder dementsprechend beim Importieren umsetzt. 4. Links Texturen: http://www.3dcafe.com/asp/freestuff.asp http://www.imageafter.com/ Modellierung: Anime Charakter (für Profis): http://www.comet-cartoons.com/toons/3ddocs/bodymodeling/