| Projection 3D sans utiliser le moteur 3D de GM | |
|
+7SPLN [TheDarkTiger] CoDeAVE Chulien glcraft Topaze22 onilink_ 11 participants |
Auteur | Message |
---|
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Projection 3D sans utiliser le moteur 3D de GM Sam 7 Nov 2009 - 22:13 | |
| Voila je relance le topic apres avoir appris de nouveaux truc en maths. J'ai pris vite fait le temps de prog ça apres les epreuves de bac blanc, mais je dois vous dire que ces derniers temps vous risquer de ne pas trop me voir etant donné que mes parent sont tombés sur mon bulletin xD. Donc y a du nouveaux et du propre, assez bien codé ^^ Je rappelle le truc, le but est de faire de la 3d sans le moteur 3d de GM, c'est a dire que meme les versions non enregistrées de GM pourons lancer ces applications. Je vais vous montrer ce que j'ai fait, les scripts qui suivent sont des etapes de la realisation de mon petit moteur pour un cube, afin que ceux qui sont interressés puissent comprendre le fonctionnement d'un moteur 3d. Voici un petit aperçu : Les codes suivants sont a mettre dans le draw event d'un objet. Etape 1 : La projection basique - Spoiler:
- Code:
-
if(!variable_local_exists('create')) { background_color = 0 xoff = 320 yoff = 240 zoff = 500
for(i=0 ; i<8 ; i+=1) { vx[i] = 100 - 200*( floor((i+1)/2) mod 2) vy[i] = 100 - 200*( floor(i/2) mod 2) vz[i] = 100 - 200*( floor(i/4) mod 2) } create = 1 }
for(i=0 ; i<8 ; i+=1) { px[i] = (vx[i]*256)/(vz[i]+zoff) + xoff py[i] = (vy[i]*256)/(vz[i]+zoff) + yoff }
draw_set_color(c_white) for(i=0; i<4; i+=1) { draw_line(px[i] , py[i] , px[i+4] , py[i+4]) draw_line(px[i] , py[i] , px[(i+1) mod 4] , py[(i+1) mod 4]) draw_line(px[i+4], py[i+4], px[(i+1) mod 4 + 4], py[(i+1) mod 4 + 4]) }
Etape 2 rotations : - Spoiler:
- Code:
-
if(!variable_local_exists('create')) { background_color = 0 xoff = 320 yoff = 240 zoff = 500
for(i=0 ; i<8 ; i+=1) { vx[i] = 100 - 200*( floor((i+1)/2) mod 2) vy[i] = 100 - 200*( floor(i/2) mod 2) vz[i] = 100 - 200*( floor(i/4) mod 2) } create = 1 }
xa = mouse_x ya = mouse_y za = 0
sx = lengthdir_y(1,xa) sy = lengthdir_y(1,ya) sz = lengthdir_y(1,za)
cx = lengthdir_x(1,xa) cy = lengthdir_x(1,ya) cz = lengthdir_x(1,za)
mat[0,0] = cx*cz + sx*sy*sz mat[0,1] = cy*sz mat[0,2] = cx*sy*sz - cz*sx
mat[1,0] = cz*sx*sy - cx*sz mat[1,1] = cy*cz mat[1,2] = sx*sz + cx*cz*sy
mat[2,0] = cy*sx mat[2,1] = -sy mat[2,2] = cx*cy
for(i=0; i<8; i+=1) { rx[i] = vx[i]*mat[0,0] + vy[i]*mat[1,0] + vz[i]*mat[2,0] ry[i] = vx[i]*mat[0,1] + vy[i]*mat[1,1] + vz[i]*mat[2,1] rz[i] = vx[i]*mat[0,2] + vy[i]*mat[1,2] + vz[i]*mat[2,2] px[i] = (rx[i]*256)/(rz[i]+zoff) + xoff py[i] = (ry[i]*256)/(rz[i]+zoff) + yoff }
draw_set_color(c_white) for(i=0; i<4; i+=1) { draw_line(px[i] , py[i] , px[i+4] , py[i+4]) draw_line(px[i] , py[i] , px[(i+1) mod 4] , py[(i+1) mod 4]) draw_line(px[i+4], py[i+4], px[(i+1) mod 4 + 4], py[(i+1) mod 4 + 4]) }
Etape 3 Ne pas afficher les faces cachées - Spoiler:
- Code:
-
if(!variable_local_exists('create')) { background_color = 0 xoff = 320 yoff = 240 zoff = 500
for(i=0 ; i<8 ; i+=1) { vx[i] = 100 - 200*( floor((i+1)/2) mod 2) vy[i] = 100 - 200*( floor(i/2) mod 2) vz[i] = 100 - 200*( floor(i/4) mod 2) }
vcount = 8 fcount = 12
fa[0] = 5 ; fb[0] = 1 ; fc[0] = 4 fa[1] = 5 ; fb[1] = 4 ; fc[1] = 8 fa[2] = 3 ; fb[2] = 7 ; fc[2] = 8 fa[3] = 3 ; fb[3] = 8 ; fc[3] = 4 fa[4] = 2 ; fb[4] = 6 ; fc[4] = 3 fa[5] = 6 ; fb[5] = 7 ; fc[5] = 3 fa[6] = 1 ; fb[6] = 5 ; fc[6] = 2 fa[7] = 5 ; fb[7] = 6 ; fc[7] = 2 fa[8] = 5 ; fb[8] = 8 ; fc[8] = 6 fa[9] = 8 ; fb[9] = 7 ; fc[9] = 6 fa[10]= 1 ; fb[10]= 2 ; fc[10]= 3 fa[11]= 1 ; fb[11]= 3 ; fc[11]= 4
for(i=0 ; i<fcount ; i+=1) { fa[i]-= 1 ; fb[i]-= 1 ; fc[i]-= 1 } create = 1 }
xa = mouse_x ya = mouse_y za = 0
sx = lengthdir_y(1,xa) sy = lengthdir_y(1,ya) sz = lengthdir_y(1,za)
cx = lengthdir_x(1,xa) cy = lengthdir_x(1,ya) cz = lengthdir_x(1,za)
mat[0,0] = cx*cz + sx*sy*sz mat[0,1] = cy*sz mat[0,2] = cx*sy*sz - cz*sx
mat[1,0] = cz*sx*sy - cx*sz mat[1,1] = cy*cz mat[1,2] = sx*sz + cx*cz*sy
mat[2,0] = cy*sx mat[2,1] = -sy mat[2,2] = cx*cy
for(i=0; i<vcount; i+=1) { rx[i] = vx[i]*mat[0,0] + vy[i]*mat[1,0] + vz[i]*mat[2,0] ry[i] = vx[i]*mat[0,1] + vy[i]*mat[1,1] + vz[i]*mat[2,1] rz[i] = vx[i]*mat[0,2] + vy[i]*mat[1,2] + vz[i]*mat[2,2] px[i] = (rx[i]*256)/(rz[i]+zoff) + xoff py[i] = (ry[i]*256)/(rz[i]+zoff) + yoff }
draw_set_color(c_white) for(i=0; i<fcount; i+=1) { a1 = px[ fa[i] ] - px[ fb[i] ] b1 = py[ fa[i] ] - py[ fb[i] ] a2 = px[ fc[i] ] - px[ fb[i] ] b2 = py[ fc[i] ] - py[ fb[i] ]
vis = !((a1*b2 - b1*a2) < 0) if( vis ) { draw_line(px[ fa[i] ], py[ fa[i] ], px[ fb[i] ], py[ fb[i] ]) draw_line(px[ fb[i] ], py[ fb[i] ], px[ fc[i] ], py[ fc[i] ]) draw_line(px[ fc[i] ], py[ fc[i] ], px[ fa[i] ], py[ fa[i] ]) } }
Je ne mais pas les autres etapes mais tout est la : http://host-a.net/onilink_/3DEngineGM.rarLes cubeN sont les etapes du moteur avec un cube Les objetN sont les etapes du moteur avec la possibilité de charger un wavefront (.obj) Ne pas charger d'autres obj que ceux que j'ai mis car seul les petit objets non concaves ont une projection rapide et sans defauts. Bon j'expliquerais mieux tout ça quand j'aurais le temps mais la c'est serré dsl x) Voili voila, en esperant que ça plairas =) sinon @++
Dernière édition par onilink_ le Ven 7 Mai 2010 - 22:16, édité 9 fois |
|
| |
Invité Invité
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Sam 7 Nov 2009 - 23:09 | |
| hmmm... j'arrive a piger quelques trucs, je suppose que ce n'est pas aussi performant que le moteur native de gm ? entk théoriquement c'est vachement pratique |
|
| |
Topaze22 *Excellent utilisateur*
Messages : 6213 Localisation : Sur la Lune Projet Actuel : Projet HELLO/TOPAZE22 Mario Bros World
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Ven 20 Nov 2009 - 12:20 | |
| Je ne savais pas qu'Onilink était un boss :p_gne: |
|
| |
glcraft Utilisateur confirmé: Rang *****
Messages : 1698 Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P Projet Actuel : Jeu de survie avancé
||--------
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Ven 20 Nov 2009 - 19:49 | |
| woaw, nom de dieu ! C'est vraiment bien fait !!! entre la perspective et l'orthogonale, la rotation bien faite, franchement je suis étonné de voir ce genre de truc aussi bien fait, chapeau Et merci pour le script |
|
| |
Chulien Utilisateur confirmé: Rang *****
Messages : 2232
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Ven 20 Nov 2009 - 21:30 | |
| page à relire quand je serai plus frais! ça affiche juste des lignes ou des surfaces aussi? |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Sam 5 Déc 2009 - 11:39 | |
| Merci les CBNAteur ça encourage tous ces compliments . Sinon vous verrez avec du recul que c'est pas tellement compliqué ^^. Ici c'est juste une vue en fil de fer.... Ensuite faire la meme chose en ajoutant des faces, des effets de lumieres, c'est beaucoup plus compliqué et j'ai pas l'impression que ce soit possible sous game maker a cause de la lenteur de draw point.... Mais bon ce petit exemple est surtout la pour faire comprendre a tout le monde que la 3d c'est pas si compliqué d'un point de vue mathématique ^^. |
|
| |
CoDeAVE Utilisateur confirmé: Rang **
Messages : 408 Localisation : Québec
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Mer 9 Déc 2009 - 15:21 | |
| |
|
| |
[TheDarkTiger] Modérateur
Messages : 7420 Localisation : Essonne
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Mar 15 Déc 2009 - 16:39 | |
| sympa.
Bon, sous GM, c'est vrai que c'est limité, mais on peut réutiliser le code en C avec la SDL par exemple, ou même sous DOS avec le bon compilateur. (si ça t'intéresse onilink_ j'ai plein de liens intéressant sur les moteurs 3D et leur optimisation pour les plates formes peu puissantes)
Pour la 4D, j'ai fait une fonction 4d4_draw_hypercube qui traine quelque part sur le forum ... |
|
| |
SPLN Utilisateur confirmé: Rang ***
Messages : 588 Localisation : Sur son ordinateur *vous vois* arrêtez de me regarder comme ça Projet Actuel : En quête de projet(s)!
Mes projets:
SP Lecteur Multimedia (Stand by)
S-Portable Graphics (demo1.8 is out! demo2.0 is planned)
SSB RPG (Stand by)
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Mar 15 Déc 2009 - 17:21 | |
| - [TheDarkTiger] a écrit:
- sympa.
Bon, sous GM, c'est vrai que c'est limité, mais on peut réutiliser le code en C avec la SDL par exemple, ou même sous DOS avec le bon compilateur. (si ça t'intéresse onilink_ j'ai plein de liens intéressant sur les moteurs 3D et leur optimisation pour les plates formes peu puissantes)
Pour la 4D, j'ai fait une fonction 4d4_draw_hypercube qui traine quelque part sur le forum ... https://cbna.forumactif.com/aide-confirmes-f14/hypercube-t9229.htm |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Sam 20 Fév 2010 - 13:11 | |
| Infos : ajout de screen et de fichiers d'exemple |
|
| |
nicoulas *Excellent utilisateur*
Messages : 6030 Localisation : Dordogne Projet Actuel : Croustaface Tower Defense
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Sam 20 Fév 2010 - 13:50 | |
| Cool que tu remette à jour tes scripts avec screen + exemple |
|
| |
SonicZeldaMario Banni(e)
Messages : 111
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Sam 20 Fév 2010 - 14:11 | |
| Il a justement un peu utiliser de 3D si on lit bien le code on voie Point 3D Alors aussi y a 3D Rotates c'est comme de la 3D en faite |
|
| |
glcraft Utilisateur confirmé: Rang *****
Messages : 1698 Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P Projet Actuel : Jeu de survie avancé
||--------
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Sam 20 Fév 2010 - 14:16 | |
| d'ou le nom du sujet |
|
| |
nicoulas *Excellent utilisateur*
Messages : 6030 Localisation : Dordogne Projet Actuel : Croustaface Tower Defense
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Sam 20 Fév 2010 - 14:33 | |
| - SonicZeldaMario a écrit:
- Il a justement un peu utiliser de 3D si on lit bien le code on voie Point 3D Alors aussi y a 3D Rotates c'est comme de la 3D en faite
Il a pas utilisé de 3D, il en a programmé sans la d3d de GM. |
|
| |
CoDeAVE Utilisateur confirmé: Rang **
Messages : 408 Localisation : Québec
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Sam 20 Fév 2010 - 20:28 | |
| - SonicZeldaMario a écrit:
- Il a justement un peu utiliser de 3D si on lit bien le code on voie Point 3D Alors aussi y a 3D Rotates c'est comme de la 3D en faite
C'est dans le nom de ses variables/arrays qu'il utilise le mot 3D. Au final, c'est bien de la 3D qu'on voit mais il n'utilise pas de routine 3D déjà toute faites de GM d'où l'intérêt de son script. |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Ven 7 Mai 2010 - 22:17 | |
| J'ai continué mon petit moteur de 3d pour ceux que ça interresse, voir le premier post :sarcastique: |
|
| |
Invité Invité
| |
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Ven 7 Mai 2010 - 22:53 | |
| Faut pas dire ça xD La projection -> voir le theoreme de Thales Les rotations -> Aller sur wiki et pomper les matrices de rotation 3D Visibilité des faces -> produit vectoriel Remplissage des faces -> Lister les faces et remplir de la plus éloignée a la plus proche de la cameras et dessiner des triangles x) Coloration des faces -> Ici j'ai triché j'ai mis une tonalité du gris au blanc en fontion de l'eloignement de la camera
Sur ceux je vous dit a pas du tout très bientot etant donné que jvais devoir subir une sceance de dégeekage donc je vous dit bonne continuation et certainement a dans + ou - 6 semaines (si j'ai mon BAC /oL) |
|
| |
marty Utilisateur confirmé: Rang ***
Messages : 697 Projet Actuel : laby-ereinte !
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Sam 8 Mai 2010 - 11:37 | |
| ma fique ! bonne révision,fo se recentrer parfois! ps: tes parents sont tombés sur tes codes?? lol |
|
| |
CoDeAVE Utilisateur confirmé: Rang **
Messages : 408 Localisation : Québec
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Sam 8 Mai 2010 - 19:04 | |
| J'ai testé hier et, je dois dire que j'adore ! Fait une lib pour faire de la 3D sous SDL !! Ça serait un beau projet ^^ |
|
| |
red-error Utilisateur confirmé: Rang ****
Messages : 1015 Projet Actuel :
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Sam 29 Mai 2010 - 16:06 | |
| - onilink_ a écrit:
Je rappelle le truc, le but est de faire de la 3d sans le moteur 3d de GM, c'est a dire que meme les versions non enregistrées de GM pourons lancer ces applications. Et la publicité n'est pas mensongère ! (Sauf pour les gmk portant le chiffre 4, ça doit être les textures et les ombrages... ^^)Bravo en tout cas, vraiment, plonger là dedans et en ressortir, c'est superbe. |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM Dim 30 Mai 2010 - 19:27 | |
| c'est vrai pour le 4eme, le probleme etant que je dois dessiner des polygones colorés... et j'ai une solution mais plutot compliqué, donc faut pas etre pressé :lng: |
|
| |
Contenu sponsorisé
| Sujet: Re: Projection 3D sans utiliser le moteur 3D de GM | |
| |
|
| |
| Projection 3D sans utiliser le moteur 3D de GM | |
|