http://stackoverflow.com/questions/12608734/body-joints-angle-using-kinect-checking-time-interval?rq=1
http://stackoverflow.com/questions/15989322/calculate-kinect-skeleton-knee-and-elbow-angles-using-existing-joint-angles
http://channel9.msdn.com/coding4fun/kinect/Kinect-Earth-Move
http://social.msdn.microsoft.com/Forums/en-US/8516bab7-c28b-4834-82c9-b3ef911cd1f7/using-kinect-to-calculate-angles-between-human-body-joints
public static double myMethodZY(Joint j1, Joint j2, Joint j3)
{
Vector3 a = new Vector3(0, j1.Position.Y- j2.Position.Y, j1.Position.Z- j2.Position.Z);
Vector3 b = new Vector3(0, j3.Position.Y - j2.Position.Y, j3.Position.Z - j2.Position.Z);
a.Normalize();
b.Normalize();
double dotProduct = Vector3.Dot(a,b);
double angle= Math.Acos(dotProduct);
angle = angle * 180 / Math.PI;
//angle = 180 - angle;
return angle;
}
f you are using Kinect SDK to get the skeletal tracking, the you can use this:
/// <summary>
/// Return the angle between 3 Joints
/// Regresa el ángulo interno dadas 3 Joints
/// </summary>
/// <param name="j1"></param>
/// <param name="j2"></param>
/// <param name="j3"></param>
/// <returns></returns>
public
static
double
AngleBetweenJoints
(
Joint
j1
,
Joint
j2
,
Joint
j3
)
{
double
Angulo
=
0
;
double
shrhX
=
j1
.
Position
.
X
-
j2
.
Position
.
X
;
double
shrhY
=
j1
.
Position
.
Y
-
j2
.
Position
.
Y
;
double
shrhZ
=
j1
.
Position
.
Z
-
j2
.
Position
.
Z
;
double
hsl
=
vectorNorm
(
shrhX
,
shrhY
,
shrhZ
);
double
unrhX
=
j3
.
Position
.
X
-
j2
.
Position
.
X
;
double
unrhY
=
j3
.
Position
.
Y
-
j2
.
Position
.
Y
;
double
unrhZ
=
j3
.
Position
.
Z
-
j2
.
Position
.
Z
;
double
hul
=
vectorNorm
(
unrhX
,
unrhY
,
unrhZ
);
double
mhshu
=
shrhX
*
unrhX
+
shrhY
*
unrhY
+
shrhZ
*
unrhZ
;
double
x
=
mhshu
/
(
hul
*
hsl
);
if
(
x
!=
Double
.
NaN
)
{
if
(-
1
<=
x
&&
x
<=
1
)
{
double
angleRad
=
Math
.
Acos
(
x
);
Angulo
=
angleRad
*(
180.0
/
Math
.
PI
);
}
else
Angulo
=
0
;
}
else
Angulo
=
0
;
return
Angulo
;
}
/// <summary>
/// Euclidean norm of 3-component Vector
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <param name="z"></param>
/// <returns></returns>
private
static
double
vectorNorm
(
double
x
,
double
y
,
double
z
)
{
return
Math
.
Sqrt
(
Math
.
Pow
(
x
,
2
)
+
Math
.
Pow
(
y
,
2
)
+
Math
.
Pow
(
z
,
2
));
}
This method use 3 joints to get an angle.