MarchingCube实现(C++ OpenGl代码篇)

9 篇文章 0 订阅
2 篇文章 0 订阅

1. 代码实现

#define GLUT_DISABLE_ATEXIT_HACK     
#include <stdlib.h>    
#include <string.h>    
#include "stdio.h"    
#include "math.h"    
#include "GL/glut.h"    

#if !defined(GLUT_WHEEL_UP)    
#  define GLUT_WHEEL_UP   3    
#  define GLUT_WHEEL_DOWN 4    
#endif    

//向量    
struct GLvector    
{    
        GLfloat fX;    
        GLfloat fY;    
        GLfloat fZ;         
};    

//立方体8个顶点    
static const GLfloat a2fVertexOffset[8][3] =    
{    
        {0.0, 0.0, 0.0},{1.0, 0.0, 0.0},{1.0, 1.0, 0.0},{0.0, 1.0, 0.0},    
        {0.0, 0.0, 1.0},{1.0, 0.0, 1.0},{1.0, 1.0, 1.0},{0.0, 1.0, 1.0}    
};    

// 立方体12个边    
static const GLint a2iEdgeConnection[12][2] =     
{    
        {0,1}, {1,2}, {2,3}, {3,0},    
        {4,5}, {5,6}, {6,7}, {7,4},    
        {0,4}, {1,5}, {2,6}, {3,7}    
};    

//立方体 12个边的方向向量    
static const GLfloat a2fEdgeDirection[12][3] =    
{    
        {1.0, 0.0, 0.0},{0.0, 1.0, 0.0},{-1.0, 0.0, 0.0},{0.0, -1.0, 0.0},    
        {1.0, 0.0, 0.0},{0.0, 1.0, 0.0},{-1.0, 0.0, 0.0},{0.0, -1.0, 0.0},    
        {0.0, 0.0, 1.0},{0.0, 0.0, 1.0},{ 0.0, 0.0, 1.0},{0.0,  0.0, 1.0}    
};    

static const GLfloat afAmbientWhite [] = {0.25, 0.25, 0.25, 1.00};   // 周围 环绕 白    
static const GLfloat afAmbientRed   [] = {0.25, 0.00, 0.00, 1.00};   // 周围 环绕 红    
static const GLfloat afAmbientGreen [] = {0.00, 0.25, 0.00, 1.00};   // 周围 环绕 绿    
static const GLfloat afAmbientBlue  [] = {0.00, 0.00, 0.25, 1.00};   // 周围 环绕 蓝    
static const GLfloat afDiffuseWhite [] = {0.75, 0.75, 0.75, 1.00};   // 漫射 白    
static const GLfloat afDiffuseRed   [] = {0.75, 0.00, 0.00, 1.00};   // 漫射 红    
static const GLfloat afDiffuseGreen [] = {0.00, 0.75, 0.00, 1.00};   // 漫射 绿    
static const GLfloat afDiffuseBlue  [] = {0.00, 0.00, 0.75, 1.00};   // 漫射 蓝    
static const GLfloat afSpecularWhite[] = {1.00, 1.00, 1.00, 1.00};   // 反射 白    
static const GLfloat afSpecularRed  [] = {1.00, 0.25, 0.25, 1.00};   // 反射 红    
static const GLfloat afSpecularGreen[] = {0.25, 1.00, 0.25, 1.00};   // 反射 绿    
static const GLfloat afSpecularBlue [] = {0.25, 0.25, 1.00, 1.00};   // 反射 蓝    

GLenum    ePolygonMode = GL_FILL;    

GLfloat   fTargetValue = 100.0;    
GLboolean bLight = true;    

void vIdle();    
void vDrawScene();     
void vResize(GLsizei, GLsizei);    
void vKeyboard(unsigned char cKey, int iX, int iY);    
void vSpecial(int iKey, int iX, int iY);    

void spinDisplay();    
void fYawDisplay(void);    
void myMouseCall(int button, int state, int x ,int y);    

GLvoid vMarchingCubes();    
GLvoid vMarchCube1(GLfloat fX, GLfloat fY, GLfloat fZ, GLfloat fScale);    

