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.
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
