/// <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); }