Spelunx Cavern SDK
 
Loading...
Searching...
No Matches
BodyData.cs
Go to the documentation of this file.
1using Microsoft.Azure.Kinect.BodyTracking;
2using Microsoft.Azure.Kinect.Sensor;
3using System;
4using System.Numerics;
5using UnityEngine;
6using System.Runtime.Serialization;
7
8namespace Spelunx.Orbbec {
9 /// Data about a body that is being tracked.
10 /// Note that its properties uses System.Numerics classes instead of UnityEngine classes for Vector2, Vector3 and Quaternion.
11 [Serializable]
12 public struct BodyData : ISerializable {
13 public const float Invalid2DCoordinate = -1;
14
15 // Take note that theses are System.Numerics classes, not UnityEngine classes.
16 public System.Numerics.Vector2[] JointPositions2D { get; private set; }
17 public System.Numerics.Vector3[] JointPositions3D { get; private set; }
18 public System.Numerics.Quaternion[] JointRotations { get; private set; }
19 public JointConfidenceLevel[] JointConfidenceLevels { get; private set; }
20 public int Length { get; private set; }
21 public uint Id { get; private set; }
22
23 public BodyData(int maxJointsLength) {
24 JointPositions2D = new System.Numerics.Vector2[maxJointsLength];
25 JointPositions3D = new System.Numerics.Vector3[maxJointsLength];
26 JointRotations = new System.Numerics.Quaternion[maxJointsLength];
27 JointConfidenceLevels = new JointConfidenceLevel[maxJointsLength];
28 Length = 0;
29 Id = 0;
30 }
31
32 public static BodyData DeepCopy(BodyData copyFromBody) {
33 int maxJointsLength = copyFromBody.Length;
34 BodyData copiedBody = new BodyData(maxJointsLength);
35
36 for (int i = 0; i < maxJointsLength; i++) {
37 copiedBody.JointPositions2D[i] = copyFromBody.JointPositions2D[i];
38 copiedBody.JointPositions3D[i] = copyFromBody.JointPositions3D[i];
39 copiedBody.JointRotations[i] = copyFromBody.JointRotations[i];
40 copiedBody.JointConfidenceLevels[i] = copyFromBody.JointConfidenceLevels[i];
41 }
42 copiedBody.Id = copyFromBody.Id;
43 copiedBody.Length = copyFromBody.Length;
44 return copiedBody;
45 }
46
47 public void CopyFromBodyTrackingSdk(Microsoft.Azure.Kinect.BodyTracking.Body body, Calibration sensorCalibration) {
48 Id = body.Id;
49 Length = Microsoft.Azure.Kinect.BodyTracking.Skeleton.JointCount;
50
51 for (int bodyPoint = 0; bodyPoint < Length; bodyPoint++) {
52 // K4ABT joint position unit is in millimeter. We need to convert to meters before we use the values.
53 JointPositions3D[bodyPoint] = body.Skeleton.GetJoint(bodyPoint).Position / 1000.0f;
54 JointRotations[bodyPoint] = body.Skeleton.GetJoint(bodyPoint).Quaternion;
55 JointConfidenceLevels[bodyPoint] = body.Skeleton.GetJoint(bodyPoint).ConfidenceLevel;
56
57 var jointPosition = JointPositions3D[bodyPoint];
58 var position2d = sensorCalibration.TransformTo2D(
59 jointPosition,
60 CalibrationDeviceType.Depth,
61 CalibrationDeviceType.Depth);
62
63 if (position2d != null) {
64 JointPositions2D[bodyPoint] = position2d.Value;
65 } else {
68 }
69 }
70 }
71
72 public BodyData(SerializationInfo info, StreamingContext context) {
73 float[] JointPositions3DX = (float[])info.GetValue("JointPositions3DX", typeof(float[]));
74 float[] JointPositions3DY = (float[])info.GetValue("JointPositions3DY", typeof(float[]));
75 float[] JointPositions3DZ = (float[])info.GetValue("JointPositions3DZ", typeof(float[]));
76 JointPositions3D = new System.Numerics.Vector3[JointPositions3DX.Length];
77 for (int i = 0; i < JointPositions3DX.Length; i++) {
78 JointPositions3D[i].X = JointPositions3DX[i];
79 JointPositions3D[i].Y = JointPositions3DY[i];
80 JointPositions3D[i].Z = JointPositions3DZ[i];
81 }
82
83 float[] JointPositions2DX = (float[])info.GetValue("JointPositions2DX", typeof(float[]));
84 float[] JointPositions2DY = (float[])info.GetValue("JointPositions2DY", typeof(float[]));
85 JointPositions2D = new System.Numerics.Vector2[JointPositions2DX.Length];
86 for (int i = 0; i < JointPositions2DX.Length; i++) {
87 JointPositions2D[i].X = JointPositions2DX[i];
88 JointPositions2D[i].Y = JointPositions2DY[i];
89 }
90
91 float[] JointRotationsX = (float[])info.GetValue("JointRotationsX", typeof(float[]));
92 float[] JointRotationsY = (float[])info.GetValue("JointRotationsY", typeof(float[]));
93 float[] JointRotationsZ = (float[])info.GetValue("JointRotationsZ", typeof(float[]));
94 float[] JointRotationsW = (float[])info.GetValue("JointRotationsW", typeof(float[]));
95 JointRotations = new System.Numerics.Quaternion[JointRotationsX.Length];
96 for (int i = 0; i < JointRotationsX.Length; i++) {
97 JointRotations[i].X = JointRotationsX[i];
98 JointRotations[i].Y = JointRotationsY[i];
99 JointRotations[i].Z = JointRotationsZ[i];
100 JointRotations[i].W = JointRotationsW[i];
101 }
102
103 uint[] ConfidenceLevel = (uint[])info.GetValue("ConfidenceLevel", typeof(uint[]));
104 JointConfidenceLevels = new JointConfidenceLevel[ConfidenceLevel.Length];
105 for (int i = 0; i < ConfidenceLevel.Length; i++) {
106 JointConfidenceLevels[i] = (JointConfidenceLevel)ConfidenceLevel[i];
107 }
108
109 Length = (int)info.GetValue("Length", typeof(int));
110 Id = (uint)info.GetValue("Id", typeof(uint));
111 }
112
113 public void GetObjectData(SerializationInfo info, StreamingContext context) {
114 float[] JointPositions3DX = new float[Length];
115 float[] JointPositions3DY = new float[Length];
116 float[] JointPositions3DZ = new float[Length];
117 for (int i = 0; i < Length; i++) {
118 JointPositions3DX[i] = JointPositions3D[i].X;
119 JointPositions3DY[i] = JointPositions3D[i].Y;
120 JointPositions3DZ[i] = JointPositions3D[i].Z;
121 }
122 info.AddValue("JointPositions3DX", JointPositions3DX, typeof(float[]));
123 info.AddValue("JointPositions3DY", JointPositions3DY, typeof(float[]));
124 info.AddValue("JointPositions3DZ", JointPositions3DZ, typeof(float[]));
125
126 float[] JointPositions2DX = new float[Length];
127 float[] JointPositions2DY = new float[Length];
128 for (int i = 0; i < Length; i++) {
129 JointPositions2DX[i] = JointPositions2D[i].X;
130 JointPositions2DY[i] = JointPositions2D[i].Y;
131 }
132 info.AddValue("JointPositions2DX", JointPositions2DX, typeof(float[]));
133 info.AddValue("JointPositions2DY", JointPositions2DY, typeof(float[]));
134
135 float[] JointRotationsX = new float[Length];
136 float[] JointRotationsY = new float[Length];
137 float[] JointRotationsZ = new float[Length];
138 float[] JointRotationsW = new float[Length];
139 for (int i = 0; i < Length; i++) {
140 JointRotationsX[i] = JointRotations[i].X;
141 JointRotationsY[i] = JointRotations[i].Y;
142 JointRotationsZ[i] = JointRotations[i].Z;
143 JointRotationsW[i] = JointRotations[i].W;
144
145 }
146 info.AddValue("JointRotationsX", JointRotationsX, typeof(float[]));
147 info.AddValue("JointRotationsY", JointRotationsY, typeof(float[]));
148 info.AddValue("JointRotationsZ", JointRotationsZ, typeof(float[]));
149 info.AddValue("JointRotationsW", JointRotationsW, typeof(float[]));
150
151 uint[] ConfidenceLevels = new uint[Length];
152 for (int i = 0; i < Length; i++) {
153 ConfidenceLevels[i] = (uint)JointConfidenceLevels[i];
154 }
155 info.AddValue("ConfidenceLevels", ConfidenceLevels, typeof(uint[]));
156
157 info.AddValue("Length", Length, typeof(int));
158 info.AddValue("Id", Id, typeof(uint));
159 }
160 }
161}
static BodyData DeepCopy(BodyData copyFromBody)
Definition: BodyData.cs:32
System.Numerics.Quaternion[] JointRotations
Definition: BodyData.cs:18
System.Numerics.Vector2[] JointPositions2D
Definition: BodyData.cs:16
BodyData(int maxJointsLength)
Definition: BodyData.cs:23
JointConfidenceLevel[] JointConfidenceLevels
Definition: BodyData.cs:19
void CopyFromBodyTrackingSdk(Microsoft.Azure.Kinect.BodyTracking.Body body, Calibration sensorCalibration)
Definition: BodyData.cs:47
BodyData(SerializationInfo info, StreamingContext context)
Definition: BodyData.cs:72
System.Numerics.Vector3[] JointPositions3D
Definition: BodyData.cs:17
const float Invalid2DCoordinate
Definition: BodyData.cs:13
void GetObjectData(SerializationInfo info, StreamingContext context)
Definition: BodyData.cs:113