Có 2 cách để làm điều đó:
Đi bộ theta và phi trong tọa độ hình cầu, tạo khuôn mặt và tris
Tạo một khối hình chữ nhật và các mặt phân chia đệ quy cho đến khi đạt được điều kiện mong muốn.
Hình cầu sử dụng tọa độ hình cầu đi bộ
Đối với cách đầu tiên, bạn chỉ cần sử dụng một đôi lồng nhau để đi bộ theta và phi. Khi bạn đi bộ theta và phi, bạn quay hình tam giác để tạo hình cầu của bạn.
Mã mà nó sẽ trông giống như thế này:
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 ) ;
}
}
}
Vì vậy, lưu ý ở trên, điều quan trọng là phải quấn nắp trên và nắp dưới chỉ sử dụng tris, không phải quads.
Quả cầu Icosah thờ
Để sử dụng một icosahedron, bạn chỉ cần tạo các điểm của icosahedron và sau đó cuộn các hình tam giác từ nó. Các đỉnh của một khối hình chữ nhật ngồi ở gốc tọa độ là:
(0, ±1, ±φ)
(±1, ±φ, 0)
(±φ, 0, ±1)
where φ = (1 + √5) / 2
Sau đó, bạn chỉ cần nhìn vào một sơ đồ của một khối nhựa và mặt gió từ những câu đó. Tôi đã có mã mà làm điều đó ở đây .