現在利用できる kinect はありませんが、これにどのように取り組むかについての理論は次のとおりです。
最初に、すでにさまざまなジョイント座標にアクセスできるように見えるので、次のような sth があります。
if (body.IsTracked)
{
Joint spineMid = body.Joints[JointType.SpineMid];
float x = spineMid.Position.X;
float y = spineMid.Position.Y;
float z = spineMid.Position.Z;
}
これにより、x、y、z の spinMid ポイントが得られます。各フレームで、spineMid ポイントを最後のフレームの spinMid ポイントと比較します (その後、次のフレームでの比較のために保存します)。これらのポイントをP_newおよびP_oldと呼びましょう。方向ベクトルを取得するには、次のように 2 つを減算します。
p_dir = P_new - P_old
ここで、この方向ベクトルと、kinect 座標系で <0,0,1> である kinect のベクトル "out" の間の角度を取得する必要があります。ただし、図面を考えると、z_dir = <0,0,-1> を使用する必要があります。p_dirの単位ベクトルを使用して、それをp_dir_unitと呼びましょう。内積を使用してz_dirとp_dir_unitの間の角度を取得できます。
theta = acos( z_dir * p_dir_unit )
x、z 平面の方向のみが必要な場合は、p_dirの y 値を 0 に設定し、そのベクトルから単位ベクトルを取得できます。p_dirの絶対的な長さから、ボディの動きの速さに関する情報も取得できます。
それが役立つことを願っています。