在FBX中,您如何知道哪些vert索引对应哪些控制点索引?

时间:2018-04-27 02:25:27

标签: c++ directx-11 fbx

我目前正在尝试加载一个用于DirectX的FBX网格,但是我的FBX文件有由vert索引存储的UV和控制点索引存储的法线。我如何知道哪些顶点具有哪个控制点的值?

我的加载位置,uvs和法线的代码是直接从fbx示例代码中删除的,但我可以在需要时发布它。

编辑:根据要求,以下是我正在谈论的代码部分。

UV代码将通过vert索引进入映射模式的if语句,而普通代码通过ctrl point设置为映射模式

//load uvs
if (lUVElement->GetMappingMode() == FbxGeometryElement::eByControlPoint)
                {
                    for (int lPolyIndex = 0; lPolyIndex < lPolyCount; ++lPolyIndex)
                    {
                        // build the max index array that we need to pass into MakePoly
                        const int lPolySize = mesh->GetPolygonSize(lPolyIndex);
                        for (int lVertIndex = 0; lVertIndex < lPolySize; ++lVertIndex)
                        {

                            //get the index of the current vertex in control points array
                            int lPolyVertIndex = mesh->GetPolygonVertex(lPolyIndex, lVertIndex);

                            //the UV index depends on the reference mode
                            int lUVIndex = lUseIndex ? lUVElement->GetIndexArray().GetAt(lPolyVertIndex) : lPolyVertIndex;

                            lUVValue = lUVElement->GetDirectArray().GetAt(lUVIndex);

                            _floatVec->push_back((float)lUVValue.mData[0]);
                            _floatVec->push_back((float)lUVValue.mData[1]);
                        }
                    }
                }
                else if (lUVElement->GetMappingMode() == FbxGeometryElement::eByPolygonVertex)
                {
                    int lPolyIndexCounter = 0;
                    for (int lPolyIndex = 0; lPolyIndex < lPolyCount; ++lPolyIndex)
                    {
                        // build the max index array that we need to pass into MakePoly
                        const int lPolySize = mesh->GetPolygonSize(lPolyIndex);
                        for (int lVertIndex = 0; lVertIndex < lPolySize; ++lVertIndex)
                        {
                            if (lPolyIndexCounter < lIndexCount)
                            {

                                //the UV index depends on the reference mode
                                int lUVIndex = lUseIndex ? lUVElement->GetIndexArray().GetAt(lPolyIndexCounter) : lPolyIndexCounter;

                                lUVValue = lUVElement->GetDirectArray().GetAt(lUVIndex);

                                _floatVec->push_back((float)lUVValue.mData[0]);
                                _floatVec->push_back((float)lUVValue.mData[1]);

                                lPolyIndexCounter++;
                            }
                        }
                    }
                }

//and now normals
if (lNormalElement->GetMappingMode() == FbxGeometryElement::eByControlPoint)
                {
                    //Let's get normals of each vertex, since the mapping mode of normal element is by control point
                    for (int lVertexIndex = 0; lVertexIndex < mesh->GetControlPointsCount(); lVertexIndex++)
                    {
                        int test = mesh->GetControlPointsCount();
                        int lNormalIndex = 0;
                        //reference mode is direct, the normal index is same as vertex index.
                        //get normals by the index of control vertex
                        if (lNormalElement->GetReferenceMode() == FbxGeometryElement::eDirect)
                            lNormalIndex = lVertexIndex;

                        //reference mode is index-to-direct, get normals by the index-to-direct
                        if (lNormalElement->GetReferenceMode() == FbxGeometryElement::eIndexToDirect)
                            lNormalIndex = lNormalElement->GetIndexArray().GetAt(lVertexIndex);

                        //Got normals of each vertex.
                        FbxVector4 lNormal = lNormalElement->GetDirectArray().GetAt(lNormalIndex);

                        _floatVec->push_back((float)lNormal[0]);
                        _floatVec->push_back((float)lNormal[1]);
                        _floatVec->push_back((float)lNormal[2]);

                    }
                }
                else if (lNormalElement->GetMappingMode() == FbxGeometryElement::eByPolygonVertex)
                {

                            //etc... code wont go here
                        }
                    }
                }
            }

那我怎么知道哪个顶点会有哪些法线?

0 个答案:

没有答案