【问题标题】:Check if arms are raised Zigfu and Unity3D检查手臂是否抬起 Zigfu 和 Unity3D
【发布时间】:2013-02-11 04:18:02
【问题描述】:

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

【问题讨论】:

  • 没有在 Unity3D 中使用 Zigfu,但我认为它在后台使用 OpenNI/NITE,并且在 NITE 中定义了“举起手臂”手势

标签: unity3d kinect


【解决方案1】:

我不熟悉Zigfu,但如果还没有后端机制来测试这个事实(正如George Profenza 在 cmets 中指出的那样),那么您可以轻松推出自己的测试来测试这个条件。

每个 Kinect API(官方或第 3 方)都有骨骼关节的分解。 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 秒,则满足条件,您可以执行您想要的操作。

【讨论】:

    【解决方案2】:

    简单来说,只需检查 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");
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      相关资源
      最近更新 更多