public void UpdateAngle(Skeleton s) { Joint joint = s.GetJoint(JointType); Quaternion jointOrientation = Quaternion.Inverse(CalibrationInfo.SensorOrientation) * joint.ToQuaternionMirrored() * BaseRotOffset; Bone.rotation = jointOrientation; }
void ProcessSkeleton(Skeleton skeleton) { print($"Frame Counter: {frameCtr}"); //Calculate the model position: take the Torso position and invert movement along the Z axis UnityEngine.Vector3 torsoPos = Quaternion.Euler(0f, 180f, 0f) * (-0.001f * skeleton.GetJoint(JointType.Torso).ToVector3()); torsoPos[0] = torsoPos[0] * posModifier[0]; for (int i = 0; i < 3; i++) { torsoPos[i] = torsoPos[i] + posModifier[i]; } torsoPos = torsoPos + posModifierPreview; transform.position = torsoPos; foreach (var riggedJoint in jointsRigged) { try { //Get joint from the Nuitrack nuitrack.Joint joint = skeleton.GetJoint(riggedJoint.Key); ModelJoint modelJoint = riggedJoint.Value; //Calculate the model bone rotation: take the mirrored joint orientation, add a basic rotation of the model bone, invert movement along the Z axis Quaternion jointOrient = Quaternion.Inverse(CalibrationInfo.SensorOrientation) * (joint.ToQuaternion()) * modelJoint.baseRotOffset; modelJoint.bone.rotation = jointOrient; } catch { // Ignore IndexOutOfRangeException (it occurs because model has more available joints than those provided by orbbec) } } }
void OnSkeletonUpdate(SkeletonData skeletonData) { string json = Nuitrack.GetInstancesJson(); faceInfo = JsonUtility.FromJson <FaceInfo>(json.Replace("\"\"", "[]")); if (faceInfo.Instances.Length == 0) { return; } for (int i = 0; i < faceAnimControllers.Count; i++) { if (i < skeletonData.Skeletons.Length) { Skeleton skeleton = skeletonData.GetSkeletonByID(faceInfo.Instances[i].id); if (skeleton != null) { nuitrack.Joint headJoint = skeleton.GetJoint(JointType.Head); faceAnimControllers[i].gameObject.SetActive(headJoint.Confidence > 0.5f); faceAnimControllers[i].UpdateFace(faceInfo.Instances[i], headJoint); } } else { faceAnimControllers[i].gameObject.SetActive(false); } } }
nuitrack.Joint[] ProcessKafkaMessage(string value) { nuitrack.Joint[] skeletonJoints = new nuitrack.Joint[19]; print("1"); string[] partitions = Regex.Split(value, "\"orientations\""); string[] pos = Regex.Split(partitions[0], "\""); string[] ori = Regex.Split(partitions[1], "\""); string[] vecStr; int h = 2; int i; int j = 0; int k; for (i = 7; i < pos.Length; i += 2) { vecStr = Regex.Split(Regex.Split(Regex.Split(pos[i + 1], "\\[")[1], "\\]")[0], ","); nuitrack.Vector3 vec = new nuitrack.Vector3( float.Parse(vecStr[0], CultureInfo.InvariantCulture.NumberFormat), float.Parse(vecStr[1], CultureInfo.InvariantCulture.NumberFormat), float.Parse(vecStr[2], CultureInfo.InvariantCulture.NumberFormat) ); //print(ori[h]); string[] tmp1 = Regex.Split(ori[h], "\\["); string[] tmp2 = Regex.Split(tmp1[1], "\\]"); vecStr = Regex.Split(tmp2[0], ","); h += 2; nuitrack.Orientation mat = new nuitrack.Orientation(); mat.Matrix = new float[9]; for (k = 0; k < 9; k++) { mat.Matrix[k] = float.Parse(vecStr[k], CultureInfo.InvariantCulture.NumberFormat); //print(mat.Matrix[k]); } nuitrack.Joint curJoint = new nuitrack.Joint(); curJoint.Type = jointMapping[pos[i]]; curJoint.Real = vec; curJoint.Orient = mat; skeletonJoints[j] = curJoint; j++; //if(j==19) {print(j)}; } print("2"); return(skeletonJoints); }
public override ComparisonFrameData Compare(Skeleton s1, Skeleton s2) { ComparisonFrameData comparisonData = new ComparisonFrameData(); Skeleton uniformSkeleton1 = UniformSkeleton(s1); Skeleton uniformSkeleton2 = UniformSkeleton(s2); Joint[] joints1 = uniformSkeleton1.Joints; Joint[] joints2 = uniformSkeleton2.Joints; for (int i = 0; i < joints1.Length; i++) { Joint j1 = joints1[i]; Joint j2 = joints2[i]; if (j1.Type != j2.Type) { throw new InvalidOperationException($"wrong type of joints being compared: {j1.Type} != {j2.Type}"); } Vector3 v1 = j1.ToVector3(); Vector3 v2 = j2.ToVector3(); Vector3 diff = v2 - v1; float preliminary = diff.magnitude; #region Different preliminary implementations //float preliminary = Mathf.Atan(v2.sqrMagnitude/v1.sqrMagnitude); //float preliminary = Mathf.Clamp(diff.magnitude, 0, 1); //float preliminary = v1 == v2 ? 1.0f : Vector3.Dot(v1, v2); //float preliminary = v1 == v2 ? 1.0f : Vector3.Dot(v1, v2); #endregion //float score = curve.Evaluate(preliminary); float score = curve.Evaluate(1 - preliminary); if (preliminary > 1.0f) { Debug.Log($"{j1.Type} : {preliminary}"); } comparisonData[j1.Type] = score; } return(comparisonData); }
public void ProcessSkeleton(Skeleton skeleton) { if (skeleton == null) { return; } for (int i = 0; i < jointsInfo.Length; i++) { nuitrack.Joint j = skeleton.GetJoint(jointsInfo[i]); if (j.Confidence > 0.5f) { joints[jointsInfo[i]].SetActive(true); joints[jointsInfo[i]].transform.position = new Vector2(j.Proj.X * Screen.width, Screen.height - j.Proj.Y * 344f); } else { joints[jointsInfo[i]].SetActive(false); } } for (int i = 0; i < connectionsInfo.GetLength(0); i++) { GameObject startJoint = joints[connectionsInfo[i, 0]]; GameObject endJoint = joints[connectionsInfo[i, 1]]; if (startJoint.activeSelf && endJoint.activeSelf) { connections[i].SetActive(true); connections[i].transform.position = startJoint.transform.position; connections[i].transform.right = endJoint.transform.position - startJoint.transform.position; float distance = Vector3.Distance(endJoint.transform.position, startJoint.transform.position); connections[i].transform.localScale = new Vector3(distance, 1f, 1f); } else { connections[i].SetActive(false); } } this.waistRollingAvgY = (JointPosition(JointType.Waist).y + this.waistRollingAvgY) / 2; this.gestureBarContainer.transform.position = JointPosition(JointType.Head) + new Vector3(50, 0, 0); }
protected Skeleton UniformSkeleton(Skeleton s) { Vector3 originalTorsoPos = Vector3.zero; Joint[] uniformJoints = new Joint[s.Joints.Length]; for (int i = 0; i < uniformJoints.Length; i++) { Joint joint = s.Joints[i]; Vector3 jointVector = joint.ToVector3(); Vector3 translatedJointVector = jointVector - originalTorsoPos; Vector3 normalizedVector = translatedJointVector.normalized; joint.Real = normalizedVector.ToNuitrackVector3(); uniformJoints[i] = joint; } return(new Skeleton(s.ID, uniformJoints)); }
void FixedUpdate() { Skeleton userSkeleton = SkeletonProvider.CurSkeleton; if (userSkeleton == null || !Enabled) { meshRenderer.enabled = false; } else { try { Joint joint = userSkeleton.GetJoint(JointType); actualPosition = joint.ToVector3(); meshRenderer.enabled = joint.Confidence >= MINIMUM_CONFIDENCE; Vector3 jointVector = joint.ToVector3(); Vector3 newPosition = 0.01f * jointVector; if (Bound) { newPosition += Origin; if (JointType == OffsetJointType) { OwnerNativeAvatar.JointTrackerOffsetDistance = newPosition; newPosition = Origin; } else { newPosition += Origin - OwnerNativeAvatar.JointTrackerOffsetDistance; } } meshRenderer.material.color = Color; transform.position = newPosition; } catch (IndexOutOfRangeException) { meshRenderer.enabled = false; } } }