public override BoneMotion BoneMotionAt(RenderBone b, float frame) { if (Bone.ContainsKey (b.bone.name)) { var bones = Bone [b.bone.name]; var m0 = from x in bones where x.frame_no >= frame select x; var m1 = from x in bones where x.frame_no <= frame select x; if (m0.Count () == 0) { if (m1.Count () == 0) { return null; } else { return m1.Last (); } } else { var b0 = m0.First (); if (m1.Count () == 0) { return b0; } else { var b1 = m1.Last (); if (b0.Equals (b1)) { return b0; } else { // interpolate int dif = b1.frame_no - b0.frame_no; float a0 = frame - b0.frame_no; float ratio = a0 / dif; var m = new BoneMotion (); m.location = new float[3]; m.rotation = new float[4]; double t = bazier(b0.interp, 0, 1, ratio); m.location[0] = (float) (b0.location[0] + (b1.location[0] - b0.location[0]) * t); t = bazier(b0.interp, 1, 1, ratio); m.location[1] = (float) (b0.location[1] + (b1.location[1] - b0.location[1]) * t); t = bazier(b0.interp, 2, 1, ratio); m.location[2] = (float) (b0.location[2] + (b1.location[2] - b0.location[2]) * t); slerp(m.rotation, b0.rotation, b1.rotation, 0, 0, bazier(b0.interp, 3, 1, ratio)); return m; } } } } else { return null; } }
public override BoneMotion BoneMotionAt(RenderBone b, float frame) { if (Bone.ContainsKey(b.bone.name)) { var bones = Bone [b.bone.name]; var m0 = from x in bones where x.frame_no >= frame select x; var m1 = from x in bones where x.frame_no <= frame select x; if (m0.Count() == 0) { if (m1.Count() == 0) { return(null); } else { return(m1.Last()); } } else { var b0 = m0.First(); if (m1.Count() == 0) { return(b0); } else { var b1 = m1.Last(); if (b0.Equals(b1)) { return(b0); } else // interpolate { int dif = b1.frame_no - b0.frame_no; float a0 = frame - b0.frame_no; float ratio = a0 / dif; var m = new BoneMotion(); m.location = new float[3]; m.rotation = new float[4]; double t = bazier(b0.interp, 0, 1, ratio); m.location[0] = (float)(b0.location[0] + (b1.location[0] - b0.location[0]) * t); t = bazier(b0.interp, 1, 1, ratio); m.location[1] = (float)(b0.location[1] + (b1.location[1] - b0.location[1]) * t); t = bazier(b0.interp, 2, 1, ratio); m.location[2] = (float)(b0.location[2] + (b1.location[2] - b0.location[2]) * t); slerp(m.rotation, b0.rotation, b1.rotation, 0, 0, bazier(b0.interp, 3, 1, ratio)); return(m); } } } } else { return(null); } }
private void parseFrame(BinaryReader br) { int num = br.ReadInt32(); Log.Debug("VMD", "Animation: " + num.ToString()); string bone_name; if (num > 0) { // initialize bone hash var mh = new Dictionary <string, List <BoneMotion> > (); Bone = new Dictionary <string, List <BoneMotion> > (); // parse for (int i = 0; i < num; i++) { BoneMotion m = new BoneMotion(); bone_name = Util.ReadString(br, 15); m.frame_no = br.ReadInt32(); m.location = Util.ReadFloats(br, 3); m.rotation = Util.ReadFloats(br, 4); m.interp = br.ReadBytes(16); br.BaseStream.Position = br.BaseStream.Position + 48; List <BoneMotion> mi; if (mh.ContainsKey(bone_name)) { mi = mh [bone_name]; } else { mi = new List <BoneMotion> (); // set default BoneMotion d = new BoneMotion(); d.location = new float[3]; d.rotation = new float[4]; d.frame_no = -1; d.location [0] = d.location [1] = d.location [2] = 0; d.rotation [0] = d.rotation [1] = d.rotation [2] = 0; d.rotation [3] = 1; d.interp = null; mi.Add(d); mh[bone_name] = mi; } mi.Add(m); if (m.frame_no > max_frame) { max_frame = m.frame_no; } } // sorted by frame_no foreach (var i in mh) { Bone[i.Key] = new List <BoneMotion>(from x in i.Value orderby x.frame_no select x); } } else { Bone = null; } }
private void parseFrame(BinaryReader br) { int num = br.ReadInt32 (); Log.Debug ("VMD", "Animation: " + num.ToString()); string bone_name; if (num > 0) { // initialize bone hash var mh = new Dictionary<string, List<BoneMotion> > (); Bone = new Dictionary<string, List<BoneMotion> > (); // parse for (int i = 0; i < num; i++) { BoneMotion m = new BoneMotion (); bone_name = Util.ReadString (br, 15); m.frame_no = br.ReadInt32 (); m.location = Util.ReadFloats (br, 3); m.rotation = Util.ReadFloats (br, 4); m.interp = br.ReadBytes (16); br.BaseStream.Position = br.BaseStream.Position + 48; List<BoneMotion> mi; if (mh.ContainsKey (bone_name)) { mi = mh [bone_name]; } else { mi = new List<BoneMotion> (); // set default BoneMotion d = new BoneMotion (); d.location = new float[3]; d.rotation = new float[4]; d.frame_no = -1; d.location [0] = d.location [1] = d.location [2] = 0; d.rotation [0] = d.rotation [1] = d.rotation [2] = 0; d.rotation [3] = 1; d.interp = null; mi.Add (d); mh[bone_name] = mi; } mi.Add (m); if (m.frame_no > max_frame) { max_frame = m.frame_no; } } // sorted by frame_no foreach (var i in mh) { Bone[i.Key] = new List<BoneMotion>(from x in i.Value orderby x.frame_no select x); } } else { Bone = null; } }