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); } }
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); } }