COLLADAの穴(解決?)

三角形分割用の頂点データと、表示に使う頂点データが別だった

#include<windows.h>
#include<stdio.h>
#include "triangulate.h"
#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/glaux.h>

CvPolygon cvp;
CvVertexNode cvvn[] = {
    {0, NULL}, {1, NULL}, {2, NULL}, {3, NULL},
    {-1, NULL}, {4, NULL}, {5, NULL}, {6, NULL}, {7, NULL},
    {-1, NULL}, {8, NULL}, {9, NULL}, {10, NULL}, {11, NULL},};
// 表示用頂点リスト
CvVertex cvv2[] = {
    {{-5, 4, 0}, 0},
    {{-5,-4, 0}, 0},
    {{ 5,-4, 0}, 0},
    {{ 5, 4, 0}, 0},
    {{ 0, 0, 0}, 0}, // ここと
    {{-1, 2, 0}, 0},
    {{-1,-2, 0}, 0},
    {{-4,-2, 0}, 0},
    {{-4, 2, 0}, 0},
    {{ 0, 0, 0}, 0}, // ここに空白の頂点が必要だった
    {{ 4, 2, 0}, 0},
    {{ 4,-2, 0}, 0},
    {{ 1,-2, 0}, 0},
    {{ 1, 2, 0}, 0},};

// 三角形分割用頂点リスト
CvVertex cvv[] = {
    {{-5, 4, 0}, 0},
    {{-5,-4, 0}, 0},
    {{ 5,-4, 0}, 0},
    {{ 5, 4, 0}, 0},
    {{-1, 2, 0}, 0},
    {{-1,-2, 0}, 0},
    {{-4,-2, 0}, 0},
    {{-4, 2, 0}, 0},
    {{ 4, 2, 0}, 0},
    {{ 4,-2, 0}, 0},
    {{ 1,-2, 0}, 0},
    {{ 1, 2, 0}, 0},};

void resize(int w, int h)
{
    glViewport(0, 0, w, h);

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective(30.0, (double)w / (double)h, 1.0, 32767);
    glTranslated(0.0, 0.0, -5.0);
    gluLookAt(0.0, 12.0, 42.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}

void disp()
{
    int i, j, k;

    glClearColor(0 , 0 , 0 , 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPolygonMode(GL_FRONT,GL_LINE);
    glBegin(GL_TRIANGLES);
    for (i = 0; i < cvp.Triangulation.NumOfTri; i++) {
            printf("%d, %d, %d\n",
                cvp.Triangulation.Triangles[i].Vertex[0],
                cvp.Triangulation.Triangles[i].Vertex[1],
                cvp.Triangulation.Triangles[i].Vertex[2]);
            for (j = 0; j < 3; j++) {
                k = cvp.Triangulation.Triangles[i].Vertex[j];
                glVertex3f(cvv2[k].X,  cvv2[k].Y, cvv2[k].Z);
            }
        }
    glEnd();

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glFlush();
}

int init(int argc, char *argv[])
{
    glutInit(&argc , argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA| GLUT_DEPTH);

    glutCreateWindow("COLLADA穴");
    glutDisplayFunc(disp);
    glutReshapeFunc(resize);

    glMatrixMode(GL_PROJECTION);
    glEnable(GL_DEPTH_TEST);
}

void initPolygon()
{
    int i;

    cvp.NumOfVertexNodes = 14;
    cvp.VertexNodes = cvvn;

    // ポリゴン分割
    Cv_PolygonTriangulate(&cvp, cvv, 12);
}

main(int argc, char *argv[])
{
    initPolygon();
    init(argc, argv);
    glutMainLoop();
}