检查手臂是否被抬起Zigfu和Unity3D

时间:2013-02-11 04:18:02

标签: unity3d kinect

在Unity3D中使用Zigfu,如何检查手臂是否被抬起?

2 个答案:

答案 0 :(得分:3)

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

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

Kinect Skeleton Joints

您可以测试一个关节相对于另一个关节位置的位置,看看是否满足您的“手臂抬起”状态。

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

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秒钟,则会满足条件并且您可以执行您想要的操作。

答案 1 :(得分:1)

它的sipmle,Just chek ZigSkeleton文件。

在ZigSkeleton文件中,创建一个varialbe来存储肩膀的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");

}