#define NX 200      
#define NY 160    
#define NZ 160     

short int ***data;    
GLfloat HoriRotate  = 90;    
GLfloat VertiRotate = 0;    

GLfloat  Xtranform=-90.0;    
GLfloat  Ytranform= 80.0;    
GLfloat  Ztranform=-10.0;    

GLfloat ZoonAspect=140.0;    
GLfloat ZoomScale=1.0;    
short int themax = 0,themin = 255;    


void main(int argc, char **argv)     
{     
    int i,j,k,c;    
    short int isolevel = 128;    

    FILE *fptr;    
        argc=2;    

    argv[1]="F:\\软件\\OpenGL\\mri.raw";    

        for (i=1;i<argc;i++) {    
        if (strcmp(argv[i],"-i") == 0)    
            isolevel = atof(argv[i+1]);    
    }    

    // Malloc the volumetric data, hardwired size!    
    data = (short int ***)malloc(NX*sizeof(short int **));    
    for (i=0;i<NX;i++)    
        data[i] = (short int **)malloc(NY*sizeof(short int *));    
    for (i=0;i<NX;i++)    
        for (j=0;j<NY;j++)    
            data[i][j] = (short int *)malloc(NZ*sizeof(short int));    

    // Open and read the raw data    
    fprintf(stderr,"Reading data ...\n");    
    if ((fopen_s(fptr,argv[argc-1],"rb")) != NULL) {    
        fprintf(stderr,"File open failed\n");    
        exit(-1);    
    }    
    for (k=0;k<NZ;k++) {    
        for (j=0;j<NY;j++) {    
            for (i=0;i<NX;i++) {    
                if ((c = fgetc(fptr)) == EOF) {    
                    fprintf(stderr,"Unexpected end of file\n");    
                    exit(-1);    
                }    
                data[i][j][k] = c;    

                if (c > themax)    
                    themax = c;    
                if (c < themin)    
                    themin = c;    
            }    
        }    
    }    
    fclose(fptr);    
    fprintf(stderr,"Volumetric data range: %d -> %d\n",themin,themax);    

        GLfloat afPropertiesAmbient [] = {0.25, 0.25, 0.25, 1.00};     
        GLfloat afPropertiesDiffuse [] = {0.75, 0.75, 0.75, 1.00};     
        GLfloat afPropertiesSpecular[] = {1.00, 0.25, 0.25, 1.00};     

        GLsizei iWidth = 640.0;     
        GLsizei iHeight = 480.0;     

        glutInit(&argc, argv);    
        glutInitWindowPosition( 0, 0);    
        glutInitWindowSize(iWidth, iHeight);    
        glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );    
        glutCreateWindow( "Marching Cubes" );    
        glutDisplayFunc( vDrawScene );    
        glutIdleFunc( vIdle );    
        glutReshapeFunc( vResize );    
        glutKeyboardFunc( vKeyboard );    
        glutSpecialFunc( vSpecial );    
        glutMouseFunc(myMouseCall);    

        glClearColor( 0.0, 0.0, 0.0, 1.0 );     
        glClearDepth( 1.0 );     

        glEnable(GL_DEPTH_TEST);     
        glEnable(GL_LIGHTING);    
        glPolygonMode(GL_FRONT_AND_BACK, ePolygonMode);    

        glLightfv( GL_LIGHT0, GL_AMBIENT,  afPropertiesAmbient);     
        glLightfv( GL_LIGHT0, GL_DIFFUSE,  afPropertiesDiffuse);     
        glLightfv( GL_LIGHT0, GL_SPECULAR, afPropertiesSpecular);     
        glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 1.0);     

        glEnable( GL_LIGHT0 );     


        // 材质颜色  ***里外 ***    
        glMaterialfv(GL_BACK,  GL_AMBIENT,   afAmbientRed);     
        glMaterialfv(GL_BACK,  GL_DIFFUSE,   afDiffuseRed);     
        glMaterialfv(GL_FRONT, GL_AMBIENT,   afAmbientWhite);     
        glMaterialfv(GL_FRONT, GL_DIFFUSE,   afDiffuseWhite);     
        glMaterialfv(GL_FRONT, GL_SPECULAR,  afSpecularWhite);     
        glMaterialf( GL_FRONT, GL_SHININESS, 10.0);     

        vResize(iWidth, iHeight);       
        glutMainLoop();     
}    

