public static Bone2DWeights CalculateBoneWeights(Transform owner, Bone[] bones, Mesh mesh) { if (bones != null) { Bone2DWeights boneWeights = new Bone2DWeights(); boneWeights.weights = new Bone2DWeight[] { }; int vIndex = 0; foreach (Vector3 v in mesh.vertices) { Bone closest = FindClosestBone(v, bones); if (closest != null) { boneWeights.SetWeight(vIndex++, closest.name, Array.IndexOf(bones, closest), 1f); } } BoneWeight[] unitweights = boneWeights.GetUnityBoneWeights(); mesh.boneWeights = unitweights; Transform[] bonesArr = bones.Select(b => b.transform).ToArray(); Matrix4x4[] bindPoses = new Matrix4x4[bonesArr.Length]; for (int i = 0; i < bonesArr.Length; i++) { bindPoses[i] = bonesArr[i].worldToLocalMatrix * owner.localToWorldMatrix; } mesh.bindposes = bindPoses; return boneWeights; } return null; }
public void CalculateBoneWeights(Bone[] bones, bool weightToParent) { if(MeshFilter.sharedMesh == null) { Debug.Log("No Shared Mesh."); return; } Mesh mesh = new Mesh(); mesh.name = "Generated Mesh"; mesh.vertices = MeshFilter.sharedMesh.vertices; mesh.triangles = MeshFilter.sharedMesh.triangles; mesh.normals = MeshFilter.sharedMesh.normals; mesh.uv = MeshFilter.sharedMesh.uv; mesh.uv2 = MeshFilter.sharedMesh.uv2; mesh.bounds = MeshFilter.sharedMesh.bounds; if (bones != null) { boneWeights = new Bone2DWeights(); boneWeights.weights = new Bone2DWeight[] { }; int index = 0; foreach (Bone bone in bones) { int i=0; foreach (Vector3 v in mesh.vertices) { float influence; if (!weightToParent || bone.transform != transform.parent) { influence = bone.GetInfluence(v + transform.position); } else { influence = 1.0f; } boneWeights.SetWeight(i, bone.name, index, influence); i++; } index++; } BoneWeight[] unitweights = boneWeights.GetUnityBoneWeights(); mesh.boneWeights = unitweights; Transform[] bonesArr = bones.Select(b => b.transform).ToArray(); Matrix4x4[] bindPoses = new Matrix4x4[bonesArr.Length]; for (int i = 0; i < bonesArr.Length; i++) { bindPoses[i] = bonesArr[i].worldToLocalMatrix * transform.localToWorldMatrix; } mesh.bindposes = bindPoses; var skinRenderer = GetComponent<SkinnedMeshRenderer>(); if (skinRenderer.sharedMesh != null && !AssetDatabase.Contains(skinRenderer.sharedMesh.GetInstanceID())) Object.DestroyImmediate(skinRenderer.sharedMesh); skinRenderer.bones = bonesArr; skinRenderer.sharedMesh = mesh; } }
public void CalculateBoneWeights(Bone[] bones, bool weightToParent) { if (!lockBoneWeights) { if(meshFilter.sharedMesh == null) { Debug.Log("No Shared Mesh."); return; } Mesh mesh = new Mesh(); mesh.name = meshFilter.sharedMesh.name; mesh.name = mesh.name.Replace(".Mesh", ".SkinnedMesh"); mesh.vertices = meshFilter.sharedMesh.vertices; mesh.triangles = meshFilter.sharedMesh.triangles; mesh.normals = meshFilter.sharedMesh.normals; mesh.uv = meshFilter.sharedMesh.uv; mesh.uv2 = meshFilter.sharedMesh.uv2; mesh.bounds = meshFilter.sharedMesh.bounds; if (bones != null && mesh != null) { boneWeights = new Bone2DWeights(); boneWeights.weights = new Bone2DWeight[] { }; int index = 0; foreach (Bone bone in bones) { int i=0; bool boneActive = bone.gameObject.activeSelf; bone.gameObject.SetActive(true); foreach (Vector3 v in mesh.vertices) { float influence; if (!weightToParent || weightToParent && bone.transform != transform.parent) { influence = bone.GetInfluence(v + transform.position); } else { influence = 1.0f; } boneWeights.SetWeight(i, bone.name, index, influence); i++; } index++; bone.gameObject.SetActive(boneActive); } BoneWeight[] unitweights = boneWeights.GetUnityBoneWeights(); mesh.boneWeights = unitweights; Transform[] bonesArr = bones.Select(b => b.transform).ToArray(); Matrix4x4[] bindPoses = new Matrix4x4[bonesArr.Length]; for (int i = 0; i < bonesArr.Length; i++) { bindPoses[i] = bonesArr[i].worldToLocalMatrix * transform.localToWorldMatrix; } mesh.bindposes = bindPoses; skinnedMeshRenderer.bones = bonesArr; Skeleton[] skeletons = transform.root.gameObject.GetComponentsInChildren<Skeleton>(true); Skeleton skeleton = null; foreach (Skeleton s in skeletons) { if (transform.IsChildOf(s.transform)) { skeleton = s; } } DirectoryInfo meshSkelDir = new DirectoryInfo("Assets/Meshes/SkinnedMeshes/" + skeleton.gameObject.name); if (Directory.Exists(meshSkelDir.FullName) == false) { Directory.CreateDirectory(meshSkelDir.FullName); } string path = "Assets/Meshes/SkinnedMeshes/" + skeleton.gameObject.name + "/" + mesh.name + ".asset"; CreateOrReplaceAsset (mesh, path); AssetDatabase.Refresh(); Mesh generatedMesh = AssetDatabase.LoadAssetAtPath (path, typeof(Mesh)) as Mesh; // Ensure it has bindPoses and weights generatedMesh.boneWeights = unitweights; generatedMesh.bindposes = bindPoses; skinnedMeshRenderer.sharedMesh = generatedMesh; EditorUtility.SetDirty(skinnedMeshRenderer.gameObject); AssetDatabase.SaveAssets(); } } }