COLLADAサンプルコード

cvlibを使用したcviewerを使って頂点データを表示するサンプルを作りました

// main.c
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <direct.h>
#include <GL/glut.h>
#include <Platform/Platform.h>
#include <DAE/DAE.h>
#include <Cv/Scene.h>
#include <Cv/gui.h>

static CvScene*    Scene = NULL;

int dae_PrintVaMessage(int LTypeIn, const char* LMessage, ...)
{
    va_list    LAL;
    char LTmpStr[4096];

    va_start(LAL, LMessage);
    vsprintf(LTmpStr, LMessage, LAL);
    va_end(LAL);
    printf("%s\n", LTmpStr);fflush(stdout);
    return(0);
}

static void printVertex(CvNode* LNode, CvMesh* LMesh, unsigned int LPolyGroupIndex, CvMaterial* LMaterial)
{
    CvPolyGroup*    LPolyGroup = LMesh->PolyGroups[LPolyGroupIndex];
    int        LNumOfTextures = LMaterial ? LMaterial->Textures.Count : 0;

    if(LPolyGroup->GLArray)
    {
        CvAttribute*    LAttribute=&LPolyGroup->GLAttributeTypes.values[0];
        CvIndex    LC,LN=LPolyGroup->GLAttributeTypes.Count;
        unsigned int    LTotalStride=0;

        if(LN)
        {
            CvAttribute*    LBack = CvVectorBackRef(CvAttribute)(&LPolyGroup->GLAttributeTypes);

            LTotalStride += LBack->Offset+LBack->NumOfFloats;
        }

        LTotalStride *= sizeof(CvGLCoordinate);
        LAttribute=&LPolyGroup->GLAttributeTypes.values[0];
        {
            float *v = &LPolyGroup->GLArray[0];
            int i;

            for (i = 0; i < LPolyGroup->GLTriangleCount; i++) {
                printf("%f, %f, %f\n", v[i], v[i+1], v[i+2]);
            }

        }
        LAttribute=&LPolyGroup->GLAttributeTypes.values[0];

        for(LC=0;LC<LN;++LC,LAttribute++) CvGL_ArrayCleanup(LAttribute);    // disables enabled state
    }
}

static void printNode(CvNode* LNode, CvScene* LScene)
{
    CvGeometry*    LGeometry;
    CvMesh*    LMesh;
    CvPolyGroup*    LPolyGroup;
    CvMaterial*    LMaterial;
    CvIndex    LGmC, LC, LN;
    const CvIndex    LGmN = LNode->NumOfGeometries;

    for(LGmC = 0;LGmC < LGmN;++LGmC)
    {
        LGeometry = LNode->Geometries[LGmC];

        switch(LGeometry->GeometryType)    {
        case CvGEO_MESH:
            LMesh = (CvMesh*)LGeometry;

            LN = LMesh->NumOfPolyGroups;

            for(LC = 0;LC < LN;++LC)
            {
                LPolyGroup = LMesh->PolyGroups[LC];
                LMaterial = LPolyGroup->Material;

                if(LMaterial)
                {
                    printVertex(LNode, LMesh, LC, LMaterial);
                }
            }
            break;
        }
    }

    if(LNode->Child) printNode(LNode->Child, LScene);
    if(LNode->NextSibling) printNode(LNode->NextSibling, LScene);
}

int main(int LArgC, char** LArgV)
{
    char*    LFileName = NULL;
    char    LTitle[256];
    DAE_Verbosity = 0;

    if (Cv_SceneRead("D:\\COLLADA\\examples\\cube.xml", &Scene) == CvIO_SUCCESS) {
        CvNode*    LNode;
        CvNode*    LRootNode;
        CvIndex    LRNC, LRNN = Scene->NumOfRootNodes;
        for(LRNC = 0;LRNC < LRNN;LRNC++) {
            LRootNode = LNode = Scene->RootNodes[LRNC];
            printNode(LNode, &Scene);
        }
    }

    return(0);
}
  • 結果


  • 間違っていました
            for (i = 0; i < LPolyGroup->GLTriangleCount*3; i++) {
                float *v2 = v + (6) * i;
                printf("%f, %f, %f\n", v2[0], v2[1], v2[2]);
            }

でした