website logo
Auteur
avatar
thellier

Forum » » Création-Développement » » Map 3D


Posté : 08-08-2012 10:30 icone du post

Il faut que t'applique ta transformation (rotation selon y) a tes "carrés" et aussi ta transformation de perspective

Voici une partie de code qui vient de Aminet/cow3D

je t'explique qques notions de 3D "appliquer une transformation" veut dire multiplier des vecteur par une matrice
des vecteurs sont une liste de valeurs x y z
une matrice est un tableau [4][4] de float

Dans ce qui suit tu a par exemple SetMry() qui crée une matrice de rotation selon y (axe vertical)
SetMry s'appuye sur SetRot() qui crée une matrice Mr de rotation quelconque
(on comprend aisément que faire une Mr selon x ou y ou z va se ressembler)

Après tu a TransformP() qui "applique une transformation" dans le cas général
cad multiplie ta matrice Mry et tes points x y z dans ton cas

mais pour le cas simple d'une Mry il vaut mieux utiliser YrotateP() qui en enlevant
toutes les multiplications par 1 ou 0 de TransformP() simplifie la formule

Ensuite tu a ProjectP qui met tes points x y z à l'échelle de l'écran
cad les centre et les multiplie par la taille de l'écran
ceci car généralement en 3D on travaille sur des valeurs "normalisées" pour x y z s'étalant en -1.0 et + 1.0
donc il faut les redimensionner/centrer pour avoir des coordonnées en pixels

dans ton cas il faudrait en plus appliquer une perspective cad réduire x et y selon z. Or z qui est la profondeur vaut 0 au niveau de l'écran et 1 à l'horizon
donc faire (J'ai pas de listing sous la main) plutot qque chose comme ça (avec persp une valeur de perpective à déterminer selon l'effet voulu)

NLOOP(Pnb)
{
x=P->x;y=P->y;z=P->z;
if(z==0.0) z=0.0001; /* evite division par 0*/
P->x= persp*x*sizex/z+sizex;
P->y= persp*y*sizey/z+sizey;
P->z= z*sizez+sizez;
P++;
}




/*=================================================================*/
void SetMrot(float *M,float R ,UBYTE a,UBYTE b,UBYTE c,UBYTE d)
{ /* define a rotation matrix */
float Pi =3.1416;
WORD n;
if(M==NULL) return;
M[0]=M[5]=M[10]=M[15]= 1.0; M[1]=M[2]=M[3]=M[4]=M[6]=M[7]=M[8]=M[9]=M[11]=M[12]=M[13]=M[14]=0.0;
if(R==0.0) return;
if(R>=360.0)
{n=R/360.0; R=R-n*360.0;}
if(R<0.0)
{n=1+R/360.0;R=R-n*360.0;}
R= R / 180.0 * Pi;
M[a] = (float)cos(R);
M[b] = M[a];
M[c] = (float)sin(R);
M[d] = -M[c];
}
/*=================================================================*/
void SetMrx(float *M,float x) /* define X rotation matrix */
{ SetMrot(M,x,5,10,6,9); }
/*=================================================================*/
void SetMry(float *M,float y) /* define Y rotation matrix */
{ SetMrot(M,y,10,0,8,2); }
/*=================================================================*/
void SetMrz(float *M,float z) /* define Z rotation matrix */
{ SetMrot(M,z,0,5,1,4); }
/*=================================================================*/
void TransformP(register float *M,struct point3D *P,LONG Pnb)
{ /* transform points with a given matrix */
register float x;
register float y;
register float z;
register LONG n;

NLOOP(Pnb)
{
x=P->x;y=P->y;z=P->z;
P->x= M[0]*x + M[4]*y+ M[8] *z+ M[12];
P->y= M[1]*x + M[5]*y+ M[9] *z+ M[13];
P->z= M[2]*x + M[6]*y+ M[10]*z+ M[14];
P++;
}
}
/*=================================================================*/
void YrotateP(register float *M,struct point3D *P,LONG Pnb)
{ /* y rotate points with a given matrix : optimized TransformP() */
register float x;
register float z;
register float m0 =M[0];
register float m8 =M[8];
register float m2 =M[2];
register float m10=M[10];
register LONG n;

NLOOP(Pnb)
{
x=P->x;z=P->z;
P->x= m0*x + m8 *z;
P->z= m2*x + m10*z;
P++;
}
}
/*=================================================================*/
void ProjectP(struct point3D *P,LONG Pnb)
{ /* project points to screen-coordinates */
register float x;
register float y;
register float z;
register float sizex=LARGE/2.0;
register float sizey=HIGH /2.0;
register float sizez=1.0/2.0;
register LONG n;

NLOOP(Pnb)
{
x=P->x;y=P->y;z=P->z;
P->x= x*sizex+sizex;
P->y= y*sizey+sizey;
P->z= z*sizez+sizez;
P++;
}
}

Cet article provient de Le site des utilisateurs francophones actuels et futurs d'AmigaOS 4.x
https://amiga-ng.org/viewtopic.php?topic=1348&forum=14