/// <summary>
    /// Updates the skeleton data from ZEDCamera call and send it to Skeleton Handler script.
    /// </summary>
    private void updateSkeletonData(DetectionFrame dframe)
    {
        #if FAKEMODE
        if (avatarControlList.ContainsKey(0))
        {
            SkeletonHandler handler = avatarControlList[0];
            handler.setFakeTest(indexFakeTest);
        }
        else
        {
            SkeletonHandler handler = ScriptableObject.CreateInstance <SkeletonHandler>();
            handler.Create(Avatar, Vector3.zero);
            avatarControlList.Add(0, handler);
        }
        #else
        List <int>            remainingKeyList = new List <int>(avatarControlList.Keys);
        List <DetectedObject> newobjects       = dframe.GetFilteredObjectList(showON, showSEARCHING, showOFF);

        /*if (dframe.rawObjectsFrame.detectionModel!= sl.DETECTION_MODEL.HUMAN_BODY_ACCURATE &&
         *      dframe.rawObjectsFrame.detectionModel!= sl.DETECTION_MODEL.HUMAN_BODY_FAST)
         * {
         *      Debug.Log("Wrong model selected : " + dframe.rawObjectsFrame.detectionModel);
         * return;
         * }*/

        foreach (DetectedObject dobj in newobjects)
        {
            int person_id = dobj.rawObjectData.id;

            //Avatar controller already exist --> update position
            if (avatarControlList.ContainsKey(person_id))
            {
                SkeletonHandler handler = avatarControlList[person_id];
                UpdateAvatarControl(handler, dobj.rawObjectData, useAvatar);

                // remove keys from list
                remainingKeyList.Remove(person_id);
            }
            else
            {
                SkeletonHandler handler       = ScriptableObject.CreateInstance <SkeletonHandler>();
                Vector3         spawnPosition = zedManager.GetZedRootTansform().TransformPoint(dobj.rawObjectData.rootWorldPosition);
                handler.Create(Avatar, spawnPosition);
                handler.initSkeleton(person_id);
                avatarControlList.Add(person_id, handler);
                UpdateAvatarControl(handler, dobj.rawObjectData, useAvatar);
            }
        }

        foreach (int index in remainingKeyList)
        {
            SkeletonHandler handler = avatarControlList[index];
            handler.Destroy();
            avatarControlList.Remove(index);
        }
                #endif
    }
    /// <summary>
    /// Function to update avatar control with data from ZED SDK.
    /// </summary>
    /// <param name="handler">Handler.</param>
    /// <param name="p">P.</param>
    private void UpdateAvatarControl(SkeletonHandler handler, sl.ObjectDataSDK data, bool useAvatar)
    {
        Vector3 bodyCenter = data.rootWorldPosition;

        if (bodyCenter == Vector3.zero)
        {
            return;                              // Object not detected
        }
        Vector3[] world_joints_pos = new Vector3[20];
        for (int i = 0; i < 18; i++)
        {
            world_joints_pos[i] = zedManager.GetZedRootTansform().TransformPoint(data.skeletonJointPosition[i]);
        }

        //Create Joint with middle position :
        world_joints_pos[0]  = (world_joints_pos[16] + world_joints_pos[17]) / 2;
        world_joints_pos[18] = (world_joints_pos[8] + world_joints_pos[11]) / 2;
        world_joints_pos[19] = zedManager.GetZedRootTansform().TransformPoint(data.skeletonJointPosition[0]); // Add Nose Joint for skeleton vizualisation

        /*
         *      for (int i=0;i<19;i++)
         *      Debug.Log(" jt "+i+" : "+world_joints_pos[i]);*/

        Vector3 worldbodyRootPosition = zedManager.GetZedRootTansform().TransformPoint(bodyCenter);

        if (float.IsNaN(world_joints_pos[18].y))
        {
            worldbodyRootPosition.y = 0;
        }
        else
        {
            worldbodyRootPosition.y = world_joints_pos[18].y - SpineHeight;
        }

        handler.setControlWithJointPosition(world_joints_pos, worldbodyRootPosition, useAvatar);
        //handler.setJointSpherePoint(world_joints_pos);

        handler.SetSmoothFactor(smoothFactor);
    }