GLBasic Benutzerhandbuch

Main sections

08 Grafik(3D)

Allgemein



3D Grafik ist ein komplexes Thema. In GLBasic haben wir all unser Wissen in einfache zu verwendende Befehle gesteckt. Die Befehle unterscheiden sich in Einfachheit kaum von den 2D Befehlen, die hier als bekannt vorausgesetzt werden. Wer kein 2D Programm geschrieben hat, sollte sich mit 3D nicht bemühen. Man lernt ja auch erst laufen und dann tanzen.

GLBasic benutzt ein Rechte-Hand-System, bei dem Y immer positiv nach oben gerichtet ist. Alle 3D Befehle beginnen mit X_..., so dass sie in der Hilfe schnell gefunden werden können. Die 3D Befehle sind nur in der Ausbaustufe GLBasic 3D möglich.
Texturen werden immer in der Größe 2^n geladen und auch verwendet. Manche Modelle aus dem Internet haben andere Größen der Texturen mitgeliefert. Diese müssen dann gestreckt werden auf 64, 128, 256, 512 oder 1024 Pixel im Quadrat. Andernfalls wird das Objekt hässliche Texturfehler aufweisen.

Grundlegend ist GLBasic 3D folgendermaßen aufgebaut:

<B>Umschalten in 3D Modus:</B>
X_MAKE3D znahe, zfern

Dabei ist znahe und zfern der Bereich, in dessen Abstand zur Kamera sichtbare Objekte gezeichnet werden sollen. Die Werte 1 und 1000 liefern gute Ergebnisse. Größere Abstände (1, 32000) liefern u.U. hässliche Ergebnisse in der Tiefenprüfung beim Zeichnen.

<B>Kamera</B>
X_CAMERA x, y, z, px, py, pz

Setzt die Kamera an die Position x, y, z und richtet sie so aus, dass sie auf den Punkt px, py, pz zeigt. Oben ist dabei immer entlang der positiven Y-Achse.

<B>Licht</B>
X_AMBIENT_LT num, col

Schaltet ein ambientes (von allen Seiten gleichmäßig stark scheinendes) Licht ein. col gibt die Farbe des Lichtes an. (Siehe Befehl: RGB).
num ist dabei die Numer der Lichtquelle. Es können maximal 8 Lichtquellen (0-7) benutzt werden, da die Hardware nicht mehr unterstützt. Sind mehr Lichtquellen in einer Szene, empfiehlt es sich, die 8 nahestehendsten zu verwenden. In professionellen Programmen sind selten mehr als 2 Lichtquellen aktiv, da Lichter enorm viel Rechenzeit beanspruchen.
X_SPOT_LT num, col, x, y, z, dirx, diry, dirz, cutoff

Erstellt ein Spot-Licht an der Position x, y, z, das in die Richtung dirx, diry, dirz scheint. Der Öffnungswinkel der Blende wird bei cutoff angegeben. Das Licht wirft (auch wenn auf den ersten Blich etwas unlogisch) keinen Schatten! Es wird lediglich die Helligkeit des Lichtes anhand Poisition und Richtung zum Objekt beeinflusst.

<B>Transformation</B>
Kamera und Licht sind bereit. Jetzt fehlt noch das Wichtigste: Objekte.
X_MOVEMENT x, y, z
X_SCALING fx, fy, fz
X_ROTATION phi1, dx, dy, dz
X_ROTATION phi2, dx, dy, dz

X_MOVEMENT schiebt die aktuelle Zeichenposition auf die Koordinaten x, y, z. Der lokale Nullpunkt eines Objektes wird damit um diesen Betrag beim Zeichnen verschoben.
X_SCALING skaliert das Objekt entlang der lokalen Achsen.
X_ROTATION fügt dem Objekt eine Rotation um den Richtungvektor dx, dy, dz mit dem Winkel phi zu. Es können mehrere Rotationen hintereinander gemacht werden. X_MOVEMENT oder X_SCALING setzen alle aktuellen Rotationen wieder zurück. Sie müssen daher zuvor aufgerufen werden.

<B>Objekte</B>
Der einfachste Weg zu einem Objekt ist die Datei. Man erstellt mit einem 3D-Programm ein Objekt und exportiert es als Quake-MD2 Modell, oder als 3D Studio .3ds Objekt. Nun lädt man es in das 3DConvert-Tool und erhält ein komprimiertes .ddd Objekt, das man so laden kann:
X_LOADOBJ datei$, num

Es besteht auch die Möglichkeit, Objekte zur Laufzeit zu generieren. Dazu verwendet man folgende Befehle:
X_OBJSTART num
X_OBJADDVERTEX x1, y1, z1, tx1, ty1, col
X_OBJADDVERTEX x2, y2, z2, tx2, ty2, col
X_OBJADDVERTEX x3, y3, z3, tx3, ty3, col
X_ENDOBJ

num gibt dabei die Nummer des Objektes an. Unter dieser Nummer kann ein Objekt später gezeichnet werden. Bestehende Nummern können überschrieben werden.

X_OBJADDVERTEX fügt dem Objekt einen Vektor hinzu. tx, ty geben dabei die Textur-Koodinaten an. 0=links/oben, 1=rechts/unten.
Die ersten 3 Vektoren bilden ein Dreieck. Jeder weitere Vektor bildet mit den beiden zuletzt eingegebenen Vektoren ein Dreieck. Soll dies nicht geschehen, kann man den 'Stift absetzen' und wieder von neuem 3 Vektoren eingeben die dann ein Dreieck aufspannen und dann weitere Punkte hinzufügen mit dem Befehl:
X_OBJNEWGROUP


Die Lichtnormalenvektoren, die nötig sind damit der Grafikprozessor weiß, wo vorne und hinten bzw. wie hell ein Licht ein Dreieck beleuchtet, werden automatisch berechnet und an die Oberfläche des Objekts angeglichen. Diese Technik wäre sonst sehr aufwändig und spart bei GLBasic sehr viel Programmierarbeit.
Wenn man nur die Vorder- bzw. Rückseite eines Objekts zeichnen möchte, kann man den Befehl:
X_CULLMODE cmode#

verwenden.

Nun muss das geladene oder erstelte Objekt noch gezeichnet werden. Das geschieht mit:
X_DRAWOBJ num, stufe

Wobei stufe die Animationsstufe ist. Bei Benutzerdefinierten Objekten ist sie immer '0' - also die erste Stufe.
Animationen gibt man wieder mit:
X_DRAWANIM num, stufe, von, bis, interpol, volle_anim

von und bis geben die Stufen an, zwischen denen interpoliert werden soll. 'interpol' gibt den Fortschritt an (0 bis 1) und 'volle_anim' gibt an, ob die Zwischenstufen auch berücksichtigt werden sollen.

Um dem Objekt eine Textur zuzuweisen, die vorher mit LOADSPRITE geladen wurde, benutzt man den Befehl:
X_SETTEXTURE num, num_bump

Wenn num_bump ungleich -1, ist die Textur eine Bump-Mapping Normalen-Map und musste vorher mit LOADBUMPTEXTURE geladen werden.


<B>Beenden</B>
Im 3D Modus können keine 2D Befehle ausgeführt werden. Darum muss vorher in den 2D Modus umgeschaltet werden:
X_MAKE2D


<B>Spezialeffekte</B>
Die Spezieleffekte "Cel Shading", "Bump Mapping" und "Stencil Shadows" können über den Befehl X_SPOT_LT angesprochen werden.
Mit X_SPHEREMAPPING kann man Metallische Reflektionen programmieren.

See also...