Ejemplo n.º 1
0
        static Mesh GetMesh(FBXModelPtr model, float scaleFactor, Vector3 rotationOffset)
        {
            if (model.GetVertexCount() <= 0)
            {
                return(null);
            }

            // vertice
            List <Vector3> vertice = new List <Vector3>();

            for (int i = 0; i < model.GetVertexCount(); ++i)
            {
                vertice.Add((FBXVector3ToUnityVector3(model.GetVertex(i)) - FBXVector3ToUnityVector3(model.GetPivotScale())) * scaleFactor);
            }

            // color
            List <Color> colors = new List <Color>();

            for (int i = 0; i < model.GetColorCount(); ++i)
            {
                colors.Add(FBXColorToUnityColor(model.GetColor(i)));
            }

            // uv
            List <List <Vector2> > uvs = new List <List <Vector2> >();

            for (int iUVLayer = 0; iUVLayer < model.GetUVLayerCount(); ++iUVLayer)
            {
                List <Vector2> uv = new List <Vector2>();
                for (int iUV = 0; iUV < model.GetUVCount(iUVLayer); ++iUV)
                {
                    uv.Add(FBXVector2ToUnityVector2(model.GetUV(iUVLayer, iUV)));
                }
                uvs.Add(uv);
            }

            // normal
            List <Vector3> normals = new List <Vector3>();

            for (int i = 0; i < model.GetNormalCount(); ++i)
            {
                normals.Add(FBXVector3ToUnityVector3(model.GetNormal(i)));
            }

            // tangent
            List <Vector4> tangents = new List <Vector4>();

            for (int i = 0; i < model.GetTangentCount(); ++i)
            {
                tangents.Add(FBXVector4ToUnityVector4(model.GetTangent(i)));
            }

            // indice, flip indice
            //Debug.LogFormat( "model has {0} submesh", model.GetMaterialCount() );
            for (int i = 0; i < model.GetMaterialCount(); ++i)
            {
                int materialPolygonCount = model.GetMaterialPolygonCount(i);
                //Debug.LogFormat( "material {0} has {1} polygons", i, materialPolygonCount );
            }

            List <List <int> > indice = new List <List <int> >();

            for (int iMaterial = 0; iMaterial < model.GetMaterialCount(); ++iMaterial)
            {
                List <int> submesh = new List <int>();
                for (int i = 0; i < model.GetIndiceCount(iMaterial); i += 3)
                {
                    submesh.Add(model.GetIndex(iMaterial, i));
                    submesh.Add(model.GetIndex(iMaterial, i + 2));
                    submesh.Add(model.GetIndex(iMaterial, i + 1));
                }
                indice.Add(submesh);
            }

            Mesh mesh = new Mesh();

            mesh.SetVertices(vertice);
            //Debug.LogFormat( "Mesh {0} has {1} vertice", model.GetName(), vertice.Count );

            if (colors.Count > 0)
            {
                mesh.SetColors(colors);
                //Debug.LogFormat( "Mesh {0} has {1} colors", model.GetName(), colors.Count );
            }
            //else
            //{
            //	Debug.LogWarningFormat( "Mesh {0} has no colors", model.GetName() );
            //}

            if (uvs.Count > 0)
            {
                for (int i = 0; i < uvs.Count; ++i)
                {
                    mesh.SetUVs(i, uvs[i]);
                    //Debug.LogFormat( "Mesh {0} layer {1} has {2} uv", model.GetName(), i, uvs[i].Count );
                }
            }
            //else
            //{
            //	Debug.LogWarningFormat( "Mesh {0} has no uvs", model.GetName() );
            //}

            if (normals.Count > 0)
            {
                mesh.SetNormals(normals);
                //Debug.LogFormat( "Mesh {0} has {1} normals", model.GetName(), normals.Count );
            }
            //else
            //{
            //	Debug.LogWarningFormat( "Mesh {0} has no normals", model.GetName() );
            //}

            if (tangents.Count > 0)
            {
                mesh.SetTangents(tangents);
                // Debug.LogFormat( "Mesh {0} has {1} tangents", model.GetName(), tangents.Count );
            }
            //else
            //{
            //	Debug.LogWarningFormat( "Mesh {0} has no tangents", model.GetName() );
            //}

            mesh.subMeshCount = indice.Count;
            for (int i = 0; i < indice.Count; ++i)
            {
                mesh.SetIndices(indice[i].ToArray(), MeshTopology.Triangles, i);
                //Debug.LogFormat( "submesh {0} has {1} indice", i, indice[i].Count );
                //for( int j = 0; j < indice[i].Count; ++j )
                //{
                //	Debug.LogFormat( "submesh indice[{0}] = {1}", i, indice[i][j] );
                //}
            }

            // mesh.RecalculateNormals();
            mesh.Optimize();

            return(mesh);
        }