Пример #1
0
        /// <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);
        }
Пример #2
0
 /// <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);
         }
     }
 }
Пример #3
0
 /// <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);
             }
         }
     }
 }
Пример #4
0
        /// <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
            });
        }
Пример #5
0
 /// <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));
     }
 }
Пример #6
0
 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);
            }
        }
Пример #8
0
 public static HSD_FOBJ EncodeFrames(List <FOBJKey> Keys, JointTrackType TrackType)
 {
     return(EncodeFrames(Keys, (byte)TrackType));
 }
Пример #9
0
        /// <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);
        }