// 窗口改变响应    
void vResize( GLsizei iWidth, GLsizei iHeight )     
{     
        GLfloat fAspect, fHalfWorldSize = (1.4142135623730950488016887242097/2);     
        glViewport( 0, 0, iWidth, iHeight );     
        glMatrixMode (GL_PROJECTION);    
        glLoadIdentity ();    

        if(iWidth <= iHeight)    
        {    
                fAspect = (GLfloat)iHeight / (GLfloat)iWidth;    
                glOrtho(-fHalfWorldSize*ZoonAspect, fHalfWorldSize*ZoonAspect, -fHalfWorldSize*fAspect*ZoonAspect,    
                        fHalfWorldSize*fAspect*ZoonAspect, -10*fHalfWorldSize*ZoonAspect, 10*fHalfWorldSize*ZoonAspect);    

         }    
        else    
        {    
                fAspect = (GLfloat)iWidth / (GLfloat)iHeight;     
                glOrtho(-fHalfWorldSize*fAspect*ZoonAspect, fHalfWorldSize*fAspect*ZoonAspect, -fHalfWorldSize*ZoonAspect,    
                        fHalfWorldSize*ZoonAspect, -10*fHalfWorldSize*ZoonAspect, 10*fHalfWorldSize*ZoonAspect);    

        }    
        glMatrixMode( GL_MODELVIEW );    

}    

void spinDisplay(void)    
{    
    HoriRotate = HoriRotate+10.0;    
    if (HoriRotate >360.0)    
        HoriRotate = HoriRotate -360.0;    
    glutPostRedisplay();    
}    
void fYawDisplay(void)    
{    
    VertiRotate = VertiRotate+10.0;    
    if (VertiRotate >360.0)    
        VertiRotate = VertiRotate -360.0;    
    glutPostRedisplay();    

}    

// 鼠标响应    
void myMouseCall(int button, int state, int x ,int y)    
{    
    switch (button)    
    {    
    case GLUT_LEFT_BUTTON:    
        if (state == GLUT_DOWN)    
            spinDisplay();    
        break;    


    case GLUT_RIGHT_BUTTON:    
        if(state == GLUT_DOWN)    
            fYawDisplay();    
        break;    

    case GLUT_WHEEL_UP:    

            ZoomScale=ZoomScale+0.05;    
            glutPostRedisplay();    
        break;    

    case GLUT_WHEEL_DOWN:    
            ZoomScale=ZoomScale-0.05;    
            glutPostRedisplay();    

        break;    


    default:    
        break;    
    }    
}    

// 键盘响应    
void vKeyboard(unsigned char cKey, int iX, int iY)    
{    
        switch(cKey)    
        {    
                case 'w' :    
                {    
                        if(ePolygonMode == GL_LINE)    
                        {    
                                ePolygonMode = GL_FILL;    
                                glutPostRedisplay();    
                        }    
                        else    
                        {    
                                ePolygonMode = GL_LINE;    
                                glutPostRedisplay();    
                        }    
                        glPolygonMode(GL_FRONT_AND_BACK, ePolygonMode);    
                } break;    


                case 'l' :    
                {    
                        if(bLight)    
                        {    
                                glDisable(GL_LIGHTING);//use vertex colors    
                                glutPostRedisplay();    
                        }    
                        else    
                        {    
                                glEnable(GL_LIGHTING);//use lit material color    
                                glutPostRedisplay();    
                        }    

                        bLight = !bLight;    
                };    
        }    
}    

