3

私は Kinect 開発にかなり慣れていないので、Kinect ジョイントの回転を可能にするコンポーネントを構築しようとしています。これの目的は、キャプチャしたスケルトン データを手動で「修正」することです。キャプチャ後、スケルトンがジャンプし始めます。

らせんツールキットを使用して、Kinect スケルトンを 3D 空間に表示しています。任意の時点でスケルトン ストリームを一時停止し、BoneRotations オブジェクトに保持されている AbsoluteRotation と HierarchicalRotation のマトリックス値を確認できます。

X 軸、Y 軸、Z 軸を表す 3 つのスライダーを作成しました。最小/最大値を、操作するボーンの自然な動きに関連する値に設定しました (たとえば、Y 軸では、肩は約 40 度を超えて動きません)。肩 (右) の関節を例にとると、3D 空間でボーンの位置を変更できるように、各軸に回転を適用できるようにしたいと考えています。この種のアクションに関連する用語は順運動学だと思います。

私の質問は次のとおりです。

a) Kinect SDK は、関節の絶対的な階層マトリックスを提供します。操作するにはどれを見ればよいですか?

b) 四元数が与えて、行列が与えないものは何ですか?

c) 4x4 マトリックス情報を取得して、X 軸、Y 軸、Z 軸の角度 (度またはラジアン) を見つけるにはどうすればよいですか?

d) 次のような計算を使用して 3x3 行列を乗算して変換する方法を見てきました。

    Matrix3X3 matrixx = new Matrix3X3();
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            matrixx.elements[(i * 3) + j] = ((R2.elements[i * 3] * R1.elements[j]) + (R2.elements[(i * 3) + 1] * R1.elements[3 + j])) + (R2.elements[(i * 3) + 2] * R1.elements[6 + j]);
        }
    }
    return matrixx;

Kinect SDK によって提供される 4x4 マトリックスを変換するにはどうすればよいですか?

より具体的には、各軸のスライダーを使用できるように、各軸の 4x4 マトリックスを変換できますか? では、X 軸に 10 度の回転を適用するにはどうすればよいでしょうか。次のように、3x3 マトリックスで回転が行われるのを見てきました。

    public static Matrix3D NewRotateAroundX(double radians)
    {
        var matrix = new Matrix3D();
        matrix._matrix[1, 1] = Math.Cos(radians);
        matrix._matrix[1, 2] = Math.Sin(radians);
        matrix._matrix[2, 1] = -(Math.Sin(radians));
        matrix._matrix[2, 2] = Math.Cos(radians);
        return matrix;
    }
    public static Matrix3D NewRotateAroundY(double radians)
    {
        var matrix = new Matrix3D();
        matrix._matrix[0, 0] = Math.Cos(radians);
        matrix._matrix[0, 2] = -(Math.Sin(radians));
        matrix._matrix[2, 0] = Math.Sin(radians);
        matrix._matrix[2, 2] = Math.Cos(radians);
        return matrix;
    }
    public static Matrix3D NewRotateAroundZ(double radians)
    {
        var matrix = new Matrix3D();
        matrix._matrix[0, 0] = Math.Cos(radians);
        matrix._matrix[0, 1] = Math.Sin(radians);
        matrix._matrix[1, 0] = -(Math.Sin(radians));
        matrix._matrix[1, 1] = Math.Cos(radians);
        return matrix;
    }

事前に助けてくれてありがとう!

4

1 に答える 1