在 Unity3D 中使用Zigfu,如何检查手臂是否抬起?
问问题
1693 次
2 回答
3
我对Zigfu不熟悉,但如果还没有后端机制来测试这一事实(正如George Profenza在评论中指出的那样),那么您可以轻松推出自己的测试来测试这种情况。
每个 Kinect API(官方或第 3 方)都有骨骼关节的分解。官方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 秒钟,则满足条件,您可以执行您想要的操作。
于 2013-02-11T18:26:59.577 回答
1
它的简单,只需检查 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");
}
于 2013-06-30T05:50:57.863 回答