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]); }
でした