2

私は kinect と C# プログラミングに取り組んでいるので、非常に素人なので、関節角度について知りたいです。

Kinect を使用せずに自分のスキルをテストするためだけにこのコードを作成しましたが、コードに問題があります。

vector3v1と vector3v2を共同置換として想定しましたが、からの値 Find_angleは ですNaN

プロセスに何か欠けていますか?この点で何か助けてください。

Vector3 V1 = new Vector3(100,40,90);
Vector3 v2 = new Vector3(160,60,90);
public MainWindow()
{
    InitializeComponent();

    Vector3.Normalize(V1);
    Vector3.Normalize(v2);

    float Result = this.find_angle(V1,v2);
    MessageBox.Show(Result.ToString());
}
public float find_angle(Vector3 va, Vector3 vb)
{
    float dot_pro=Vector3.Dot(va, vb);
    double angle = Math.Acos(dot_pro);

    angle = angle * 180 / Math.PI;

    return (float)(angle);
}
4

3 に答える 3

2

必要なジョイントの X と Y を取得し、その両側にジョイントを取得します。次に、2 つの座標から角度を計算するにはどうすればよいですか?の角度を計算する方法を参照してください。

基本的には:

float x1 = joint1.X;
float y1 = joint1.Y;

float x2 = joint2.X;
float y2 = joint2.Y;

float angleRadians;

float diffX = x2 - x1;
float diffY = y2 - y1;

float atan2Result = (float)Math.Atan2(diffX, diffY);
angleRadians = atan2Result / 2;
if (angleRadians < 0.0f)
    angleRadians += (float)Math.PI;

float tempCosine = (float)Math.Cos(angleRadians);
float tempSine = ((float)Math.Sin(angleRadians) * -1);

編集

ジョイント トラッキングの機能については、Kinect の横方向のスケルトン トラッキングを参照してください。

于 2012-09-20T02:56:33.950 に答える
1

Kinect SDK を使用してスケルタル トラッキングを取得している場合は、次を使用できます。

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

    }

この方法では、3 つのジョイントを使用して角度を取得します。

ここに画像の説明を入力

于 2012-09-20T12:50:15.223 に答える
0

私はそれに慣れていませんが、acos を適用する前に、ベクトルの積をそれらのサイズで割る必要があります。

例:

double len_prod = va.Len * vb.Len;
double angle = Math.Acos(dot_pro / len_prod);
于 2012-09-19T17:20:15.867 に答える