Es gibt zwei Möglichkeiten:
Wandeln Sie Theta und Phi in sphärischen Koordinaten, erzeugen Sie Gesichter und Tris
Erstellen Sie ein Ikosaeder und unterteilen Sie die Flächen rekursiv, bis die gewünschte Tessellation erreicht ist.
Kugel mit sphärischen Koordinaten gehen
Für den ersten Weg benutzt man einfach ein doppeltes Nest, um Theta und Phi zu laufen. Während Sie Theta und Phi laufen, drehen Sie Dreiecke, um Ihre Kugel zu erzeugen.
Der Code dafür sieht ungefähr so aus:
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 ) ;
}
}
}
Beachten Sie daher, dass es wichtig ist, die obere und die untere Kappe nur mit Tris und nicht mit Quads zu wickeln.
Ikosaedrische Kugel
Um ein Ikosaeder zu verwenden, erzeugen Sie einfach die Punkte des Ikosaeders und wickeln dann Dreiecke daraus auf. Die Eckpunkte eines Ikosaeders, das am Ursprung sitzt, sind:
(0, ±1, ±φ)
(±1, ±φ, 0)
(±φ, 0, ±1)
where φ = (1 + √5) / 2
Sie müssen dann nur ein Diagramm eines Ikosaeders und Windflächen von diesen Vert betrachten. Ich habe bereits Code, der das hier macht .