在Unity3D中使用Zigfu,如何检查双臂是否举起?

最佳答案

我不熟悉Zigfu,但是如果还没有后端机制可以测试此事实(如George Profenza在评论中指出),那么您可以轻松地进行自己的测试来测试这种情况。

每个Kinect API(官方或第三方)都有针对骨骼的关节分解。 official API将骨骼分解为以下关节,我相信NITE将骨骼分解为相同的关节。



您可以将一个关节的位置与另一关节的位置进行测试,以查看您的“举起手臂”条件是否得到满足。

例如,您可以简单地检查玩家的肘部是否位于其肩膀上方:

private void OnSkeletonFrameReady()
{
    if ((JointId[ElbowRight].Y > JointId[ShoulderRight].Y) &&
        (JointId[ElbowLeft].Y > JointId[ShoulderLeft].Y)
    {
        // arms have been raised
    }
}


这显然是伪代码,需要将其更新为Zigfu API参考。

自己动手(相对于使用可能已经定义的东西)的优势在于,您可以决定“举起手臂”的含义。


只是手需要在肩膀上方吗?
肘部的双手都需要在肩膀上方吗?
双手是否只需要在HipCenterSpine关节上方?
必须伸展手臂,还是可以弯曲肘部?


所有其他(以及更多)那些都可以定义为“举起手臂”。可以测试关节的配置以确定它们是否正确。

如果您想确保玩家在识别状态之前将其“手臂抬起”一段时间,则只需在手势检查中添加一个计时器即可。伪代码示例为:

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秒钟,则满足条件,您可以执行所需的操作。

10-05 23:12