มี 2 วิธีในการทำ:
เดิน theta และ phi ในพิกัดทรงกลมสร้างใบหน้าและ tris
สร้าง icosahedron และแบ่งใบหน้าแบบวนซ้ำจนกว่าจะถึงเทสเซลเลชันที่ต้องการ
ทรงกลมโดยใช้พิกัดทรงกลมเดิน
สำหรับวิธีแรกคุณเพียงแค่ใช้ซ้อนกันสองครั้งเพื่อเดินทีต้าและพี เมื่อคุณเดิน theta และ phi คุณจะหมุนสามเหลี่ยมเพื่อสร้างทรงกลมของคุณ
รหัสที่ใช้จะมีลักษณะดังนี้:
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 ) ;
}
}
}
ดังนั้นโปรดทราบด้านบนสิ่งสำคัญคือการหมุนฝาปิดด้านบนและฝาล่างโดยใช้เฉพาะทริสเท่านั้น
ทรงกลมแบบ Icosahedral
ในการใช้ icosahedron คุณเพียงแค่สร้างจุดของ icosahedron แล้วไขรูปสามเหลี่ยมออกจากมัน จุดของฮอว์คิงนั่งอยู่ที่ต้นกำเนิดคือ:
(0, ±1, ±φ)
(±1, ±φ, 0)
(±φ, 0, ±1)
where φ = (1 + √5) / 2
จากนั้นคุณต้องดูไดอะแกรมของ icosahedron และหน้าลมจาก verts เหล่านั้น ฉันมีรหัสที่ทำที่นี่แล้ว