© 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/

Documents pareils