public void CreateClip() { Read(); nameMap = new Dictionary <string, Transform>(); for (int i = 0; i < remap.Length; i++) { if (remap[i].targetTransform != null) { nameMap.Add(remap[i].bvhName, remap[i].targetTransform); } } myClip = new AnimationClip(); myClip.name = "MyAnimation"; myClip.legacy = true; for (int i = 0; i < bi.boneList.Count; i++) { BVHImporter.Bone bone = bi.boneList[i]; string bvhName = bone.name; if (!nameMap.ContainsKey(bvhName)) { continue; } else { Transform targetTransform = nameMap[bvhName]; path = GetRelativePath(rootTransform, targetTransform); SetCurve(bone, targetTransform); } } myClip.EnsureQuaternionContinuity(); }
private void SetCurve(BVHImporter.Bone bone, Transform targetTransform) { bool posX = false; bool posY = false; bool posZ = false; bool rotX = false; bool rotY = false; bool rotZ = false; string[] props = new string[7]; keyframes = new Keyframe[7][]; float[][] values = new float[6][]; for (int channel = 0; channel < 6; channel++) { if (!bone.channels[channel].enabled) { continue; } switch (channel) { case 0: posX = true; props[channel] = "localPosition.x"; break; case 1: posY = true; props[channel] = "localPosition.y"; break; case 2: posZ = true; props[channel] = "localPosition.z"; break; case 3: rotX = true; props[channel] = "localRotation.x"; break; case 4: rotY = true; props[channel] = "localRotation.y"; break; case 5: rotZ = true; props[channel] = "localRotation.z"; break; default: channel = -1; break; } if (channel == -1) { continue; } keyframes[channel] = new Keyframe[frames]; values[channel] = bone.channels[channel].value; if (rotX && rotY && rotZ && keyframes[6] == null) { keyframes[6] = new Keyframe[frames]; props[6] = "localRotation.w"; } } float time = 0.0f; if (posX && posY && posZ) { Vector3 offset; offset = new Vector3(-bone.offsets.x, bone.offsets.y, bone.offsets.z); for (int i = 0; i < frames; i++) { time += 1.0f / frameRate; keyframes[0][i].time = time; keyframes[1][i].time = time; keyframes[2][i].time = time; keyframes[0][i].value = -values[0][i]; keyframes[1][i].value = values[1][i]; keyframes[2][i].value = values[2][i]; Vector3 bvhPosition = rootTransform.transform.InverseTransformPoint(new Vector3(keyframes[0][i].value, keyframes[1][i].value, keyframes[2][i].value) + this.transform.position + offset); bvhPosition = Resize(bvhPosition); keyframes[0][i].value = bvhPosition.x * this.transform.localScale.x; keyframes[1][i].value = bvhPosition.y * this.transform.localScale.y; keyframes[2][i].value = bvhPosition.z * this.transform.localScale.z; } myClip.SetCurve(path, typeof(Transform), props[0], new AnimationCurve(keyframes[0])); myClip.SetCurve(path, typeof(Transform), props[1], new AnimationCurve(keyframes[1])); myClip.SetCurve(path, typeof(Transform), props[2], new AnimationCurve(keyframes[2])); } time = 0.0f; if (rotX && rotY && rotZ) { Quaternion oldRotation = targetTransform.transform.rotation; for (int i = 0; i < frames; i++) { Vector3 bvhEuler = new Vector3(WrapAngle(values[3][i]), WrapAngle(values[4][i]), WrapAngle(values[5][i])); Quaternion rotation = Quaternion.Euler(bvhEuler); time += 1.0f / frameRate; keyframes[3][i].time = time; keyframes[4][i].time = time; keyframes[5][i].time = time; keyframes[6][i].time = time; keyframes[3][i].value = rotation.x; keyframes[4][i].value = -rotation.y; keyframes[5][i].value = -rotation.z; keyframes[6][i].value = rotation.w; targetTransform.transform.rotation = new Quaternion(keyframes[3][i].value, keyframes[4][i].value, keyframes[5][i].value, keyframes[6][i].value); keyframes[3][i].value = targetTransform.transform.localRotation.x; keyframes[4][i].value = targetTransform.transform.localRotation.y; keyframes[5][i].value = targetTransform.transform.localRotation.z; keyframes[6][i].value = targetTransform.transform.localRotation.w; } targetTransform.transform.rotation = oldRotation; myClip.SetCurve(path, typeof(Transform), props[3], new AnimationCurve(keyframes[3])); myClip.SetCurve(path, typeof(Transform), props[4], new AnimationCurve(keyframes[4])); myClip.SetCurve(path, typeof(Transform), props[5], new AnimationCurve(keyframes[5])); myClip.SetCurve(path, typeof(Transform), props[6], new AnimationCurve(keyframes[6])); } }