コード例 #1
0
    void ImportSetMesh(string strNodeName, GameObject goNode, GameObject goTopAttachNode, bool bDirectControlPointsMode)
    {
        // Get Mesh
        IntPtr pFBXGetMesh = FBXImporterGetMesh(strNodeName, bInDirectControlPointsMode, bInNormalSmoothing);
        if (pFBXGetMesh != IntPtr.Zero)
        {
            FBXMesh sFBXMesh = new FBXMesh();
            IntPtr pFBXMesh = Marshal.AllocHGlobal(Marshal.SizeOf(sFBXMesh));
            try
            {
                sFBXMesh = (FBXMesh)Marshal.PtrToStructure(pFBXGetMesh, typeof(FBXMesh));
            }
            finally
            {
                Marshal.FreeHGlobal(pFBXMesh);
            }
            if (bDirectControlPointsMode)
            {
                sFBXMesh.numVertexs = sFBXMesh.numVertexs / 3;
                sFBXMesh.numNormals = sFBXMesh.numNormals / 3;
                sFBXMesh.numUVs = sFBXMesh.numUVs / 3;
            }

            // Vertex
            float[] fVertexs = new float[sFBXMesh.numVertexs * 3];
            Marshal.Copy(sFBXMesh.fVertexs, fVertexs, 0, sFBXMesh.numVertexs * 3);
            Vector3[] vecVertexs = new Vector3[sFBXMesh.numVertexs];
            int j = 0;
            for (int i = 0; i < sFBXMesh.numVertexs; i++)
            {
                vecVertexs[i].x = -fVertexs[j] * fGlobalScale;
                j++;
                vecVertexs[i].y = fVertexs[j] * fGlobalScale;
                j++;
                vecVertexs[i].z = fVertexs[j] * fGlobalScale;
                j++;
            }

            // Normal
            float[] fNormals = new float[sFBXMesh.numNormals * 3];
            Marshal.Copy(sFBXMesh.fNormals, fNormals, 0, sFBXMesh.numNormals * 3);
            Vector3[] vecNormals = new Vector3[sFBXMesh.numNormals];
            j = 0;
            for (int i = 0; i < sFBXMesh.numNormals; i++)
            {
                vecNormals[i].x = -fNormals[j];
                j++;
                vecNormals[i].y = fNormals[j];
                j++;
                vecNormals[i].z = fNormals[j];
                j++;
            }

            // UV
            float[] fUVs = new float[sFBXMesh.numUVs * 2];
            Marshal.Copy(sFBXMesh.fUVs, fUVs, 0, sFBXMesh.numUVs * 2);
            Vector2[] vecUVs = new Vector2[sFBXMesh.numUVs];
            j = 0;
            for (int i = 0; i < sFBXMesh.numUVs; i++)
            {
                vecUVs[i].x = fUVs[j];
                j++;
                vecUVs[i].y = fUVs[j];
                j++;
            }

            // Polygon (MaterialID)
            int[] iPolygonMatIDs = new int[sFBXMesh.numPolygonMatID];
            Marshal.Copy(sFBXMesh.iPolygonMatIDs, iPolygonMatIDs, 0, sFBXMesh.numPolygonMatID);
            int numPolygonIndex = sFBXMesh.numPolygonIndex;
            int[] iPolygonIndexs = new int[numPolygonIndex];
            Marshal.Copy(sFBXMesh.iPolygonIndexs, iPolygonIndexs, 0, numPolygonIndex);
            if (bDirectControlPointsMode)
            {
                sFBXMesh.numPolygonMatID = sFBXMesh.numPolygonMatID / 3;
            }

            // Set Mesh
            goNode.AddComponent<MeshRenderer>();
            goNode.AddComponent<MeshFilter>();
            Mesh sMesh = new Mesh();
            sMesh.name = goNode.name;
            goNode.GetComponent<MeshFilter>().mesh = sMesh;
            sMesh.Clear();
            sMesh.vertices = vecVertexs;
            sMesh.normals = vecNormals;
            sMesh.uv = vecUVs;
            sMesh.subMeshCount = sFBXMesh.numMatID;
            List<List<int>> listListMatIDIndeices = new List<List<int>>();
            for (int i = 0; i < sFBXMesh.numMatID; i++)
            {
                List<int> iListMatIDIndeices = new List<int>();
                listListMatIDIndeices.Add(iListMatIDIndeices);
            }

            // Polygon (Material Index)
            if (bDirectControlPointsMode)
            {
                j = 0;
                for (int i = 0; i < sFBXMesh.numPolygonMatID; i++)
                {
                    int iMatID = iPolygonMatIDs[i];
                    if (iMatID < listListMatIDIndeices.Count)
                    {
                        listListMatIDIndeices[iMatID].Add(iPolygonIndexs[j + 0]);
                        listListMatIDIndeices[iMatID].Add(iPolygonIndexs[j + 2]);
                        listListMatIDIndeices[iMatID].Add(iPolygonIndexs[j + 1]);
                        j = j + 3;
                    }
                }
            }
            else
            {
                j = 0;
                for (int i = 0; i < sFBXMesh.numPolygonMatID; i++)
                {
                    int iMatID = iPolygonMatIDs[i];
                    if (iMatID < listListMatIDIndeices.Count)
                    {
                        listListMatIDIndeices[iMatID].Add(j + 0);
                        listListMatIDIndeices[iMatID].Add(j + 2);
                        listListMatIDIndeices[iMatID].Add(j + 1);
                        j = j + 3;
                    }
                }
            }

            // Triangles (Material Index)
            j = 0;
            for (int i = 0; i < sFBXMesh.numMatID; i++)
            {
                int[] iMatIDIndeices = listListMatIDIndeices[i].ToArray();
                //if (iMatIDIndeices.Length > 0)
                {
                    sMesh.SetTriangles(iMatIDIndeices, j);
                    j++;
                }
            }

            // Get Weight
            IntPtr pFBXGetWeight = FBXImporterGetWeight(strNodeName, iPolygonIndexs, numPolygonIndex, bInDirectControlPointsMode);
            if (pFBXGetWeight != IntPtr.Zero)
            {
                FBXWeight sFBXWeight = new FBXWeight();
                IntPtr pFBXWeight = Marshal.AllocHGlobal(Marshal.SizeOf(sFBXWeight));
                try
                {
                    sFBXWeight = (FBXWeight)Marshal.PtrToStructure(pFBXGetWeight, typeof(FBXWeight));
                }
                finally
                {
                    Marshal.FreeHGlobal(pFBXWeight);
                }
                if (bDirectControlPointsMode)
                {
                    sFBXWeight.iBoneWeightCount = sFBXWeight.iBoneWeightCount / 3;
                }

                // Weight (Bone)
                int[] iBoneID = new int[sFBXWeight.iBoneWeightCount * 4];
                Marshal.Copy(sFBXWeight.iBoneID, iBoneID, 0, sFBXWeight.iBoneWeightCount * 4);
                float[] fBoneWeight = new float[sFBXWeight.iBoneWeightCount * 4];
                Marshal.Copy(sFBXWeight.fBoneWeight, fBoneWeight, 0, sFBXWeight.iBoneWeightCount * 4);
                BoneWeight[] boneWeights = new BoneWeight[sFBXWeight.iBoneWeightCount];
                for (int i = 0; i < sFBXWeight.iBoneWeightCount; i++)
                {
                    BoneWeight boneWeight = new BoneWeight();
                    boneWeight.boneIndex0 = iBoneID[(i * 4) + 0];
                    boneWeight.boneIndex1 = iBoneID[(i * 4) + 1];
                    boneWeight.boneIndex2 = iBoneID[(i * 4) + 2];
                    boneWeight.boneIndex3 = iBoneID[(i * 4) + 3];
                    boneWeight.weight0 = fBoneWeight[(i * 4) + 0];
                    boneWeight.weight1 = fBoneWeight[(i * 4) + 1];
                    boneWeight.weight2 = fBoneWeight[(i * 4) + 2];
                    boneWeight.weight3 = fBoneWeight[(i * 4) + 3];
                    boneWeights[i] = boneWeight;
                }
                sMesh.boneWeights = boneWeights;

                // Bind Pose (Bone)
                SkinnedMeshRenderer sSkinnedMeshRenderer = goNode.AddComponent<SkinnedMeshRenderer>();
                string strBoneName = Marshal.PtrToStringAnsi(sFBXWeight.strBoneNodeNames).ToString();
                if (strBoneName != "")
                {
                    string[] strBoneNodeNames = strBoneName.Split(',');
                    //float[] matBonePose = new float[strBoneNodeNames.Length * 16];
                    //Marshal.Copy(sFBXWeight.matBonePose, matBonePose, 0, strBoneNodeNames.Length * 16);
                    Matrix4x4[] bindposes = new Matrix4x4[strBoneNodeNames.Length];
                    Transform[] bones = new Transform[strBoneNodeNames.Length];
                    sSkinnedMeshRenderer.bones = new Transform[strBoneNodeNames.Length];
                    float[] fGlbTranslation = new float[3 * strBoneNodeNames.Length];
                    Marshal.Copy(sFBXWeight.fGlbTranslation, fGlbTranslation, 0, 3 * strBoneNodeNames.Length);
                    float[] fGlbRotation = new float[4 * strBoneNodeNames.Length];
                    Marshal.Copy(sFBXWeight.fGlbRotation, fGlbRotation, 0, 4 * strBoneNodeNames.Length);
                    float[] fGlbScale = new float[3 * strBoneNodeNames.Length];
                    Marshal.Copy(sFBXWeight.fGlbScale, fGlbScale, 0, 3 * strBoneNodeNames.Length);
                    for (int i = 0; i < strBoneNodeNames.Length; i++)
                    {
                        /*
                        Matrix4x4 matBindPose = new Matrix4x4();
                        matBindPose.m00 = matBonePose[(i * 16) + 0];
                        matBindPose.m01 = matBonePose[(i * 16) + 1];
                        matBindPose.m02 = matBonePose[(i * 16) + 2];
                        matBindPose.m03 = matBonePose[(i * 16) + 3];
                        matBindPose.m10 = matBonePose[(i * 16) + 4];
                        matBindPose.m11 = matBonePose[(i * 16) + 5];
                        matBindPose.m12 = matBonePose[(i * 16) + 6];
                        matBindPose.m13 = matBonePose[(i * 16) + 7];
                        matBindPose.m20 = matBonePose[(i * 16) + 8];
                        matBindPose.m21 = matBonePose[(i * 16) + 9];
                        matBindPose.m22 = matBonePose[(i * 16) + 10];
                        matBindPose.m23 = matBonePose[(i * 16) + 11];
                        matBindPose.m30 = matBonePose[(i * 16) + 12] * fGlobalScale;
                        matBindPose.m31 = matBonePose[(i * 16) + 13] * fGlobalScale;
                        matBindPose.m32 = matBonePose[(i * 16) + 14] * fGlobalScale;
                        matBindPose.m33 = matBonePose[(i * 16) + 15];
                        */
                        Transform bone = goTopAttachNode.transform.FindDeep(strBoneNodeNames[i]).transform;
                        bone.position = new Vector3(-fGlbTranslation[(i * 3) + 0] * fGlobalScale, fGlbTranslation[(i * 3) + 1] * fGlobalScale, fGlbTranslation[(i * 3) + 2] * fGlobalScale);
                        bone.rotation = new Quaternion(-fGlbRotation[(i * 4) + 0], fGlbRotation[(i * 4) + 1], fGlbRotation[(i * 4) + 2], -fGlbRotation[(i * 4) + 3]);
                        bone.localScale = new Vector3(fGlbScale[(i * 3) + 0], fGlbScale[(i * 3) + 1], fGlbScale[(i * 3) + 2]);
                        bones[i] = bone;
                        bindposes[i] = bones[i].worldToLocalMatrix;
                    }
                    //sSkinnedMeshRenderer.rootBone = goNode.transform;
                    sSkinnedMeshRenderer.bones = bones;
                    sSkinnedMeshRenderer.sharedMesh = sMesh;
                    sSkinnedMeshRenderer.sharedMesh.bindposes = bindposes;
                    //sSkinnedMeshRenderer.sharedMesh.RecalculateNormals();
                    //sSkinnedMeshRenderer.sharedMesh.RecalculateBounds();
                }
            }

            // Set Material
            SetMaterial(goNode);
        }
    }
