Nederlandse Game Maker Community

Werken met Game Maker => Beginners => Topic gestart door: Ceymoonie op 1 Juni 2019, 23:21:27



Titel: [Opgelost] Kubus vullen.
Bericht door: Ceymoonie op 1 Juni 2019, 23:21:27
(Dit topic ging eerst over iets anders, maar dat was snel na het plaatsen opgelost.)

Met behulp van dit (https://en.wikipedia.org/wiki/3D_projection) Wikipedia artikel heb ik een simpele 3D projectie van een kubus gemaakt:

GML:
/// create

for (i = 0; i < 10; i++) {
    node[i] = instance_create(0, 0, obj_node); // obj_node is leeg naast het draw event
    node[i].number = i;
}

for (i = 0; i < 3; i++) {
    for (ii = 0; i < 3; i++) {
        xRotationMatrix[i, ii] = 0;
        yRotationMatrix[i, ii] = 0;
        zRotationMatrix[i, ii] = 0;
    }
}

GML:
/// draw event

matrix_update();

projection(node[0], x - 32, y - 32, 0);
projection(node[1], x + 32, y - 32, 0);
projection(node[2], x + 32, y + 32, 0);
projection(node[3], x - 32, y + 32, 0);
projection(node[4], x - 32, y - 32, 64);
projection(node[5], x + 32, y - 32, 64);
projection(node[6], x + 32, y + 32, 64);
projection(node[7], x - 32, y + 32, 64);

GML:
/// matrix_update();

xRotationMatrix[0, 0] = 1;
xRotationMatrix[0, 1] = 0;
xRotationMatrix[0, 2] = 0;
xRotationMatrix[1, 0] = 0;
xRotationMatrix[1, 1] = cos(rotX);
xRotationMatrix[1, 2] = -sin(rotX);
xRotationMatrix[2, 0] = 0;
xRotationMatrix[2, 1] = sin(rotX);
xRotationMatrix[2, 2] = cos(rotX);

yRotationMatrix[0, 0] = cos(rotY);
yRotationMatrix[0, 1] = 0;
yRotationMatrix[0, 2] = sin(rotY);
yRotationMatrix[1, 0] = 0;
yRotationMatrix[1, 1] = 1;
yRotationMatrix[1, 2] = 0;
yRotationMatrix[2, 0] = -sin(rotY);
yRotationMatrix[2, 1] = 0;
yRotationMatrix[2, 2] = cos(rotY);

zRotationMatrix[0, 0] = cos(rotZ);
zRotationMatrix[0, 1] = -sin(rotZ);
zRotationMatrix[0, 2] = 0;
zRotationMatrix[1, 0] = sin(rotZ);
zRotationMatrix[1, 1] = cos(rotZ);
zRotationMatrix[1, 2] = 0;
zRotationMatrix[2, 0] = 0;
zRotationMatrix[2, 1] = 0;
zRotationMatrix[2, 2] = 1;

GML:
/// projection(node, x, y, z);
// dus in principe gewoon het doelwit met de gewenste co÷rdinaten in een niet-bestaande driedimensionale ruimte

var X, Y, Z, XX, YY, ZZ;

X = xRotationMatrix[0, 0] * argument1 + xRotationMatrix[0, 1] * argument2 + xRotationMatrix[0, 2] * argument3;
Y = xRotationMatrix[1, 0] * argument1 + xRotationMatrix[1, 1] * argument2 + xRotationMatrix[1, 2] * argument3;
Z = xRotationMatrix[2, 0] * argument1 + xRotationMatrix[2, 1] * argument2 + xRotationMatrix[2, 2] * argument3;

XX = yRotationMatrix[0, 0] * X + yRotationMatrix[0, 1] * Y + yRotationMatrix[0, 2] * Z;
YY = yRotationMatrix[1, 0] * X + yRotationMatrix[1, 1] * Y + yRotationMatrix[1, 2] * Z;
ZZ = yRotationMatrix[2, 0] * X + yRotationMatrix[2, 1] * Y + yRotationMatrix[2, 2] * Z;

argument0.x = zRotationMatrix[0, 0] * XX + zRotationMatrix[0, 1] * YY + zRotationMatrix[0, 2] * ZZ;
argument0.y = zRotationMatrix[1, 0] * XX + zRotationMatrix[1, 1] * YY + zRotationMatrix[1, 2] * ZZ;
// ik heb momenteel geen z-co÷rdinaat nodig

Resultaat:

(http://g2f.nl/0381xhz)

De punten kan ik verbinden met een simpel script:
GML:
/// draw_line_nodes();
// niet per se nodig, maar het is wel zo makkelijk
draw_line(node[argument0].x, node[argument0].y, node[argument1].x, node[argument0].y);

(http://g2f.nl/04qm5ob)

Om de kubus te vullen zou ik deze gewoon een aantal honderd keer op een steeds kleinere schaal kunnen tekenen (nog niets getest), maar dat lijkt mij heel inefficiŰnt. Wat is de beste manier om deze kubus op te vullen? Ik zoek een oplossing die ook werkt met complexere figuren, maar belichting is hier niet van belang.


Titel: Re: Kubus vullen.
Bericht door: Flumble op 2 Juni 2019, 13:31:34
Als je de projectie orthografisch (https://nl.wikipedia.org/wiki/Orthografische_projectie) houdt, kan je je vlakken vullen met primitives (http://www.game-maker.nl/forums/topic,27024.0). (Nice, die tutorial ligt al 11 jaar te verstoffen!)
GML:
draw_set_color(c_green)
draw_primitive_begin(pr_trianglestrip)
draw_vertex(node[0].x, node[0].y)
draw_vertex(node[1].x, node[1].y)
draw_vertex(node[2].x, node[2].y)
draw_vertex(node[3].x, node[3].y)
draw_primitive_end()
En dat voor elk vlak. :tilted:


Titel: Re: Kubus vullen.
Bericht door: Ceymoonie op 3 Juni 2019, 00:45:43
Als je de projectie orthografisch (https://nl.wikipedia.org/wiki/Orthografische_projectie) houdt, kan je je vlakken vullen met primitives (http://www.game-maker.nl/forums/topic,27024.0). (Nice, die tutorial ligt al 11 jaar te verstoffen!)
GML:
draw_set_color(c_green)
draw_primitive_begin(pr_trianglestrip)
draw_vertex(node[0].x, node[0].y)
draw_vertex(node[1].x, node[1].y)
draw_vertex(node[2].x, node[2].y)
draw_vertex(node[3].x, node[3].y)
draw_primitive_end()
En dat voor elk vlak. :tilted:
Perfect, alweer bedankt voor de zeer uitgebreide uitleg (al is het deze keer omdat je er al toevallig iets voor had geschreven). Ik ben blij verrast hoe makkelijk dit eigenlijk te doen is; voor de korte code hierboven hoefde ik alleen pr_trianglestrip naar pr_trianglefan te veranderen.


www.game-maker.nl © 2003, 2007 Nederlandse Game Maker Community