Il y a 2 façons de procéder:
Parcourez thêta et phi en coordonnées sphériques, générez des visages et des tris
Créez un icosaèdre et subdivisez récursivement les faces jusqu'à ce que la tessellation souhaitée soit atteinte.
Sphère utilisant des coordonnées sphériques à pied
Pour la première façon, vous utilisez simplement un double imbriqué pour parcourir thêta et phi. En parcourant thêta et phi, vous faites tourner des triangles pour créer votre sphère.
Le code qui le fait ressemblera à ceci:
for( int t = 0 ; t < stacks ; t++ ) // stacks are ELEVATION so they count theta
{
real theta1 = ( (real)(t)/stacks )*PI ;
real theta2 = ( (real)(t+1)/stacks )*PI ;
for( int p = 0 ; p < slices ; p++ ) // slices are ORANGE SLICES so the count azimuth
{
real phi1 = ( (real)(p)/slices )*2*PI ; // azimuth goes around 0 .. 2*PI
real phi2 = ( (real)(p+1)/slices )*2*PI ;
//phi2 phi1
// | |
// 2------1 -- theta1
// |\ _ |
// | \ |
// 3------4 -- theta2
//
//vertex1 = vertex on a sphere of radius r at spherical coords theta1, phi1
//vertex2 = vertex on a sphere of radius r at spherical coords theta1, phi2
//vertex3 = vertex on a sphere of radius r at spherical coords theta2, phi2
//vertex4 = vertex on a sphere of radius r at spherical coords theta2, phi1
// facing out
if( t == 0 ) // top cap
mesh->addTri( vertex1, vertex3, vertex4 ) ; //t1p1, t2p2, t2p1
else if( t + 1 == stacks ) //end cap
mesh->addTri( vertex3, vertex1, vertex2 ) ; //t2p2, t1p1, t1p2
else
{
// body, facing OUT:
mesh->addTri( vertex1, vertex2, vertex4 ) ;
mesh->addTri( vertex2, vertex3, vertex4 ) ;
}
}
}
Donc, notez ci-dessus, il est important d'enrouler le capuchon supérieur et le capuchon inférieur en utilisant uniquement des tris, pas des quads.
Sphère icosaédrique
POUR utiliser un icosaèdre, il vous suffit de générer les points de l'icosaèdre, puis d'enrouler des triangles. Les sommets d'un icosaèdre assis à l'origine sont:
(0, ±1, ±φ)
(±1, ±φ, 0)
(±φ, 0, ±1)
where φ = (1 + √5) / 2
Il suffit ensuite de regarder un diagramme d'un icosaèdre et des faces de vent de ces verts. J'ai déjà du code qui le fait ici .