0

私は Kinect で作業しており、関節間の天使を見つけようとしています。たとえば、Z 座標と Y 座標の肘の角度です。X 座標と Y 座標の角度を計算するためのこのコードを見つけましたが、「回転オフセット」が何であるかがわからないため、うまく機能しませんでした。 http://www.embedded101.com/Blogs/JamesYWilson/tabid/70/entryid/167/Default.aspx

ベローなどの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));

}

誰かが私を助けてくれますか

4

1 に答える 1

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;
    }
于 2013-02-05T06:56:17.630 に答える