FBX解析为openGL显示

时间:2016-08-08 09:34:51

标签: ios iphone opengl-es indices fbx

我想解析FBX file并在iPhone上通过openGL显示它。 目前尝试使用*.fbx解析FBX SDK from Autodesk格式。

发现这个link很有用,但仍有一些误解 - 我猜我收到的指数是不正确的。我在blender中创建了简单的多维数据集,并将该文件导出到*.fbx。如果我通过FBX Review应用程序打开此文件 - 所有显示完美,但当我尝试绘制此立方体时 - 看起来我解析的某些数据不正确/或部分。

要获得指数我使用下一个代码

int numIndices = pMesh->GetPolygonVertexCount();
int *indices = new int [numIndices];
indices = pMesh->GetPolygonVertices();

int polygonCount = pMesh->GetPolygonCount();
int totalObjSize = 0;
for (int i = 0; i < polygonCount; ++i) {
    totalObjSize += pMesh->GetPolygonSize(i);
}

结果:

----Indices----24---: 0 1 2 3 4 7 6 5 0 4 5 1 1 5 6 2 2 6 7 3 4 0 3 7

----Coordinates(Vertises)----72
1 1 -1 
1 -1 -1 
-1 -1 -1 
-1 1 -1  
1 0.999999 1 
-1 1 1 
-1 -1 1 
0.999999 -1 1 
1 1 -1  
1 0.999999 1 
0.999999 -1 1 
1 -1 -1 
1 -1 -1 
0.999999 -1 1 
-1 -1 1 
-1 -1 -1 
-1 -1 -1 
-1 -1 1 
-1 1 1 
-1 1 -1  
 1 0.999999 1 
 1 1 -1 
-1 1 -1 
-1 1 1 

----Texture UV----48
0.499999 9.7692e-05
0.499999 0.333364
0.250049 0.333364
0.250049 9.78112e-05
0.250049 0.666633
0.499999 0.666633
0.499999 0.9999
0.250049 0.9999
0.74995 0.333366
0.74995 0.666633
0.5 0.666633
0.5 0.333367
0.499998 0.333366
0.499998 0.666632
0.250048 0.666633
0.250048 0.333366
0.25005 0.333367
0.25005 0.666633
0.000100091 0.666633
0.000100024 0.333367
0.749953 0.666639
0.749953 0.333373
0.999903 0.333373
0.999903 0.666639

----Normal----72
0 0 -1 
0 0 -1 
0 0 -1 
0 0 -1 
0 0 1 
0 0 1 
0 0 1 
0 0 1 
1 0 0 
1 0 0 
1 0 0 
1 0 0 
0 -1 0 
0 -1 0 
0 -1 0 
0 -1 0 
-1 0 0 
-1 0 0 
-1 0 0 
-1 0 0 
0 1 0 
0 1 0 
0 1 0 
0 1 0 

此外我能够解析顶点(坐标)和纹理UV和法线 - 所有看起来都是正确的(我比较可以通过link获得的样本应用ImportScene获得的值得到的值

因此,当我尝试使用openGL中的所有数据时,我得到了一些意想不到的对象。

问题是 - 我正确解析FBX文件中的索引吗?

关于在openGL中绘制obj也是this is related my question

--- --- UPDATE

我还发现这个索引不正确(错过了有序而不是已满),所以如何从FBX文件生成正确的索引顺序的问题?

1 个答案:

答案 0 :(得分:0)

如果有人面临同样的问题,我会发布自己的解决方案(也许还有另一种方法可以做到这一点,这更可能是解决方法而不是真正的解决方案,所以如果有找到另一种方式 - 它会很棒)

    int indicessCount = index;
    int *testIndices = new int [indicessCount]; 
        index = 0;
    pairCounter = 0;
    int indexElement = 0;
    for (int i = 0; i < polygonCount; i++) {
        int lPolygonSize = pMesh->GetPolygonSize(i);
        for (int j = 0; j< lPolygonSize; j++) {
            _displayModel.indises[index++] = indexElement + j;
            if (j==2) {
                if ((pairCounter % 1)) {
                    int firstIndex = index-3;
                    int secondIndex = index-1;
                    _displayModel.indises[index++] = _displayModel.indises[secondIndex];
                    _displayModel.indises[index++] = _displayModel.indises[firstIndex];
                    pairCounter = 0;
                }
                pairCounter++;
            }
        }
    indexElement += lPolygonSize;
}

也会让你的场景转移

FbxGeometryConverter converter(_fbxManager);
converter.Triangulate(_fbxScene, true);