|  | 
 
| 昨天通过FBX的官方例题写了一个简单的读取顶点坐标的小程序,今天完成昨天没有完成的两件事:读取三角形索引缓冲区和顶点色。 
 box   
 效果如上图所示。昨天绘制的红色Box的顶点色是手动写在程序里的,无论在3DsMax 做的什么颜色的Box在程序里都是红的。今天的程序可以让Box在3DsMax存成什么颜色,就绘制什么颜色。需要强调的一下是昨天的模型无法获取顶点色问题在模型上。主要是不会用3DsMax,误以为染成红色就是顶点色是红的。其实在3DsMaX里染顶点色还颇费一番周折。02例题里加入新的模型,采用了红黄两种颜色。在这里又发现了新的问题,在3DsMax中设定的颜色和显示是来的位置不同,这样又回到了上一个例题中的一个问题,即发现绘制出来的模型位置不准确。到02例题可以肯定的是我们可以读取颜色信息和位置信息,但是会和3DsMax的位置不一样。
 
 本例题完整代码下载:
 http://kuai.xunlei.com/d/SDFEIFHOUQLO备用地址:
 金山快盘附件:FBX_Samples02.zip(3.16MB)
 
 在新的例题中只增加了一个函数:void GetPolygonsInfo(FbxMesh* pMesh)解决了颜色读取,顺便解决了indexbuffer。
 这个代码里有几个地方需要关注一下:复制代码void CFBXLoader::GetPolygonsInfo(FbxMesh* pMesh)
{
        //获取多边形数量
        int lPolygonCount = pMesh->GetPolygonCount();
        FbxVector4* lControlPoints = pMesh->GetControlPoints();        
        int vertexId = 0;
        //遍历每一个多边形
        for (int i = 0; i < lPolygonCount; i++)
        {
                //每一个多边形有几个点组成
                int lPolygonSize = pMesh->GetPolygonSize(i);
                for (int j = 0; j < lPolygonSize; j++)
                {
                        int lControlPointIndex = pMesh->GetPolygonVertex(i, j);
                        iBuffer[3*i+j] = lControlPointIndex;
                        for (int l = 0; l < pMesh->GetElementVertexColorCount(); l++)
                        {
                                FbxGeometryElementVertexColor* leVtxc = pMesh->GetElementVertexColor( l);
                                switch (leVtxc->GetMappingMode())
                                {
                                case FbxGeometryElement::eByControlPoint:
                                        switch (leVtxc->GetReferenceMode())
                                        {
                                        case FbxGeometryElement::eDirect:
                                                break;
                                        case FbxGeometryElement::eIndexToDirect:
                                                {
                                                        int id = leVtxc->GetIndexArray().GetAt(lControlPointIndex);
                                                }
                                                break;
                                        default:
                                                break; // other reference modes not shown here!
                                        }
                                        break;
                                case FbxGeometryElement::eByPolygonVertex:
                                        {
                                                switch (leVtxc->GetReferenceMode())
                                                {
                                                case FbxGeometryElement::eDirect:
                                                        break;
                                                case FbxGeometryElement::eIndexToDirect:
                                                        {
                                                                int id = leVtxc->GetIndexArray().GetAt(vertexId);
                                                                FbxColor vColor = leVtxc->GetDirectArray().GetAt(id);                                                                
                                                                vBuffer[lControlPointIndex].color = D3DCOLOR_COLORVALUE(vColor.mRed,vColor.mGreen,vColor.mBlue,vColor.mAlpha);
                                                        }
                                                        break;
                                                default:
                                                        break; // other reference modes not shown here!
                                                }
                                        }
                                        break;
                                case FbxGeometryElement::eByPolygon: // doesn't make much sense for UVs
                                case FbxGeometryElement::eAllSame:   // doesn't make much sense for UVs
                                case FbxGeometryElement::eNone:       // doesn't make much sense for UVs
                                        break;
                                }
                        }
                vertexId++;
                }
        }
获取每个三角形的索引:虽然这里解决了索引缓冲,但是觉得这并不是最佳的方法,所以帖子的标题中未提及索引缓冲,若果找到了更好的办法,会专门写个帖子介绍用法。
 颜色的获取:下面这行代码的地方是颜色的获取,代码循环较长这里简单介绍一下:复制代码//当前三角形是由哪三个点组成的
int lControlPointIndex = pMesh->GetPolygonVertex(i, j);
iBuffer[3*i+j] = lControlPointIndex;
pMesh->GetElementVertexColorCount()还没搞清楚到底起什么作用。但是如果模型中包含了颜色信息,这个地方就不为0.复制代码 int id = leVtxc->GetIndexArray().GetAt(vertexId);
FbxColor vColor = leVtxc->GetDirectArray().GetAt(id);                                                                
vBuffer[lControlPointIndex].color = D3DCOLOR_COLORVALUE(vColor.mRed,vColor.mGreen,vColor.mBlue,vColor.mAlpha);
通过索引vertexId就可以获取当前顶点id ,  leVtxc->GetIndexArray().GetAt(vertexId);
 vColor = leVtxc->GetDirectArray().GetAt(id);    通过顶点id 获取当前顶点颜色。
 
 这段代码里需要提及的是,作为FBX文件,并不保证组成的模型全部是三角形组成的。因此我们要判断。
 
 
 | 
 |