game maker
Gebruikersnaam:
Wachtwoord:
Home Info Forums Help
Welkom, Gast. Alsjeblieft inloggen of registreren.
De activerings e-mail gemist?
+  Forums
|-+  Werken met Game Maker
| |-+  Beginners (Moderators: Erik Leppen, ericlegomeer, BlueMoonProductions)
| | |-+  [Opgelost] Kubus vullen.
Pagina's: [1]
« vorige volgende »
Print
Advertenties

Ceymoonie
Gebruiker


Offline Offline

Berichten: 4836


WWW
« Gepost 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 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:



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);



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.

« Laatste verandering: 3 Juni 2019, 00:50:29 door Ceymoonie »
Naar boven Gelogd

Flumble
Gebruiker


Offline Offline

Berichten: 2018


« Antwoord #1 Gepost op: 2 Juni 2019, 13:31:34 »

Als je de projectie orthografisch houdt, kan je je vlakken vullen met primitives. (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. Gekanteld

Naar boven Gelogd

Ceymoonie
Gebruiker


Offline Offline

Berichten: 4836


WWW
« Antwoord #2 Gepost op: 3 Juni 2019, 00:45:43 »

Als je de projectie orthografisch houdt, kan je je vlakken vullen met primitives. (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. Gekanteld
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.

« Laatste verandering: 3 Juni 2019, 00:51:22 door Ceymoonie »
Naar boven Gelogd

Advertenties
« vorige volgende »
Pagina's: [1]
Print


Topic Informatie
0 geregistreerde leden en 1 gast bekijken dit topic.

Ga naar:  

Powered by SMF 1.1.21 | SMF © 2006-2007, Simple Machines
www.game-maker.nl © 2003-2019 Nederlandse Game Maker Community