2006年11月7日
[計圖]作業一原理與結果檔案
基本上程式直接複製貼上,這邊要講的是原理...
遞迴那段的程式碼是這樣的
void divide_tetra(GLfloat *a, GLfloat *b, GLfloat *c, GLfloat *d, int m)
{
GLfloat mid[6][3];
int j;
if(m>0)
{
/* compute six midpoints */
for(j=0; j<3; j++) mid[0][j]=(a[j]+b[j])/2;
for(j=0; j<3; j++) mid[1][j]=(a[j]+c[j])/2;
for(j=0; j<3; j++) mid[2][j]=(a[j]+d[j])/2;
for(j=0; j<3; j++) mid[3][j]=(b[j]+c[j])/2;
for(j=0; j<3; j++) mid[4][j]=(c[j]+d[j])/2;
for(j=0; j<3; j++) mid[5][j]=(b[j]+d[j])/2;
/* create 4 tetrahedrons by subdivision */
divide_tetra(a, mid[0], mid[1], mid[2], m-1);
divide_tetra(mid[0], b, mid[3], mid[5], m-1);
divide_tetra(mid[1], mid[3], c, mid[4], m-1);
divide_tetra(mid[2], mid[4], d, mid[5], m-1);
}
else(tetra(a,b,c,d)); /* draw tetrahedron at end of recursion */
}
然後abcd與mid[]的對應關係是這樣的
所以它是把一個大四面體分割成四個小四面體,做3D的碎型,而不是只個別把四個三角型挖開而已,這時可以注意到右下角以m[2]為第一點的小四面體在順序上有問題,這是作者的錯誤XDDDD。
所以...
divide_tetra(mid[2], mid[4], d, mid[5], m-1);
需要修改成
divide_tetra(mid[2], mid[5], mid[4], d, m-1);
醬就可以囉~~耶,開心的繼續玩~~
目前我自己做到這樣的進度,剩下的要問老師怎麼橋= =


