private void OnEnable() { _morphAnimation = target as MorphAnimation; _transform = _morphAnimation.transform; _boneSize = 0.1f; ReSet(); if (!_morphAnimation.IsApprove) { return; } if (_morphAnimation.IsDone) { return; } _skinnedMeshRenderer = _transform.GetComponent <SkinnedMeshRenderer>(); _mesh = _skinnedMeshRenderer.sharedMesh; _meshCollider = _transform.GetComponent <MeshCollider>(); _currentCheckedBone = null; _currentCheckedMorphBone = null; _currentCheckedVertex = null; _MAEditType = MAEditType.Bone; _MATool = MATool.Move; _vertexHandleType = HandleType.Wire; _vertexIconSize = 0.01f; _reNameBone = false; _newNameBone = ""; _showMorphSetting = true; _showRenderSetting = true; _showMaterials = false; SaveMorphMesh(); }
/// <summary> /// 编辑顶点模式 /// </summary> private void EditVertex() { if (_MAEditType == MAEditType.Vertex) { if (Event.current.button == 0 && Event.current.isMouse && Event.current.type == EventType.MouseDown) { RaycastHit hit; if (Physics.Raycast(HandleUtility.GUIPointToWorldRay(Event.current.mousePosition), out hit)) { if (hit.triangleIndex >= 0 && hit.triangleIndex < _morphAnimation.Triangles.Count) { _currentCheckedVertex = GetVertexByClick(_morphAnimation.Triangles[hit.triangleIndex], hit.point); } } Selection.activeObject = _transform.gameObject; } if (_currentCheckedVertex != null) { SetHandlesColor(Color.cyan); MorphHandles.DrawMorphVertex(_currentCheckedVertex.Vertex, _vertexIconSize, _vertexHandleType); EditBoneWeight(); } } }
/// <summary> /// 创建变形动画 /// </summary> private void GenerateMorphAnimation() { GUI.backgroundColor = Color.cyan; if (GUILayout.Button("Generate Morph Animation")) { Mesh mesh = Instantiate(_meshFilter.sharedMesh); mesh.name = _meshFilter.sharedMesh.name + "(Morph)"; string path = "Assets/" + mesh.name + ".asset"; AssetDatabase.CreateAsset(mesh, path); AssetDatabase.SaveAssets(); Mesh meshAsset = AssetDatabase.LoadAssetAtPath(path, typeof(Mesh)) as Mesh; //生成蒙皮网格组件 _skinnedMeshRenderer = _meshFilter.transform.GetComponent <SkinnedMeshRenderer>(); if (_skinnedMeshRenderer) { DestroyImmediate(_skinnedMeshRenderer); } _skinnedMeshRenderer = _meshFilter.transform.gameObject.AddComponent <SkinnedMeshRenderer>(); _skinnedMeshRenderer.hideFlags = HideFlags.HideInInspector; _skinnedMeshRenderer.sharedMesh = meshAsset; _skinnedMeshRenderer.rootBone = _meshFilter.transform; _skinnedMeshRenderer.sharedMaterial = _meshRenderer ? _meshRenderer.sharedMaterial : null; _skinnedMeshRenderer.enabled = true; //生成网格碰撞器 MeshCollider mc = _meshFilter.transform.GetComponent <MeshCollider>(); if (mc) { DestroyImmediate(mc); } mc = _meshFilter.transform.gameObject.AddComponent <MeshCollider>(); mc.sharedMesh = meshAsset; mc.enabled = true; //生成变形动画组件 MorphAnimation ma = _meshFilter.transform.GetComponent <MorphAnimation>(); if (ma) { DestroyImmediate(ma); } ma = _meshFilter.transform.gameObject.AddComponent <MorphAnimation>(); ma.IsApprove = true; //处理顶点 ma.Vertexs = new List <MorphVertex>(); List <int> repetitionVertices = new List <int>(); for (int i = 0; i < meshAsset.vertices.Length; i++) { EditorUtility.DisplayProgressBar("请稍等", "处理顶点(" + i + "/" + meshAsset.vertices.Length + ")......", 1.0f / meshAsset.vertices.Length * i); if (repetitionVertices.Contains(i)) { continue; } List <int> verticesGroup = new List <int>(); verticesGroup.Add(i); for (int j = i + 1; j < meshAsset.vertices.Length; j++) { if (meshAsset.vertices[i] == meshAsset.vertices[j]) { verticesGroup.Add(j); repetitionVertices.Add(j); } } ma.Vertexs.Add(new MorphVertex(_meshFilter.transform.localToWorldMatrix.MultiplyPoint3x4(meshAsset.vertices[i]), verticesGroup)); } //处理三角面 List <int> allTriangles = new List <int>(meshAsset.triangles); ma.Triangles = new List <MorphTriangle>(); for (int i = 0; (i + 2) < allTriangles.Count; i += 3) { EditorUtility.DisplayProgressBar("请稍等", "处理三角面(" + i + "/" + allTriangles.Count + ")......", 1.0f / allTriangles.Count * i); MorphVertex mv1 = GetVertexByIndex(ma.Vertexs, allTriangles[i]); MorphVertex mv2 = GetVertexByIndex(ma.Vertexs, allTriangles[i + 1]); MorphVertex mv3 = GetVertexByIndex(ma.Vertexs, allTriangles[i + 2]); MorphTriangle mt = new MorphTriangle(ma.Triangles.Count, ref mv1, ref mv2, ref mv3); ma.Triangles.Add(mt); } //默认生成一条骨骼(根骨骼) Transform[] bones = new Transform[1]; Matrix4x4[] bindPoses = new Matrix4x4[1]; GameObject go = new GameObject("BoneRoot"); go.AddComponent <MorphBone>(); go.GetComponent <MorphBone>().hideFlags = HideFlags.HideInInspector; go.hideFlags = HideFlags.HideInHierarchy; bones[0] = go.transform; bones[0].SetParent(_skinnedMeshRenderer.transform); bones[0].localPosition = Vector3.zero; bones[0].localRotation = Quaternion.identity; bindPoses[0] = bones[0].worldToLocalMatrix * _skinnedMeshRenderer.transform.localToWorldMatrix; _skinnedMeshRenderer.bones = bones; _skinnedMeshRenderer.sharedMesh.bindposes = bindPoses; EditorUtility.ClearProgressBar(); if (_meshFilter.transform.GetComponent <Collider>() != null) { _meshFilter.transform.GetComponent <Collider>().enabled = false; } if (_meshRenderer) { _meshRenderer.enabled = false; _meshRenderer.hideFlags = HideFlags.HideInInspector; } DestroyImmediate(_meshFilter); } }
public MorphTriangle(int id, ref MorphVertex vertex1, ref MorphVertex vertex2, ref MorphVertex vertex3) { Vertex1 = vertex1; Vertex2 = vertex2; Vertex3 = vertex3; }