2006年11月7日

[計圖]作業一原理與結果檔案

題目:利用OpenGL繪出一四面體的碎型

載點:http://0rz.tw/66254


基本上程式直接複製貼上,這邊要講的是原理...

遞迴那段的程式碼是這樣的

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);

醬就可以囉~~耶,開心的繼續玩~~


目前我自己做到這樣的進度,剩下的要問老師怎麼橋= =


Posted by kevingao814 at 樂多Roodo! │21:55 │回應(0)引用(0)├學知識
樂多分類:日記/一般 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/2436833