2013-02-03 70 views
0

我在Kinect工作,我試圖找到關節之間的天使,例如:Z和Y的肘部角度協調。我發現這個代碼用於計算X和Y座標中的角度,但它不能很好地工作,因爲我不知道什麼是「旋轉偏移」。 http://www.embedded101.com/Blogs/JamesYWilson/tabid/70/entryid/167/Default.aspxKinect關節角度

我閱讀了一些在stackoverflow中的代碼,例如波紋管,但它不能很好地工作,我不明白它們是如何不忽略z值的。

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

} 

認罪可能有人幫助我在

回答

0

我發現,我一直在尋找:)

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; 
    } 
方法