Ada 2 cara untuk melakukannya:
Berjalanlah theta dan phi dalam koordinat bola, menghasilkan wajah dan tris
Buat icosahedron dan membagi wajah secara rekursif sampai tessellation yang diinginkan tercapai.
Bola menggunakan koordinat bola berjalan
Untuk cara pertama, Anda hanya menggunakan sarang ganda untuk berjalan theta dan phi. Saat Anda berjalan theta dan phi, Anda memutar segitiga untuk membuat bola Anda.
Kode yang melakukannya akan terlihat seperti ini:
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 ) ;
}
}
}
Jadi perhatikan di atas, penting untuk memutar tutup atas dan tutup bawah hanya menggunakan tris, bukan paha depan.
Lingkungan Icosahedral
Untuk menggunakan icosahedron, Anda hanya menghasilkan titik-titik icosahedron dan kemudian menghasilkan segitiga dari itu. The simpul dari sebuah icosahedron duduk di asal adalah:
(0, ±1, ±φ)
(±1, ±φ, 0)
(±φ, 0, ±1)
where φ = (1 + √5) / 2
Anda kemudian harus melihat diagram icosahedron dan wajah angin dari verts tersebut. Saya sudah punya kode yang melakukannya di sini .