//特殊键响应 上下左右 PaUP PaDn    
void vSpecial(int iKey, int iX, int iY)    
{    
        switch(iKey)    
        {    
                case GLUT_KEY_F1 :    
                {    
                    ZoonAspect-=10;    
                    glutReshapeFunc( vResize );    

                } break;    


        ////////////////////////////////////////////    
                case GLUT_KEY_PAGE_UP :    
                {    
                    if(fTargetValue<=themax-1)    
                    {    
                    fTargetValue=fTargetValue+1;    
                    }    
                    else    
                    {    
                        fTargetValue=themax;    
                    }    
                    glutPostRedisplay();    


                } break;    
                case GLUT_KEY_PAGE_DOWN :    
                {    
                    if(fTargetValue>=themin+1)    
                    {    
                    fTargetValue=fTargetValue-1;    
                    }    
                    else    
                    {    
                        fTargetValue=themin;    
                    }    
                    glutPostRedisplay();    

                } break;     
                case GLUT_KEY_UP :    // 上    
                {    
                      Ytranform+=10.0;    
                      glutPostRedisplay();    
                } break;    

                 case GLUT_KEY_DOWN :   // 下    
                {    
                      Ytranform-=10.0;    
                      glutPostRedisplay();    
                } break;    

                case GLUT_KEY_LEFT :    // 左    
                {    
                        Xtranform-=10.0;    
                        glutPostRedisplay();    
                } break;    

                case GLUT_KEY_RIGHT :   //  右    
                {    
                        Xtranform+=10.0;    
                        glutPostRedisplay();    
                } break;    
        }    
}    


void vIdle()//   程序空闲时    
{    
        // 重绘函数    
        //glutPostRedisplay();    

}    

void vDrawScene() // 绘制场景    
{     

        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );     

        glPushMatrix();     


        glTranslatef(Xtranform, Ytranform, Ztranform);     
        /*printf("%f,  %f,  %f \n" ,Xtranform, Ytranform, Ztranform );  
        printf("%f,  %f \n" ,VertiRotate, HoriRotate);*/    
        glRotatef(     HoriRotate, 1.0, 0.0, 0.0);    
        glRotatef(     0.0, 0.0, 1.0, 0.0);    
        glRotatef(     VertiRotate, 0.0, 0.0, 1.0);    

        glScaled(ZoomScale,ZoomScale,ZoomScale);    

        glPushAttrib(GL_LIGHTING_BIT);    
                glDisable(GL_LIGHTING);    
               /* glColor3f(1.0, 1.0, 1.0);  
                glutWireCube(100.0); */    
        glPopAttrib();     


        glBegin(GL_TRIANGLES);    
                vMarchingCubes();    
        glEnd();    

        glPopMatrix();     

        glutSwapBuffers();     
}    

//计算交点坐标相对于val1的偏移(巧妙地利用了边的方向)  
GLfloat fGetOffset(GLfloat fValue1, GLfloat fValue2, GLfloat fValueDesired)        
{    
        GLdouble fDelta = fValue2 - fValue1;    

        if(fDelta == 0.0)    
        {    
                return 0.5;    
        }    
        return (fValueDesired - fValue1)/fDelta;    
}    

// 根据 位置 以及 法向量 产生颜色        
GLvoid vGetColor(GLvector &rfColor, GLvector &rfPosition, GLvector &rfNormal)    
{    
        GLfloat fX = rfNormal.fX;    
        GLfloat fY = rfNormal.fY;    
        GLfloat fZ = rfNormal.fZ;    
        rfColor.fX = (fX > 0.0 ? fX : 0.0) + (fY < 0.0 ? -0.5*fY : 0.0) + (fZ < 0.0 ? -0.5*fZ : 0.0);    
        rfColor.fY = (fY > 0.0 ? fY : 0.0) + (fZ < 0.0 ? -0.5*fZ : 0.0) + (fX < 0.0 ? -0.5*fX : 0.0);    
        rfColor.fZ = (fZ > 0.0 ? fZ : 0.0) + (fX < 0.0 ? -0.5*fX : 0.0) + (fY < 0.0 ? -0.5*fY : 0.0);    
}    
//向量标准化    
GLvoid vNormalizeVector(GLvector &rfVectorResult, GLvector &rfVectorSource)      
{    
        GLfloat fOldLength;    
        GLfloat fScale;    

        fOldLength = sqrtf( (rfVectorSource.fX * rfVectorSource.fX) +    
                            (rfVectorSource.fY * rfVectorSource.fY) +    
                            (rfVectorSource.fZ * rfVectorSource.fZ) );    

        if(fOldLength == 0.0)    
        {    
                rfVectorResult.fX = rfVectorSource.fX;    
                rfVectorResult.fY = rfVectorSource.fY;    
                rfVectorResult.fZ = rfVectorSource.fZ;    
        }    
        else    
        {    
                fScale = 1.0/fOldLength;    
                rfVectorResult.fX = rfVectorSource.fX*fScale;    
                rfVectorResult.fY = rfVectorSource.fY*fScale;    
                rfVectorResult.fZ = rfVectorSource.fZ*fScale;    
        }    
}    

