Dim matrice.f(3,3)
Code : Tout sélectionner
Protected coszXsiny.f = _Cos(z)*_Sin(y), sinzXsiny.f = _Sin(z)*_Sin(y)
matrice(0,0) = _Cos(z)*_Cos(y)
matrice(1,0) = _Sin(z)*_Cos(y)
matrice(2,0) = -_Sin(y)
matrice(0,1) = coszXsiny*_Sin(x) - _Sin(z)*_Cos(x)
matrice(1,1) = sinzXsiny*_Sin(x) + _Cos(x)*_Cos(z)
matrice(2,1) = _Sin(x)*_Cos(y)
matrice(0,2) = coszXsiny*_Cos(x) + _Sin(z)*_Sin(x)
matrice(1,2) = sinzXsiny*_Cos(x) - _Cos(z)*_Sin(x)
matrice(2,2) = _Cos(x)*_Cos(y)
Puis après avoir calculé cette matrice vous pouvez réduire le nombre de multiplication de 12 à 6 en factorisant judicieusement comme ça :
Dim a.f(3)
Code : Tout sélectionner
a(0) = -(matrice(0,1)*matrice(0,0))
a(1) = -(matrice(1,1)*matrice(1,0))
a(2) = -(matrice(2,1)*matrice(2,0))
Avec Point3D(nb_sommets) les sommets utilisés pour l'affichage, Sommet(nb_sommets) précalculé les positions des sommets sans rotation dont Sommet(i)\xy = Sommet(i)\x*Sommet(i)\y.
Code : Tout sélectionner
For i=0 To derniersommet
Point3D(i)\x = (matrice(0,1)+sommet(i)\x)*(matrice(0,0)+sommet(i)\y) + a(0)+sommet(i)\xy + matrice(0,2)*sommet(i)\z
Point3D(i)\y = (matrice(1,1)+sommet(i)\x)*(matrice(1,0)+sommet(i)\y) + a(1)+sommet(i)\xy + matrice(1,2)*sommet(i)\z
Point3D(i)\z = (matrice(2,1)+sommet(i)\x)*(matrice(2,0)+sommet(i)\y) + a(2)+sommet(i)\xy + matrice(2,2)*sommet(i)\z
Next i