美文网首页
记一次FbxSdk导出四边面的问题

记一次FbxSdk导出四边面的问题

作者: GS_88 | 来源:发表于2022-09-19 15:17 被阅读0次

    记一次FbxSdk导出四边面的问题 · 语雀 (yuque.com)

    1、使用FbxSdk,导出四边面的代码如下:

    static FbxMesh* CreateMeshAndWriteVertices(FbxScene* mScene, const tFBX_MESH_VERTEX* vertices, int verticesCount)
    {
        FbxMesh* mesh = FbxMesh::Create(mScene, "mesh");
    
        mesh->InitControlPoints(verticesCount);
        FbxVector4* lControlPoints = mesh->GetControlPoints();
    
        for (int i = 0; i < mesh->GetControlPointsCount(); ++i)
            {
                const tFBX_MESH_VERTEX& inVtx = vertices[i];
                FbxVector4 cp(inVtx.pos[0], inVtx.pos[1], inVtx.pos[2]);
                lControlPoints[i] = cp;
            }
    
        // 此处省略若干设置法线和colors的代码
    
        return mesh;
    }
    
    void ExportCore::WriteQuadMesh(const char* nodePath, const tFBX_MESH_VERTEX* vertices,
        int verticesCount, const tFBX_MESH_QUAD* quads, int quadsCount)
    {
        FbxMesh* mesh = CreateMeshAndWriteVertices(mScene, vertices, verticesCount, vertexFlag);
    
        // Create the quad's polygon
        for (int i = 0; i < quadsCount; ++i)
        {
            mesh->BeginPolygon();
            mesh->AddPolygon(quads[i].i0); // Control point 0
            mesh->AddPolygon(quads[i].i1); // Control point 1
            mesh->AddPolygon(quads[i].i2); // Control point 2
            mesh->AddPolygon(quads[i].i3); // Control point 3
            mesh->EndPolygon();
        }
    
        FbxNode* node = _GetOrCreateNodeByPath(nodePath);
        node->SetNodeAttribute(mesh);
    }
    

    2、然后意外地发现,当第一个四边面退化成三角形时,fbx在3DMax里面打开,会发现缺面

    圆形第一个四边面缺面

    3、用FbxSdk导入fbx,并打印这些顶点和索引,发现数据是正确的。因为FbxSDK没有源码,只能猜测是它的bug,或者设计如此。

    4、解决方法:

    直接把第一个四边面的索引设置重复2次,可以解决

    相关文章

      网友评论

          本文标题:记一次FbxSdk导出四边面的问题

          本文链接:https://www.haomeiwen.com/subject/cbhvortx.html