//计算交点的梯度(法向量)    
GLvoid vGetNormal(GLvector &rfNormal, GLfloat fX, GLfloat fY, GLfloat fZ)                     
{    
      if (  fX>1 && fX<NX-1 &&    fY>1 && fY<NY-1  &&  fZ>1 && fZ<NZ-1    )    
      {    
        rfNormal.fX = (GLfloat)data[(int)fX-1][ (int)fY][ (int)fZ] - (GLfloat)data[(int)fX+1][ (int)fY] [(int)fZ];    
        rfNormal.fY = (GLfloat)data[(int)fX] [(int)fY-1] [(int)fZ] - (GLfloat)data[(int)fX][(int) fY+1][(int)fZ];    
        rfNormal.fZ = (GLfloat)data[(int)fX][(int)fY][(int) fZ-1] - (GLfloat)data[(int)fX][ (int)fY][ (int)fZ+1];    
        vNormalizeVector(rfNormal, rfNormal);    
      }    
}    

//计算单个移动立方体内部的三角面片并进行渲染   
GLvoid vMarchCube1(GLfloat fX, GLfloat fY, GLfloat fZ, GLfloat fScale)                     
{    
        extern GLint aiCubeEdgeFlags[256];    
        extern GLint a2iTriangleConnectionTable[256][16];    

        GLint iCorner, iVertex, iVertexTest, iEdge, iTriangle, iFlagIndex, iEdgeFlags;    
        GLfloat fOffset;    
        GLvector sColor;    
        GLfloat afCubeValue[8];    
        GLvector asEdgeVertex[12];    
        GLvector asEdgeNorm[12];    

        //保存每一个Cube的八个顶点。           
        for(iVertex = 0; iVertex < 8; iVertex++)    
        {    
            afCubeValue[iVertex] =(GLfloat)data[(int)(fX + a2fVertexOffset[iVertex][0])]    
                                                  [(int)(fY + a2fVertexOffset[iVertex][1])]    
                                                 [(int)(fZ + a2fVertexOffset[iVertex][2])] ;    
        }    

        //找出哪些顶点是在等值面内,哪些是在等值面外    
        iFlagIndex = 0;    
        for(iVertexTest = 0; iVertexTest < 8; iVertexTest++)    
        {    
                if(afCubeValue[iVertexTest] <= fTargetValue)     
                        iFlagIndex |= 1<<iVertexTest;    
        }    

        //找到与等值面有交点的边    
        iEdgeFlags = aiCubeEdgeFlags[iFlagIndex];    

        //不存在三角面片    
        if(iEdgeFlags == 0)     
        {    
                return;    
        }    
        //找到每一个与等值面相交的边,并且找到等值面在这一点的法向量     
        for(iEdge = 0; iEdge < 12; iEdge++)    
        {    
                //如果在这一个边上有交点的话    
                if(iEdgeFlags & (1<<iEdge))    
                {    
                        fOffset = fGetOffset(afCubeValue[ a2iEdgeConnection[iEdge][0] ],     
                                                     afCubeValue[ a2iEdgeConnection[iEdge][1] ], fTargetValue);    


                        //计算交点的坐标    
                        asEdgeVertex[iEdge].fX = fX + (a2fVertexOffset[ a2iEdgeConnection[iEdge][0] ][0]  +  fOffset * a2fEdgeDirection[iEdge][0]) ;//* fScale;    
                        asEdgeVertex[iEdge].fY = fY + (a2fVertexOffset[ a2iEdgeConnection[iEdge][0] ][1]  +  fOffset * a2fEdgeDirection[iEdge][1]) ;//* fScale;    
                        asEdgeVertex[iEdge].fZ = fZ + (a2fVertexOffset[ a2iEdgeConnection[iEdge][0] ][2]  +  fOffset * a2fEdgeDirection[iEdge][2]) ;//* fScale;    
                       //计算交点的法向量    
                        vGetNormal(asEdgeNorm[iEdge], asEdgeVertex[iEdge].fX, asEdgeVertex[iEdge].fY, asEdgeVertex[iEdge].fZ);    
                }    
        }    


        //画出等值面三角形 每个立方体最多有5个三角形    
        for(iTriangle = 0; iTriangle < 5; iTriangle++)    
        {    
                if(a2iTriangleConnectionTable[iFlagIndex][3*iTriangle] < 0)    
                        break;    
                for(iCorner = 0; iCorner < 3; iCorner++)    
                {    
                        iVertex = a2iTriangleConnectionTable[iFlagIndex][3*iTriangle+iCorner];    

                        vGetColor(sColor, asEdgeVertex[iVertex], asEdgeNorm[iVertex]);    
                        glColor3f(sColor.fX, sColor.fY, sColor.fZ);    
                        glNormal3f(asEdgeNorm[iVertex].fX,   asEdgeNorm[iVertex].fY,   asEdgeNorm[iVertex].fZ);    
                        glVertex3f(asEdgeVertex[iVertex].fX, asEdgeVertex[iVertex].fY, asEdgeVertex[iVertex].fZ);    
                }    
        }    
}    

