/// <summary> /// /// </summary> /// <param name="node"></param> /// <param name="type"></param> /// <param name="keys"></param> /// <param name="defaultValue"></param> private void CreateTrack(FigaTreeNode node, JointTrackType type, List <FOBJKey> keys, float defaultValue) { // empty track if (keys.Count == 0) { return; } // skip constant tracks if (keys.Count == 1 && Math.Abs(keys[0].Value - defaultValue) < 0.001f) { return; } // skip constant tracks if (keys.Count == 2 && Math.Abs(keys[0].Value - defaultValue) < 0.001f) { return; } HSD_FOBJ fobj = new HSD_FOBJ(); fobj.SetKeys(keys, type); HSD_Track track = new HSD_Track(); track.FromFOBJ(fobj); node.Tracks.Add(track); }
/// <summary> ///删除玩家索引下所有跟踪事件 /// </summary> /// <param name="index">玩家索引</param> public void RemoveTrackEvent(JointTrackType jointTrackType, int playerIndex) { if (TrackEvent.ContainsKey(jointTrackType)) { if (TrackEvent[jointTrackType].ContainsKey(playerIndex)) { TrackEvent[jointTrackType].Remove(playerIndex); } } }
/// <summary> ///删除玩家关节下所有跟踪事件 /// <param name="index">玩家索引</param> /// <param name="jointType">跟踪关节</param> public void RemoveTrackEvent(JointTrackType jointTrackType, int playerIndex, KinectInterop.JointType jointType) { if (TrackEvent.ContainsKey(jointTrackType)) { if (TrackEvent[jointTrackType].ContainsKey(playerIndex)) { if (TrackEvent[jointTrackType][playerIndex].ContainsKey(jointType)) { TrackEvent[jointTrackType][playerIndex].Remove(jointType); } } } }
/// <summary> /// /// </summary> /// <param name="node"></param> /// <param name="frame"></param> /// <param name="value"></param> /// <param name="track"></param> /// <param name="manager"></param> private static void AddKey(int node, int frame, float value, JointTrackType tracktype, JointAnimManager manager) { var track = manager.Nodes[node].Tracks.Find(e => e.JointTrackType == tracktype); if (track == null) { track = new FOBJ_Player() { JointTrackType = tracktype }; manager.Nodes[node].Tracks.Add(track); } track.Keys.Add(new FOBJKey() { Frame = frame, Value = value, InterpolationType = frame == 0 ? GXInterpolationType.HSD_A_OP_KEY : GXInterpolationType.HSD_A_OP_CON }); }
/// <summary> ///添加跟踪事件 /// </summary> /// <param name="playerIndex">玩家索引</param> /// <param name="jointType">跟踪关节</param> /// <param name="trackObj">物体</param> public void AddTrackEvent(JointTrackType jointTrackType, int playerIndex, KinectInterop.JointType jointType, Transform trackObj) { if (TrackEvent.ContainsKey(jointTrackType)) { if (TrackEvent[jointTrackType].ContainsKey(playerIndex)) { if (TrackEvent[jointTrackType][playerIndex].ContainsKey(jointType)) { TrackEvent[jointTrackType][playerIndex][jointType].Add(trackObj); } else { List <Transform> list_T = new List <Transform>(); list_T.Add(trackObj); TrackEvent[jointTrackType][playerIndex].Add(jointType, list_T); } } else { Dictionary <KinectInterop.JointType, List <Transform> > dic_J = new Dictionary <KinectInterop.JointType, List <Transform> >(); List <Transform> list_T = new List <Transform>(); list_T.Add(trackObj); dic_J.Add(jointType, list_T); TrackEvent[jointTrackType].Add(playerIndex, dic_J); } } else { Dictionary <int, Dictionary <KinectInterop.JointType, List <Transform> > > dic_I = new Dictionary <int, Dictionary <KinectInterop.JointType, List <Transform> > >(); Dictionary <KinectInterop.JointType, List <Transform> > dic_J = new Dictionary <KinectInterop.JointType, List <Transform> >(); List <Transform> list_T = new List <Transform>(); list_T.Add(trackObj); dic_J.Add(jointType, list_T); dic_I.Add(playerIndex, dic_J); TrackEvent.Add(jointTrackType, dic_I); Debug.Log(TrackEvent.ContainsKey(JointTrackType._3D)); } }
public static HSD_FOBJ EncodeFrames(List <FOBJKey> Keys, JointTrackType TrackType, float error = 0.0001f) { return(EncodeFrames(Keys, (byte)TrackType, error)); }
/// <summary> /// /// </summary> /// <param name="endValue"></param> /// <param name="startFrame"></param> /// <param name="endFrame"></param> /// <param name="trackType"></param> /// <returns></returns> public static void GenerateFOBJ(HSD_AOBJ aobj, float startValue, float endValue, float startFrame, float endFrame, JointTrackType trackType) { List <FOBJKey> keys = new List <FOBJKey>(); if (startFrame != 0) { keys.Add(new FOBJKey() { Frame = 0, Value = startValue, InterpolationType = GXInterpolationType.HSD_A_OP_CON }); } keys.Add(new FOBJKey() { Frame = startFrame, Value = startValue, InterpolationType = GXInterpolationType.HSD_A_OP_LIN }); keys.Add(new FOBJKey() { Frame = endFrame, Value = endValue, InterpolationType = GXInterpolationType.HSD_A_OP_CON }); keys.Add(new FOBJKey() { Frame = 1600, Value = endValue, InterpolationType = GXInterpolationType.HSD_A_OP_CON }); var fobj = new HSD_FOBJDesc(); fobj.SetKeys(keys, (byte)trackType); if (aobj.FObjDesc == null) { aobj.FObjDesc = fobj; } else { aobj.FObjDesc.Add(fobj); } }
public static HSD_FOBJ EncodeFrames(List <FOBJKey> Keys, JointTrackType TrackType) { return(EncodeFrames(Keys, (byte)TrackType)); }
/// <summary> /// /// </summary> /// <param name="track"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="z"></param> private static HSD_FOBJ OrientTrack(string boneName, SkeletonPorter port, List <FOBJKey> keys, JointTrackType trackType, HSD_JOBJ sourceBone, HSD_JOBJ targetBone) { //var frames = keys.Select(e => e.Frame);//.Join(y.Keys.Select(e=>e.Frame).Join(z.Keys.Select(e=>e.Frame))).Distinct(); Vector3 unit = Vector3.Zero; switch (trackType) { case JointTrackType.HSD_A_J_ROTX: unit = Vector3.UnitX; break; case JointTrackType.HSD_A_J_ROTY: unit = Vector3.UnitY; break; case JointTrackType.HSD_A_J_ROTZ: unit = Vector3.UnitZ; break; } var newTrack = port.ReOrientParent(unit, boneName); if (Math.Abs(Math.Abs(newTrack.X) - 1) < 0.001f) { trackType = JointTrackType.HSD_A_J_ROTX; } if (Math.Abs(Math.Abs(newTrack.Y) - 1) < 0.001f) { trackType = JointTrackType.HSD_A_J_ROTY; } if (Math.Abs(Math.Abs(newTrack.Z) - 1) < 0.001f) { trackType = JointTrackType.HSD_A_J_ROTZ; } /*var k = keys[0]; * keys.Clear(); * k.InterpolationType = GXInterpolationType.HSD_A_OP_KEY; * keys.Add(k);*/ int index = 0; foreach (var f in keys) { var rot = unit * f.Value; rot -= new Vector3(sourceBone.RX, sourceBone.RY, sourceBone.RZ); rot = port.ReOrientParent(rot, boneName); rot += new Vector3(targetBone.RX, targetBone.RY, targetBone.RZ); if (boneName.Equals("LLegJA")) { System.Diagnostics.Debug.WriteLine($"{boneName} {trackType} {rot} {f.Value}"); } if (boneName.Equals("RShoulderN")) { System.Diagnostics.Debug.WriteLine($"{boneName} {trackType} {rot} {f.Value}"); } if (boneName.Equals("LKneeJ")) { System.Diagnostics.Debug.WriteLine($"{boneName} {trackType} {rot} {f.Value}"); } switch (trackType) { case JointTrackType.HSD_A_J_ROTX: f.Value = rot.X; break; case JointTrackType.HSD_A_J_ROTY: f.Value = rot.Y; break; case JointTrackType.HSD_A_J_ROTZ: f.Value = rot.Z; break; } index++; } var fobj = new HSD_FOBJ(); fobj.SetKeys(keys, trackType); return(fobj); }