private VMDFormat.MotionList ReadMotionList() { VMDFormat.MotionList result = new VMDFormat.MotionList(); result.motion_count = binary_reader_.ReadUInt32(); result.motion = new Dictionary <string, List <VMDFormat.Motion> >(); // 一度バッファに貯めてソートする VMDFormat.Motion[] buf = new VMDFormat.Motion[result.motion_count]; for (int i = 0; i < result.motion_count; i++) { buf[i] = ReadMotion(); } Array.Sort(buf, (x, y) => ((int)x.frame_no - (int)y.frame_no)); try { // モーションの数だけnewされないよね? for (int i = 0; i < result.motion_count; i++) { result.motion.Add(buf[i].bone_name, new List <VMDFormat.Motion>()); } } catch { } // dictionaryにどんどん登録 for (int i = 0; i < result.motion_count; i++) { result.motion[buf[i].bone_name].Add(buf[i]); } return(result); }
private VMDFormat.Motion ReadMotion() { VMDFormat.Motion result = new VMDFormat.Motion(); result.bone_name = ConvertByteToString(binary_reader_.ReadBytes(15), ""); result.frame_no = binary_reader_.ReadUInt32(); result.location = ReadSinglesToVector3(binary_reader_); result.rotation = ReadSinglesToQuaternion(binary_reader_); result.interpolation = binary_reader_.ReadBytes(64); return(result); }
private VMDFormat.Motion ReadMotion() { VMDFormat.Motion result = new VMDFormat.Motion(); result.bone_name = ConvertByteToString(binary_reader_.ReadBytes(15), ""); result.flame_no = binary_reader_.ReadUInt32(); result.location = ReadSinglesToVector3(binary_reader_); result.rotation = ReadSinglesToQuaternion(binary_reader_); result.interpolation = binary_reader_.ReadBytes(64); return result; }
private void CreateKeysForRotation(VMDFormat format, AnimationClip clip, string current_bone, string bone_path, int interpolationQuality) { try { if (this.boneNameMap.ContainsKey(current_bone)) { string text = this.boneNameMap[current_bone]; List <VMDFormat.Motion> list; if (!format.motion_list.motion.ContainsKey(text)) { Console.WriteLine("bone {0} not found in motionlist", text); Console.WriteLine("Add dummy rotation frame (rot 0,0,0) for the bone {0}", text); list = new List <VMDFormat.Motion>(); VMDFormat.Motion item = new VMDFormat.Motion(text, 0u, Vector3.zero, Quaternion.identity, new byte[64]); list.Add(item); } else { list = format.motion_list.motion[text]; } Dictionary <string, AnimationCurve> dictionary = null; BoneAdjustment boneAdjustment = null; if (this.boneAdjustment.ContainsKey(current_bone)) { boneAdjustment = this.boneAdjustment[current_bone]; } VMDHSConverter.QuaternionKeyframe[] custom_keys = new VMDHSConverter.QuaternionKeyframe[this.GetKeyframeCount(list, 3, interpolationQuality)]; VMDHSConverter.QuaternionKeyframe prev_keyframe = null; int num = 0; Quaternion quaternion = Quaternion.identity; for (int i = 0; i < list.Count; i++) { float num2 = list[i].flame_no * 0.0333333351f; Quaternion quaternion2 = list[i].rotation; if (dictionary != null) { AnimationCurve animationCurve = null; dictionary.TryGetValue("localEulerAngles.x", out animationCurve); AnimationCurve animationCurve2 = null; dictionary.TryGetValue("localEulerAngles.y", out animationCurve2); AnimationCurve animationCurve3 = null; dictionary.TryGetValue("localEulerAngles.z", out animationCurve3); Quaternion quaternion3 = Quaternion.identity; if (animationCurve != null && animationCurve2 != null && animationCurve3 != null) { quaternion3 = Quaternion.Euler(animationCurve.Evaluate(num2), animationCurve2.Evaluate(num2), animationCurve3.Evaluate(num2)); quaternion2 *= quaternion3; } } if (boneAdjustment != null) { quaternion2 = boneAdjustment.GetAdjustedRotation(quaternion2); } if (i != 0) { quaternion2 = Quaternion.Slerp(quaternion, quaternion2, 0.99999f); } VMDHSConverter.QuaternionKeyframe quaternionKeyframe = new VMDHSConverter.QuaternionKeyframe(num2, quaternion2); VMDHSConverter.QuaternionKeyframe.AddBezierKeyframes(list[i].interpolation, 3, prev_keyframe, quaternionKeyframe, interpolationQuality, ref custom_keys, ref num); prev_keyframe = quaternionKeyframe; quaternion = quaternion2; } Keyframe[] array = null; Keyframe[] array2 = null; Keyframe[] array3 = null; Dictionary <string, Keyframe[]> dictionary2 = this.ToKeyframesForRotation(custom_keys, ref array, ref array2, ref array3, false); new AnimationCurve(array); new AnimationCurve(array2); new AnimationCurve(array3); AnimationCurve animationCurve4 = new AnimationCurve(dictionary2["localRotation.x"]); AnimationCurve animationCurve5 = new AnimationCurve(dictionary2["localRotation.y"]); AnimationCurve animationCurve6 = new AnimationCurve(dictionary2["localRotation.z"]); AnimationCurve animationCurve7 = new AnimationCurve(dictionary2["localRotation.w"]); clip.SetCurve(bone_path, typeof(Transform), "localRotation.x", animationCurve4); clip.SetCurve(bone_path, typeof(Transform), "localRotation.y", animationCurve5); clip.SetCurve(bone_path, typeof(Transform), "localRotation.z", animationCurve6); clip.SetCurve(bone_path, typeof(Transform), "localRotation.w", animationCurve7); if (text == "センター") { this.centerXCurve = animationCurve4; this.centerYCurve = animationCurve5; this.centerZCurve = animationCurve6; this.centerWCurve = animationCurve7; } } } catch (KeyNotFoundException) { } }
private VMDFormat.MotionList ReadMotionList() { VMDFormat.MotionList result = new VMDFormat.MotionList(); result.motion_count = binary_reader_.ReadUInt32(); result.motion = new Dictionary<string, List<VMDFormat.Motion>>(); // 一度バッファに貯めてソートする VMDFormat.Motion[] buf = new VMDFormat.Motion[result.motion_count]; for (int i = 0; i < result.motion_count; i++) { buf[i] = ReadMotion(); } Array.Sort(buf, (x,y)=>((int)x.flame_no-(int)y.flame_no)); // モーションの数だけnewされないよね? for (int i = 0; i < result.motion_count; i++) { try { result.motion.Add(buf[i].bone_name, new List<VMDFormat.Motion>()); } catch {} } // dictionaryにどんどん登録 for (int i = 0; i < result.motion_count; i++) { result.motion[buf[i].bone_name].Add(buf[i]); } return result; }