Unity3DでZigfuを使用して、腕が上がっているかどうかを確認するにはどうすればよいですか?
2 に答える
私はZigfuに慣れていませんが、この事実をテストするためのバックエンドメカニズムがまだない場合 ( George Profenzaがコメントで指摘しているように)、この条件をテストする独自のテストを簡単に展開できます。
各 Kinect API (公式またはサード パーティ) には、スケルトンのジョイントの内訳があります。公式APIでは骨格を以下の関節に分解していますが、 NITEも骨格を同じ関節に分解していると思います。
ある関節の位置を別の関節の位置に対してテストして、「腕を上げた」条件が満たされているかどうかを確認できます。
たとえば、プレーヤーの肘が肩より上にあるかどうかを簡単に確認できます。
private void OnSkeletonFrameReady()
{
if ((JointId[ElbowRight].Y > JointId[ShoulderRight].Y) &&
(JointId[ElbowLeft].Y > JointId[ShoulderLeft].Y)
{
// arms have been raised
}
}
これは明らかに疑似コードであり、Zigfu API 参照に更新する必要があります。
(既に定義されている可能性のあるものを使用するのではなく) 独自のロールを作成する利点は、「腕を上げた」とはどういう意味かを決定できることです。
- 手だけが肩より上にある必要がありますか?
- 肘が肩より上にある必要がありますか?
- 手は関節
HipCenter
またはSpine
関節の上にあればよいですか? - 腕を伸ばす必要がありますか、それとも肘を曲げることができますか?
他のすべてのもの (およびそれ以上) は、「腕を上げた」と定義できます。ジョイントの構成をテストして、それらが正しいかどうかを判断できます。
プレーヤーが状態を認識する前に一定時間「腕を上げた」状態を維持したい場合は、ジェスチャー チェックにタイマーを追加するだけです。疑似コードの例は次のとおりです。
DispatherTimer _gestureTimer = new DispatcherTimer();
_gestureTimer.Interval = TimeSpan.FromSeconds(5);
_gestureTimer.Tick += OnGestureTimerTick();
bool _armsRaisedFlag = false;
private void OnSkeletonFrameReady()
{
if ((JointId[ElbowRight].Y > JointId[ShoulderRight].Y) &&
(JointId[ElbowLeft].Y > JointId[ShoulderLeft].Y)
{
_argsRaisedFlag = true;
_gestureTimer.Start();
}
else
{
_armsRaisedFlag = false;
_gestureTimer.Stop();
}
}
private void OnGestureTimerTick()
{
_gestureTimer.Stop();
if (_armsRaisedFlag == true)
{
// player's arms have been raised long enough for gesture to pass
}
}
この場合、「腕を上げる」条件が満たされるたびに、フラグが設定され、タイマーが開始されます。プレーヤーが腕を上げた状態を 5 秒間維持すると、条件が満たされ、必要なアクションを実行できます。
簡単に言えば、ZigSkeleton ファイルをチェックするだけです。
ZigSkeleton ファイルで、肩の ID を格納するための変数を作成します。
public int TrackedLeftArm = (int)ZigJointId.LeftArm;
UpdateRotation 関数では、
Quaternion newRotation = transform.rotation * orientation * initialRotations[(int)joint];
今すぐチェック
if((int)joint==TrackedLeftArm)
{
if(newRotation.x> DesiredANgle)
Debug.Log("Hands raised");
}