Example #1
0
    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);
    }
Example #2
0
 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);
 }
Example #3
0
	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)
     {
     }
 }
Example #5
0
	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;
	}