コード例 #2
0
    void ImportSetMesh(string strNodeName, GameObject goNode, GameObject goTopAttachNode, bool bDirectControlPointsMode)
    {
        // Get Mesh
        IntPtr pFBXGetMesh = FBXImporterGetMesh(strNodeName, bInDirectControlPointsMode, bInNormalSmoothing);

        if (pFBXGetMesh != IntPtr.Zero)
        {
            FBXMesh sFBXMesh = new FBXMesh();
            IntPtr  pFBXMesh = Marshal.AllocHGlobal(Marshal.SizeOf(sFBXMesh));
            try
            {
                sFBXMesh = (FBXMesh)Marshal.PtrToStructure(pFBXGetMesh, typeof(FBXMesh));
            }
            finally
            {
                Marshal.FreeHGlobal(pFBXMesh);
            }
            if (bDirectControlPointsMode)
            {
                sFBXMesh.numVertexs = sFBXMesh.numVertexs / 3;
                sFBXMesh.numNormals = sFBXMesh.numNormals / 3;
                sFBXMesh.numUVs     = sFBXMesh.numUVs / 3;
            }

            // Vertex
            float[] fVertexs = new float[sFBXMesh.numVertexs * 3];
            Marshal.Copy(sFBXMesh.fVertexs, fVertexs, 0, sFBXMesh.numVertexs * 3);
            Vector3[] vecVertexs = new Vector3[sFBXMesh.numVertexs];
            int       j          = 0;
            for (int i = 0; i < sFBXMesh.numVertexs; i++)
            {
                vecVertexs[i].x = -fVertexs[j] * fGlobalScale;
                j++;
                vecVertexs[i].y = fVertexs[j] * fGlobalScale;
                j++;
                vecVertexs[i].z = fVertexs[j] * fGlobalScale;
                j++;
            }

            // Normal
            float[] fNormals = new float[sFBXMesh.numNormals * 3];
            Marshal.Copy(sFBXMesh.fNormals, fNormals, 0, sFBXMesh.numNormals * 3);
            Vector3[] vecNormals = new Vector3[sFBXMesh.numNormals];
            j = 0;
            for (int i = 0; i < sFBXMesh.numNormals; i++)
            {
                vecNormals[i].x = -fNormals[j];
                j++;
                vecNormals[i].y = fNormals[j];
                j++;
                vecNormals[i].z = fNormals[j];
                j++;
            }

            // UV
            float[] fUVs = new float[sFBXMesh.numUVs * 2];
            Marshal.Copy(sFBXMesh.fUVs, fUVs, 0, sFBXMesh.numUVs * 2);
            Vector2[] vecUVs = new Vector2[sFBXMesh.numUVs];
            j = 0;
            for (int i = 0; i < sFBXMesh.numUVs; i++)
            {
                vecUVs[i].x = fUVs[j];
                j++;
                vecUVs[i].y = fUVs[j];
                j++;
            }

            // Polygon (MaterialID)
            int[] iPolygonMatIDs = new int[sFBXMesh.numPolygonMatID];
            Marshal.Copy(sFBXMesh.iPolygonMatIDs, iPolygonMatIDs, 0, sFBXMesh.numPolygonMatID);
            int   numPolygonIndex = sFBXMesh.numPolygonIndex;
            int[] iPolygonIndexs  = new int[numPolygonIndex];
            Marshal.Copy(sFBXMesh.iPolygonIndexs, iPolygonIndexs, 0, numPolygonIndex);
            if (bDirectControlPointsMode)
            {
                sFBXMesh.numPolygonMatID = sFBXMesh.numPolygonMatID / 3;
            }

            // Set Mesh
            goNode.AddComponent <MeshRenderer>();
            goNode.AddComponent <MeshFilter>();
            Mesh sMesh = new Mesh();
            sMesh.name = goNode.name;
            goNode.GetComponent <MeshFilter>().mesh = sMesh;
            sMesh.Clear();
            sMesh.vertices     = vecVertexs;
            sMesh.normals      = vecNormals;
            sMesh.uv           = vecUVs;
            sMesh.subMeshCount = sFBXMesh.numMatID;
            List <List <int> > listListMatIDIndeices = new List <List <int> >();
            for (int i = 0; i < sFBXMesh.numMatID; i++)
            {
                List <int> iListMatIDIndeices = new List <int>();
                listListMatIDIndeices.Add(iListMatIDIndeices);
            }

            // Polygon (Material Index)
            if (bDirectControlPointsMode)
            {
                j = 0;
                for (int i = 0; i < sFBXMesh.numPolygonMatID; i++)
                {
                    int iMatID = iPolygonMatIDs[i];
                    if (iMatID < listListMatIDIndeices.Count)
                    {
                        listListMatIDIndeices[iMatID].Add(iPolygonIndexs[j + 0]);
                        listListMatIDIndeices[iMatID].Add(iPolygonIndexs[j + 2]);
                        listListMatIDIndeices[iMatID].Add(iPolygonIndexs[j + 1]);
                        j = j + 3;
                    }
                }
            }
            else
            {
                j = 0;
                for (int i = 0; i < sFBXMesh.numPolygonMatID; i++)
                {
                    int iMatID = iPolygonMatIDs[i];
                    if (iMatID < listListMatIDIndeices.Count)
                    {
                        listListMatIDIndeices[iMatID].Add(j + 0);
                        listListMatIDIndeices[iMatID].Add(j + 2);
                        listListMatIDIndeices[iMatID].Add(j + 1);
                        j = j + 3;
                    }
                }
            }

            // Triangles (Material Index)
            j = 0;
            for (int i = 0; i < sFBXMesh.numMatID; i++)
            {
                int[] iMatIDIndeices = listListMatIDIndeices[i].ToArray();
                //if (iMatIDIndeices.Length > 0)
                {
                    sMesh.SetTriangles(iMatIDIndeices, j);
                    j++;
                }
            }

            // Get Weight
            IntPtr pFBXGetWeight = FBXImporterGetWeight(strNodeName, iPolygonIndexs, numPolygonIndex, bInDirectControlPointsMode);
            if (pFBXGetWeight != IntPtr.Zero)
            {
                FBXWeight sFBXWeight = new FBXWeight();
                IntPtr    pFBXWeight = Marshal.AllocHGlobal(Marshal.SizeOf(sFBXWeight));
                try
                {
                    sFBXWeight = (FBXWeight)Marshal.PtrToStructure(pFBXGetWeight, typeof(FBXWeight));
                }
                finally
                {
                    Marshal.FreeHGlobal(pFBXWeight);
                }
                if (bDirectControlPointsMode)
                {
                    sFBXWeight.iBoneWeightCount = sFBXWeight.iBoneWeightCount / 3;
                }

                // Weight (Bone)
                int[] iBoneID = new int[sFBXWeight.iBoneWeightCount * 4];
                Marshal.Copy(sFBXWeight.iBoneID, iBoneID, 0, sFBXWeight.iBoneWeightCount * 4);
                float[] fBoneWeight = new float[sFBXWeight.iBoneWeightCount * 4];
                Marshal.Copy(sFBXWeight.fBoneWeight, fBoneWeight, 0, sFBXWeight.iBoneWeightCount * 4);
                BoneWeight[] boneWeights = new BoneWeight[sFBXWeight.iBoneWeightCount];
                for (int i = 0; i < sFBXWeight.iBoneWeightCount; i++)
                {
                    BoneWeight boneWeight = new BoneWeight();
                    boneWeight.boneIndex0 = iBoneID[(i * 4) + 0];
                    boneWeight.boneIndex1 = iBoneID[(i * 4) + 1];
                    boneWeight.boneIndex2 = iBoneID[(i * 4) + 2];
                    boneWeight.boneIndex3 = iBoneID[(i * 4) + 3];
                    boneWeight.weight0    = fBoneWeight[(i * 4) + 0];
                    boneWeight.weight1    = fBoneWeight[(i * 4) + 1];
                    boneWeight.weight2    = fBoneWeight[(i * 4) + 2];
                    boneWeight.weight3    = fBoneWeight[(i * 4) + 3];
                    boneWeights[i]        = boneWeight;
                }
                sMesh.boneWeights = boneWeights;

                // Bind Pose (Bone)
                SkinnedMeshRenderer sSkinnedMeshRenderer = goNode.AddComponent <SkinnedMeshRenderer>();
                string strBoneName = Marshal.PtrToStringAnsi(sFBXWeight.strBoneNodeNames).ToString();
                if (strBoneName != "")
                {
                    string[] strBoneNodeNames = strBoneName.Split(',');
                    //float[] matBonePose = new float[strBoneNodeNames.Length * 16];
                    //Marshal.Copy(sFBXWeight.matBonePose, matBonePose, 0, strBoneNodeNames.Length * 16);
                    Matrix4x4[] bindposes = new Matrix4x4[strBoneNodeNames.Length];
                    Transform[] bones     = new Transform[strBoneNodeNames.Length];
                    sSkinnedMeshRenderer.bones = new Transform[strBoneNodeNames.Length];
                    float[] fGlbTranslation = new float[3 * strBoneNodeNames.Length];
                    Marshal.Copy(sFBXWeight.fGlbTranslation, fGlbTranslation, 0, 3 * strBoneNodeNames.Length);
                    float[] fGlbRotation = new float[4 * strBoneNodeNames.Length];
                    Marshal.Copy(sFBXWeight.fGlbRotation, fGlbRotation, 0, 4 * strBoneNodeNames.Length);
                    float[] fGlbScale = new float[3 * strBoneNodeNames.Length];
                    Marshal.Copy(sFBXWeight.fGlbScale, fGlbScale, 0, 3 * strBoneNodeNames.Length);
                    for (int i = 0; i < strBoneNodeNames.Length; i++)
                    {
                        /*
                         * Matrix4x4 matBindPose = new Matrix4x4();
                         * matBindPose.m00 = matBonePose[(i * 16) + 0];
                         * matBindPose.m01 = matBonePose[(i * 16) + 1];
                         * matBindPose.m02 = matBonePose[(i * 16) + 2];
                         * matBindPose.m03 = matBonePose[(i * 16) + 3];
                         * matBindPose.m10 = matBonePose[(i * 16) + 4];
                         * matBindPose.m11 = matBonePose[(i * 16) + 5];
                         * matBindPose.m12 = matBonePose[(i * 16) + 6];
                         * matBindPose.m13 = matBonePose[(i * 16) + 7];
                         * matBindPose.m20 = matBonePose[(i * 16) + 8];
                         * matBindPose.m21 = matBonePose[(i * 16) + 9];
                         * matBindPose.m22 = matBonePose[(i * 16) + 10];
                         * matBindPose.m23 = matBonePose[(i * 16) + 11];
                         * matBindPose.m30 = matBonePose[(i * 16) + 12] * fGlobalScale;
                         * matBindPose.m31 = matBonePose[(i * 16) + 13] * fGlobalScale;
                         * matBindPose.m32 = matBonePose[(i * 16) + 14] * fGlobalScale;
                         * matBindPose.m33 = matBonePose[(i * 16) + 15];
                         */
                        Transform bone = goTopAttachNode.transform.FindDeep(strBoneNodeNames[i]).transform;
                        bone.position   = new Vector3(-fGlbTranslation[(i * 3) + 0] * fGlobalScale, fGlbTranslation[(i * 3) + 1] * fGlobalScale, fGlbTranslation[(i * 3) + 2] * fGlobalScale);
                        bone.rotation   = new Quaternion(-fGlbRotation[(i * 4) + 0], fGlbRotation[(i * 4) + 1], fGlbRotation[(i * 4) + 2], -fGlbRotation[(i * 4) + 3]);
                        bone.localScale = new Vector3(fGlbScale[(i * 3) + 0], fGlbScale[(i * 3) + 1], fGlbScale[(i * 3) + 2]);
                        bones[i]        = bone;
                        bindposes[i]    = bones[i].worldToLocalMatrix;
                    }
                    //sSkinnedMeshRenderer.rootBone = goNode.transform;
                    sSkinnedMeshRenderer.bones                = bones;
                    sSkinnedMeshRenderer.sharedMesh           = sMesh;
                    sSkinnedMeshRenderer.sharedMesh.bindposes = bindposes;
                    //sSkinnedMeshRenderer.sharedMesh.RecalculateNormals();
                    //sSkinnedMeshRenderer.sharedMesh.RecalculateBounds();
                }
            }

            // Set Material
            SetMaterial(goNode);
        }
    }