Bunu yapmanın 2 yolu vardır:
Theta ve phi'yi küresel koordinatlarda yürü, yüz ve tris oluştur
Bir icosahedron oluşturun ve istenen mozaikleme elde edilene kadar özyinelemeli yüzler bölün.
Küresel koordinatları kullanarak küre yürümek
İlk olarak, teta ve phi'yi yürümek için sadece bir yuvalanmış çift kullanın. Teta ve phi'yi yürürken, kürenizi oluşturmak için üçgenleri döndürürsünüz.
Bunu yapan kod şöyle görünecek:
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 ) ;
}
}
}
Bu yüzden yukarıda not edin, üst kapağı ve alt kapağı dörtlü değil sadece tris kullanarak sarmak önemlidir.
Icosahedral küre
Bir icosahedron kullanmak için, sadece icosahedron'un noktalarını yaratır ve ondan üçgenler çıkarırsınız. Bir icosahedron köşe kökenli oturan şunlardır:
(0, ±1, ±φ)
(±1, ±φ, 0)
(±φ, 0, ±1)
where φ = (1 + √5) / 2
O zaman sadece bir ikosahedron şemasına bakmalısınız ve bu rüzgarlardaki rüzgar yüzleri. Zaten burada bunu yapan kodum var .