//遍历所有体素,计算所有的等值点,构造所有三角面片并渲染   
GLvoid vMarchingCubes()    
{    
        GLint iX, iY, iZ;    
        for(iX = 0; iX < NX-1; iX++)    
        for(iY = 0; iY < NY-1; iY++)    
        for(iZ = 0; iZ < NZ-1; iZ++)    
        {    
                vMarchCube(iX, iY, iZ, 1);    
        }    
        printf("finish one Draw ! !\n");    
}    
//相交边:一个顶点在等值面外,另一个在等值面内  
//立方体顶点的两种状态:在等值面内,或在等值面外,立方体顶点的状态可能有2^8=256种    
//下表对应的是顶点状态下,12条边的状态。  
//例如:stateVertex = 0000 0001;那么0、3、8号边为相交边 stateEdge = 0001 0000 0101 = 109  
GLint aiCubeEdgeFlags[256]=    
{    
        0x000, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,     
        0x190, 0x099, 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,     
        0x230, 0x339, 0x033, 0x13a, 0x636, 0x73f, 0x435, 0x53c, 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,     
        0x3a0, 0x2a9, 0x1a3, 0x0aa, 0x7a6, 0x6af, 0x5a5, 0x4ac, 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,     
        0x460, 0x569, 0x663, 0x76a, 0x066, 0x16f, 0x265, 0x36c, 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,     
        0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0x0ff, 0x3f5, 0x2fc, 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,     
        0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x055, 0x15c, 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,     
        0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0x0cc, 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,     
        0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, 0x0cc, 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,     
        0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, 0x15c, 0x055, 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,     
        0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, 0x2fc, 0x3f5, 0x0ff, 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,     
        0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, 0x36c, 0x265, 0x16f, 0x066, 0x76a, 0x663, 0x569, 0x460,     
        0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, 0x4ac, 0x5a5, 0x6af, 0x7a6, 0x0aa, 0x1a3, 0x2a9, 0x3a0,     
        0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x033, 0x339, 0x230,     
        0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x099, 0x190,     
        0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x000    
};    
// 立方体顶点每种(256种)状态对应的相交边情况,并将相交边进行排列得到顺序一致的三角面片(逆时针)  
// 例如::顶点状态:0000 0011 -> 相交边状态:0011 0000 1010 = 0x30a -> 三角面片组合:1-8-3 9-8-1   
GLint a2iTriangleConnectionTable[256][16] =      
{    
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1},    
        {3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1},    
        {3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1},    
        {3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1},    
        {9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1},    
        {9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},    
        {2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1},    
        {8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1},    
        {9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},    
        {4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1},    
        {3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1},    
        {1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1},    
        {4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1},    
        {4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1},    
        {9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1},    
        {1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},    
        {5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1},    
        {2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1},    
        {9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},    
        {0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},    
        {2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1},    
        {10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1},    
        {4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1},    
        {5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1},    
        {5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1},    
        {9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1},    
        {0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1},    
        {1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1},    
        {10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1},    
        {8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1},    
        {2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1},    
        {7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1},    
        {9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1},    
        {2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1},    
        {11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1},    
        {9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1},    
        {5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1},    
        {11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1},    
        {11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},    
        {1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1},    
        {9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1},    
        {5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1},    
        {2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},    
        {0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},    
        {5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1},    
        {6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1},    
        {0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1},    
        {3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1},    
        {6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1},    
        {5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1},    
        {1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},    
        {10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1},    
        {6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1},    
        {1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1},    
        {8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1},    
        {7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1},    
        {3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},    
        {5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1},    
        {0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1},    
        {9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1},    
        {8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1},    
        {5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1},    
        {0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1},    
        {6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1},    
        {10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1},    
        {10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1},    
        {8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1},    
        {1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1},    
        {3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1},    
        {0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1},    
        {10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1},    
        {0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1},    
        {3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1},    
        {6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1},    
        {9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1},    
        {8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1},    
        {3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1},    
        {6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1},    
        {0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1},    
        {10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1},    
        {10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1},    
        {1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1},    
        {2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1},    
        {7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1},    
        {7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1},    
        {2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1},    
        {1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1},    
        {11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1},    
        {8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1},    
        {0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1},    
        {7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},    
        {10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},    
        {2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},    
        {6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1},    
        {7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1},    
        {2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1},    
        {1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1},    
        {10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1},    
        {10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1},    
        {0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1},    
        {7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1},    
        {6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1},    
        {8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1},    
        {9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1},    
        {6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1},    
        {4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1},    
        {10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1},    
        {8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1},    
        {0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1},    
        {1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1},    
        {8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1},    
        {10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1},    
        {4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1},    
        {10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},    
        {5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},    
        {11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1},    
        {9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},    
        {6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1},    
        {7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1},    
        {3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1},    
        {7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1},    
        {9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1},    
        {3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1},    
        {6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1},    
        {9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1},    
        {1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1},    
        {4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1},    
        {7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1},    
        {6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1},    
        {3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1},    
        {0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1},    
        {6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1},    
        {0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1},    
        {11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1},    
        {6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1},    
        {5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1},    
        {9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1},    
        {1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1},    
        {1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1},    
        {10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1},    
        {0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1},    
        {5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1},    
        {10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1},    
        {11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1},    
        {9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1},    
        {7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1},    
        {2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1},    
        {8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1},    
        {9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1},    
        {9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1},    
        {1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1},    
        {9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1},    
        {9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1},    
        {5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1},    
        {0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1},    
        {10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1},    
        {2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1},    
        {0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1},    
        {0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1},    
        {9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1},    
        {5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1},    
        {3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1},    
        {5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1},    
        {8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1},    
        {9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1},    
        {0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1},    
        {1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1},    
        {3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1},    
        {4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1},    
        {9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1},    
        {11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1},    
        {11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1},    
        {2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1},    
        {9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1},    
        {3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1},    
        {1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1},    
        {4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1},    
        {4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1},    
        {0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1},    
        {3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1},    
        {3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1},    
        {0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1},    
        {9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1},    
        {1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},    
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}    
};   

2.部分输出结果

这里写图片描述

这里写图片描述

不同等值面绘制的图像

这里写图片描述

这里写图片描述

使用顶点颜色进行绘制+放缩变换

这里写图片描述

三角面片重建细节

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值