在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参考。
自己动手(相对于使用可能已经定义的东西)的优势在于,您可以决定“举起手臂”的含义。
只是手需要在肩膀上方吗?
肘部的双手都需要在肩膀上方吗?
双手是否只需要在
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秒钟,则满足条件,您可以执行所需的操作。