// 保存mesh public void SaveMesh(string outputFilePath, string MeshName) { Mesh mesh = new Mesh(); int totalvectors = m_AniMesh.m_Mesh.m_vertices.Length; int npower = IGGUtil.GettoPower(totalvectors); Vector2[] uv = m_AniMesh.m_Mesh.m_UV; Vector3[] posArray = new Vector3[totalvectors]; for (int i = 0; i < posArray.Length; i++) { posArray[i].x = uv[i].x; posArray[i].y = uv[i].y; posArray[i].z = i * 1.0f / npower; } mesh.vertices = posArray; mesh.triangles = m_AniMesh.m_Mesh.m_Triangles; mesh.RecalculateNormals(); string dataPath = outputFilePath + MeshName + "_M.asset"; AssetDatabase.CreateAsset(mesh, dataPath); }
// 保存顶点动画纹理 public void SaveMeshTexture(string outputFilePath, string AniMeshName) { int totalFrame = m_AniMesh.GetTotalFrame(); int bones = m_AniMesh.GetBones(); int npower = IGGUtil.GettoPower(bones * 3); Texture2D combinedTex = new Texture2D(npower, totalFrame, TextureFormat.RGBAFloat, false); combinedTex.filterMode = FilterMode.Point; combinedTex.wrapMode = TextureWrapMode.Clamp; combinedTex.anisoLevel = 0; // int vertexCount = 0; for (int frame = 0; frame < totalFrame; frame++) { for (int k = 0; k < bones; k++) { Matrix4x4 mat = m_AniMesh.m_Mesh.m_AniBone[frame][k]; int index = 3 * k; combinedTex.SetPixel(index, frame, new Color(mat.m00, mat.m01, mat.m02, mat.m03)); combinedTex.SetPixel(index + 1, frame, new Color(mat.m10, mat.m11, mat.m12, mat.m13)); combinedTex.SetPixel(index + 2, frame, new Color(mat.m20, mat.m21, mat.m22, mat.m23)); } } combinedTex.Apply(false); string dataPath = outputFilePath + AniMeshName + "_AT.asset"; AssetDatabase.CreateAsset(combinedTex, dataPath); }
// 保存顶点动画纹理 public void SaveMeshTexture(string outputFilePath, string AniMeshName) { int totalFrame = m_AniMesh.GetTotalFrame(); int totalvectors = m_AniMesh.GetTotalVertices(); int npower = IGGUtil.GettoPower(totalvectors); Texture2D combinedTex = new Texture2D(npower, totalFrame, TextureFormat.RGBA32, false); combinedTex.filterMode = FilterMode.Point; combinedTex.wrapMode = TextureWrapMode.Clamp; combinedTex.anisoLevel = 0; // int vertexCount = 0; int SubMeshVertexNum = totalvectors; for (int frame = 0; frame < totalFrame; frame++) { for (int k = 0; k < SubMeshVertexNum; k++) { Vector3 vertex = m_AniMesh.m_Mesh.m_AniMesh[frame][k]; Color c = IGGUtil.EncodeRGBM(vertex); combinedTex.SetPixel(k, frame, c); } } combinedTex.Apply(false); string dataPath = outputFilePath + AniMeshName + "_AT.asset"; AssetDatabase.CreateAsset(combinedTex, dataPath); }
// 保存mesh public void SaveMesh(string outputFilePath, string MeshName) { Mesh mesh = new Mesh(); int totalvectors = m_AniMesh.m_Mesh.m_vertices.Length; int npower = IGGUtil.GettoPower(totalvectors); Vector2[] uv = m_AniMesh.m_Mesh.m_UV; // 切线,用于存储骨骼权重信息。每个顶点绑定2根骨骼。 Vector4[] tangetsArray = new Vector4[totalvectors]; Vector2[] bone3 = new Vector2[totalvectors]; Vector2[] bone4 = new Vector2[totalvectors]; for (int i = 0; i < totalvectors; i++) { tangetsArray[i].x = m_AniMesh.m_Mesh.m_BoneWeight[i].boneIndex0; tangetsArray[i].y = m_AniMesh.m_Mesh.m_BoneWeight[i].weight0; tangetsArray[i].z = m_AniMesh.m_Mesh.m_BoneWeight[i].boneIndex1; tangetsArray[i].w = m_AniMesh.m_Mesh.m_BoneWeight[i].weight1; bone3[i].x = m_AniMesh.m_Mesh.m_BoneWeight[i].boneIndex2; bone3[i].y = m_AniMesh.m_Mesh.m_BoneWeight[i].weight2; bone4[i].x = m_AniMesh.m_Mesh.m_BoneWeight[i].boneIndex3; bone4[i].y = m_AniMesh.m_Mesh.m_BoneWeight[i].weight3; } mesh.vertices = m_AniMesh.m_Mesh.m_vertices; mesh.triangles = m_AniMesh.m_Mesh.m_Triangles; mesh.uv = m_AniMesh.m_Mesh.m_UV; mesh.uv2 = bone3; mesh.uv3 = bone4; mesh.tangents = tangetsArray; mesh.RecalculateNormals(); string dataPath = outputFilePath + MeshName + "_M.asset"; AssetDatabase.CreateAsset(mesh, dataPath); }