Є два способи зробити це:
Гуляйте по теті та фі в сферичних координатах, створюйте обличчя та трис
Створіть ікосаедр і рекурсивно розділіть обличчя, поки не буде досягнуто бажаної тесселяції.
Сфера за допомогою сферичних координат ходи
По-перше, ви просто використовуєте подвійне вкладене для ходіння по теті та фі. Коли ви ходите по теті та фі, ви обертаєте трикутники, щоб створити свою сферу.
Код, який це робить, буде виглядати приблизно так:
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 ) ;
}
}
}
Отже, зверніть увагу на те, що важливо намотувати верхню та нижню шапки, використовуючи лише трис, а не квадратики.
Ікосаедральна сфера
Щоб використовувати ікосаедр, ви просто генеруєте точки ікосаедра, а потім намотуєте з нього трикутники. У вершинах ікосаедра сидить в нулі є:
(0, ±1, ±φ)
(±1, ±φ, 0)
(±φ, 0, ±1)
where φ = (1 + √5) / 2
Тоді вам доведеться просто подивитися схему ікосаедра та граней вітру з цих вершин. У мене вже є код, який це робить тут .