Den Game Maker benutzen
Polygone zeichnen in 3D
Das Problem der "alten" Methode zu zeichnen liegt darin, dass das Sprite oder Polygon immer in einer xy-Ebene liegt, d. h. alle Ecken haben die selbe depth. Für echten 3D muss man in der Lage sein, Punkte mit verschiedenen depths zu haben, deshalb werden wir von nun an von z-Koordinaten sprechen anstatt von depths. Für oben genanntes Problem gibt es einige spezial Versionen der erweiterten Zeichenfunktionen:d3d_primitive_begin(kind) Beginn einer 3D Primitive folgender Art: pr_pointlist, pr_linelist, pr_linestrip,pr_trianglelist,pr_trianglestrip oder pr_trianglefan.
d3d_vertex(x, y, z) Füge einen Vertex (x, y, z) zum Primitive hinzu und benutze die voreingestellten Farb- und Alpha-Werte.
d3d_vertex_color(x, y, z, col, alpha) Füge einen Vertex (x, y, z) zum Primitive hinzu mit seinen eigenen Farb- und Alpha-Werten. Dies erlaubt Primitives zu erstellen, der Farbe und Alpha sich sanft verändern.
d3d_primitive_end() Beende die Beschreibung des Primitives. Diese Funktion zeichnet es auch.
Z. B. um einen Tetraeder zu zeichnen (dreiseitige Pyramide), die auf der z = 0 Ebene steht und mit der Spitze bei z = 200, kann man folgenden Code benutzen:
{
d3d_primitive_begin(pr_trianglelist);
d3d_vertex(100,100,0);
d3d_vertex(100,200,0);
d3d_vertex(150,150,200);
d3d_vertex(100,200,0);
d3d_vertex(200,200,0);
d3d_vertex(150,150,200);
d3d_vertex(200,200,0);
d3d_vertex(100,100,0);
d3d_vertex(150,150,200);
d3d_vertex(100,100,0);
d3d_vertex(100,200,0);
d3d_vertex(200,200,0);
d3d_primitive_end();
}
Wenn du das nun benutzen würdest, würdest du nichts weiter sehen, als ein Dreieck, weil die Spitze des Tetraeders vom Sichtpunkt aus hinter ihm sein wird. Außerdem ist es schwer, verschiedene Dreiecke zu sehen, wenn man dieselbe Farbe benutzt. Später werden wir Möglichkeiten kennen lernen, um den Sichtpunkt zu verändern. Farben zuzuweisen ist mit der Funktion draw_set_color(col) zwischen den Vertizen möglich. Man kann auch texturierte Polygone in 3D zeichnen. Es funktioniert genauso wie es im "Erweiterte Zeichenfunktionen" der Dokumentation beschrieben ist. Aber dieses Mal braucht man 3D Varianten der Grundfunktionen. Eines musst du bedenken: In einer Textur ist die Position (0,0) in der Linken oberen Ecke, aber oft, wenn Projektionen verwendet werden, die untere linke Ecke ist (0,0). In einem solchen Fall könntest du die Textur Vertikal spiegeln.
d3d_primitive_begin_texture(kind, texid) Beginne einen 3D Primitive der angegebenen Art und mit der angegebenen Textur.
d3d_vertex_texture(x, y, z, xtex, ytex) Füge einen Vertex (x, y, z), mit den Textur Koordinaten xtex & ytex, zum Primitive hinzu mit der eingestellten Farbe und Alpha geblendet.
d3d_vertex_texture_color(x, y, z, xtex, ytex, col, alpha) Füge einen Vertex (x, y, z), mit den Textur Koordinaten xtex & ytex, zum Primitive hinzu mit der angegebenen Farbe und Alpha geblendet.
d3d_primitive_end() Beende die Beschreibung des Primitives. Diese Funktion zeichnet ihn auch.
Z.B. kann man folgenden Code benutzen, um einen Hintergrund zu zeichnen , der in der Entfernung verschwindet:
{
var ttt;
ttt = background_get_texture(back);
d3d_primitive_begin_texture(pr_trianglefan,ttt);
d3d_vertex_texture(0,480,0,0,0);
d3d_vertex_texture(640,480,0,1,0);
d3d_vertex_texture(640,480,1000,1,1);
d3d_vertex_texture(0,480,1000,0,1);
d3d_primitive_end();
}
Ein Dreieck hat eine Vorder- und Rückseite. Die Vorderseite ist als die Seite definiert, auf der die Vertices im Gegenuhrzeigersinn definiert wurden. Normalerweise wird Vorder- und Rückseite gezeichnet, Wenn man aber eine Geschlossene Forma hat, ist es Verschwendung von Rechenzeit, weil die inneren Seiten der Dreiecke nie zu sehen sein werden. In diesem Fall kannst du Backface Culling aktivieren. Das spart ca. 50% Rechenzeit, weil nur die Vorderseiten gezeichnet werden, jedoch musst du die Dreiecke richtig definieren. Folgende Funktion existiert:
d3d_set_culling(cull) Gibt an BFC zu starten (true) , oder zu deaktivieren (false).
Alternative Versionen
Auch verfügbar in:
Download helpfile